- 新增 MOD_BUGCOLLECT_PLUGIN 参数用于控制插件发布 - 配置环境变量映射以支持插件模块 - 实现版本属性共享机制,插件与 bugcollect 模块共用版本号 - 优化版本发布逻辑,支持多模块统一版本管理 - 区分构建任务,插件模块无需执行 assembleRelease 任务 - 添加构建流程控制,避免空模块构建报错
183 行
8.7 KiB
Groovy
183 行
8.7 KiB
Groovy
pipeline {
|
||
agent any
|
||
|
||
parameters {
|
||
// ── 发布模式 ─────────────────────────────────────────────────────────
|
||
booleanParam(name: 'SNAPSHOT', defaultValue: true,
|
||
description: '勾选=发布 SNAPSHOT 版本(追加 -SNAPSHOT 后缀,不修改 gradle.properties,不 commit);不勾选=正式 Release(升级版本号并 commit)')
|
||
|
||
// ── 版本升级策略(仅正式 Release 时生效)────────────────────────────
|
||
choice(name: 'VERSION_BUMP', choices: ['patch', 'minor', 'major'],
|
||
description: '版本升级策略: major(1.0.0→2.0.0), minor(1.0.0→1.1.0), patch(1.0.0→1.0.1)(SNAPSHOT 模式下忽略)')
|
||
|
||
// 要构建并发布的模块(勾选即发布)
|
||
booleanParam(name: 'MOD_CORE', defaultValue: false, description: '发布 sdk-core')
|
||
booleanParam(name: 'MOD_IM', defaultValue: false, description: '发布 sdk-im')
|
||
booleanParam(name: 'MOD_PUSH', defaultValue: false, description: '发布 sdk-push')
|
||
booleanParam(name: 'MOD_UPDATE', defaultValue: false, description: '发布 sdk-update')
|
||
booleanParam(name: 'MOD_WEBVIEW', defaultValue: false, description: '发布 sdk-webview')
|
||
booleanParam(name: 'MOD_LICENSE', defaultValue: false, description: '发布 sdk-license')
|
||
booleanParam(name: 'MOD_BUGCOLLECT', defaultValue: false, description: '发布 sdk-bugcollect')
|
||
booleanParam(name: 'MOD_BUGCOLLECT_PLUGIN', defaultValue: false, description: '发布 sdk-bugcollect-plugin (Gradle 插件)')
|
||
}
|
||
|
||
environment {
|
||
NEXUS_CREDS = credentials('NEXUS_CREDS')
|
||
}
|
||
|
||
stages {
|
||
stage('Checkout') {
|
||
steps {
|
||
checkout([
|
||
$class: 'GitSCM',
|
||
branches: [[name: 'main']],
|
||
extensions: [[$class: 'CleanBeforeCheckout']],
|
||
userRemoteConfigs: scm.userRemoteConfigs
|
||
])
|
||
script {
|
||
def moduleChecks = [
|
||
'sdk-core': params.MOD_CORE,
|
||
'sdk-im': params.MOD_IM,
|
||
'sdk-push': params.MOD_PUSH,
|
||
'sdk-update': params.MOD_UPDATE,
|
||
'sdk-webview': params.MOD_WEBVIEW,
|
||
'sdk-license': params.MOD_LICENSE,
|
||
'sdk-bugcollect': params.MOD_BUGCOLLECT,
|
||
'sdk-bugcollect-plugin': params.MOD_BUGCOLLECT_PLUGIN,
|
||
]
|
||
def resolved = moduleChecks.findAll { k, v -> v }.collect { k, v -> k }
|
||
if (resolved.isEmpty()) {
|
||
error("没有选择任何模块,请至少勾选一个")
|
||
}
|
||
env.PUBLISH_MODULES = resolved.join(',')
|
||
echo "Modules: ${env.PUBLISH_MODULES}"
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Resolve Versions') {
|
||
steps {
|
||
script {
|
||
def bumpVersion = { String ver ->
|
||
def parts = ver.tokenize('.')
|
||
while (parts.size() < 3) { parts.add('0') }
|
||
def major = parts[0].toInteger()
|
||
def minor = parts[1].toInteger()
|
||
def patch = parts[2].toInteger()
|
||
|
||
if (params.VERSION_BUMP == 'major') { major++; minor = 0; patch = 0 }
|
||
else if (params.VERSION_BUMP == 'minor') { minor++; patch = 0 }
|
||
else { patch++ }
|
||
|
||
return "${major}.${minor}.${patch}"
|
||
}
|
||
|
||
def propsText = readFile('gradle.properties')
|
||
def getProp = { String key ->
|
||
def line = propsText.readLines().find { it.trim().startsWith("${key}=") }
|
||
return line ? line.split('=', 2)[1].trim() : null
|
||
}
|
||
def setProp = { String key, String value ->
|
||
def pattern = /(?m)^${key}=.*/
|
||
if (propsText =~ pattern) {
|
||
propsText = propsText.replaceAll(pattern, "${key}=${value}")
|
||
} else {
|
||
propsText = propsText.trim() + "\n${key}=${value}\n"
|
||
}
|
||
}
|
||
|
||
def modules = env.PUBLISH_MODULES.split(',').toList()
|
||
// sdk-bugcollect-plugin 与 sdk-bugcollect 共享 SDK_BUGCOLLECT_VERSION
|
||
def propNameByModule = modules.collectEntries { mod ->
|
||
def propName = mod == 'sdk-bugcollect-plugin' ? 'SDK_BUGCOLLECT_VERSION' : "SDK_${mod.replace('sdk-', '').toUpperCase()}_VERSION"
|
||
[mod, propName]
|
||
}
|
||
def uniquePropNames = propNameByModule.values().toUnique()
|
||
|
||
def versionArgs = []
|
||
def publishedVersions = []
|
||
|
||
for (propName in uniquePropNames) {
|
||
def currentVer = getProp(propName) ?: getProp('PUBLISH_VERSION') ?: '0.1.0'
|
||
// 去掉已有的 -SNAPSHOT 后缀,取基础版本号
|
||
def baseVer = currentVer.replaceAll(/-SNAPSHOT$/, '')
|
||
def newVer
|
||
|
||
if (params.SNAPSHOT) {
|
||
// SNAPSHOT:基础版本 + -SNAPSHOT,不写回 gradle.properties
|
||
newVer = baseVer + '-SNAPSHOT'
|
||
echo "SNAPSHOT: ${propName} → ${newVer}"
|
||
} else {
|
||
// Release:升级版本号,写回 gradle.properties
|
||
newVer = bumpVersion(baseVer)
|
||
setProp(propName, newVer)
|
||
echo "Release: ${propName}: ${currentVer} → ${newVer}"
|
||
}
|
||
|
||
versionArgs.add("-P${propName}=${newVer}")
|
||
def moduleNames = propNameByModule.findAll { it.value == propName }.collect { it.key }.join(',')
|
||
publishedVersions.add("${moduleNames}: ${currentVer} → ${newVer}")
|
||
}
|
||
|
||
if (!params.SNAPSHOT) {
|
||
writeFile(file: 'gradle.properties', text: propsText)
|
||
}
|
||
env.VERSION_ARGS = versionArgs.join(' ')
|
||
env.PUBLISHED_VERSIONS = publishedVersions.join('\n')
|
||
echo "VERSION_ARGS: ${env.VERSION_ARGS}"
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Build AARs') {
|
||
steps {
|
||
script {
|
||
def modules = env.PUBLISH_MODULES.split(',').toList()
|
||
// sdk-bugcollect-plugin 是 JVM Gradle 插件,没有 assembleRelease 任务
|
||
def aarModules = modules.findAll { it != 'sdk-bugcollect-plugin' }
|
||
if (aarModules.isEmpty()) {
|
||
echo "没有 AAR 模块需要构建"
|
||
} else {
|
||
def moduleTasks = aarModules.collect { ":${it}:assembleRelease" }.join(' ')
|
||
bat "gradlew.bat ${moduleTasks} ${env.VERSION_ARGS} --no-daemon"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Publish to Nexus') {
|
||
steps {
|
||
script {
|
||
def modules = env.PUBLISH_MODULES.split(',').toList()
|
||
def publishTasks = modules.collect { ":${it}:publish" }.join(' ')
|
||
def credArgs = "-PNEXUS_USER=%NEXUS_CREDS_USR% -PNEXUS_PASSWORD=%NEXUS_CREDS_PSW%"
|
||
bat "gradlew.bat ${publishTasks} ${env.VERSION_ARGS} ${credArgs} --no-daemon"
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Commit Version Bump') {
|
||
when { expression { !params.SNAPSHOT } }
|
||
steps {
|
||
script {
|
||
bat """
|
||
git config user.email "jenkins@xuqm.com"
|
||
git config user.name "Jenkins CI"
|
||
git add gradle.properties
|
||
git diff --cached --quiet || git commit -m "ci: bump module versions [${env.PUBLISH_MODULES}]"
|
||
git push origin HEAD:main
|
||
"""
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success {
|
||
echo "Android SDK 构建成功"
|
||
echo "发布版本:\n${env.PUBLISHED_VERSIONS}"
|
||
}
|
||
failure { echo "Android SDK 构建失败" }
|
||
}
|
||
}
|