pipeline { agent any parameters { // ── 版本升级策略 ───────────────────────────────────────────────────── 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)') // 要构建并发布的模块(勾选即发布) 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') } 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, ] 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() def versionArgs = [] def publishedVersions = [] for (mod in modules) { def propName = "SDK_${mod.replace('sdk-', '').toUpperCase()}_VERSION" def currentVer = getProp(propName) ?: getProp('PUBLISH_VERSION') ?: '0.1.0' def newVer = bumpVersion(currentVer) setProp(propName, newVer) versionArgs.add("-P${propName}=${newVer}") publishedVersions.add("${mod}: ${currentVer} → ${newVer}") echo "${mod} version: ${currentVer} → ${newVer}" } 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() def moduleTasks = modules.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') { 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 构建失败" } } }