XuqmGroup-AndroidSDK/Jenkinsfile
XuqmGroup 60a7064eb2 ci: support independent versioning per SDK module
- Add per-module version properties in gradle.properties
  (SDK_CORE_VERSION, SDK_LICENSE_VERSION, etc.)
- Jenkinsfile bumps only selected modules independently
- Print published module versions in post-build success step

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 04:23:07 +08:00

148 行
6.3 KiB
Groovy

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 构建失败" }
}
}