2026-05-09 14:53:42 +08:00
|
|
|
|
pipeline {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
agent any // jenkins.xuqinmin.com (Windows)
|
2026-05-09 14:53:42 +08:00
|
|
|
|
|
|
|
|
|
|
parameters {
|
2026-06-29 11:28:18 +08:00
|
|
|
|
booleanParam(name: 'SNAPSHOT', defaultValue: true,
|
2026-06-29 12:50:34 +08:00
|
|
|
|
description: '勾选=SNAPSHOT(推送 main,不升版本,不打 tag);不勾选=正式 Release(升版本、打 tag、创建 Gitea Release)')
|
2026-06-29 11:28:18 +08:00
|
|
|
|
choice(name: 'VERSION_BUMP', choices: ['patch', 'minor', 'major'],
|
2026-06-29 12:50:34 +08:00
|
|
|
|
description: '版本升级策略(Release 时有效): patch 1.0.0→1.0.1 / minor 1.0.0→1.1.0 / major 1.0.0→2.0.0')
|
2026-06-29 11:28:18 +08:00
|
|
|
|
booleanParam(name: 'MOD_CORE', defaultValue: false, description: '本次包含 XuqmCoreSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_IM', defaultValue: false, description: '本次包含 XuqmImSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_PUSH', defaultValue: false, description: '本次包含 XuqmPushSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_UPDATE', defaultValue: false, description: '本次包含 XuqmUpdateSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_LICENSE', defaultValue: false, description: '本次包含 XuqmLicenseSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_FILE', defaultValue: false, description: '本次包含 XuqmFileSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_WEBVIEW', defaultValue: false, description: '本次包含 XuqmWebViewSDK 改动')
|
|
|
|
|
|
booleanParam(name: 'MOD_BUGCOLLECT', defaultValue: false, description: '本次包含 XuqmBugCollectSDK 改动')
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
environment {
|
2026-06-29 11:28:18 +08:00
|
|
|
|
GITEA_REPO_URL = 'https://xuqinmin.com/xuqmGroup/XuqmGroup-iOSSDK.git'
|
|
|
|
|
|
GITEA_REPO_PATH = 'xuqmGroup/XuqmGroup-iOSSDK'
|
|
|
|
|
|
GITEA_API_BASE = 'https://xuqinmin.com/api/v1'
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
options {
|
|
|
|
|
|
disableConcurrentBuilds()
|
2026-06-29 12:50:34 +08:00
|
|
|
|
buildDiscarder(logRotator(numToKeepStr: '20'))
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
stages {
|
2026-06-29 11:28:18 +08:00
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
2026-05-09 14:53:42 +08:00
|
|
|
|
stage('Checkout') {
|
|
|
|
|
|
steps {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
checkout scm
|
|
|
|
|
|
bat 'git config user.email "jenkins@xuqm.com"'
|
|
|
|
|
|
bat 'git config user.name "Jenkins CI"'
|
2026-05-09 14:53:42 +08:00
|
|
|
|
script {
|
2026-05-23 01:28:43 +08:00
|
|
|
|
def moduleChecks = [
|
2026-06-29 11:28:18 +08:00
|
|
|
|
'XuqmCoreSDK': params.MOD_CORE,
|
|
|
|
|
|
'XuqmImSDK': params.MOD_IM,
|
|
|
|
|
|
'XuqmPushSDK': params.MOD_PUSH,
|
|
|
|
|
|
'XuqmUpdateSDK': params.MOD_UPDATE,
|
|
|
|
|
|
'XuqmLicenseSDK': params.MOD_LICENSE,
|
|
|
|
|
|
'XuqmFileSDK': params.MOD_FILE,
|
|
|
|
|
|
'XuqmWebViewSDK': params.MOD_WEBVIEW,
|
|
|
|
|
|
'XuqmBugCollectSDK': params.MOD_BUGCOLLECT,
|
2026-05-23 01:28:43 +08:00
|
|
|
|
]
|
2026-06-29 11:28:18 +08:00
|
|
|
|
def changed = moduleChecks.findAll { k, v -> v }.collect { k, v -> k }
|
|
|
|
|
|
if (changed.isEmpty()) {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
error('没有勾选任何模块,请至少标记一个有改动的模块')
|
2026-05-23 01:20:57 +08:00
|
|
|
|
}
|
2026-06-29 11:28:18 +08:00
|
|
|
|
env.CHANGED_MODULES = changed.join(', ')
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "改动模块: ${env.CHANGED_MODULES}"
|
2026-05-23 01:20:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-29 11:28:18 +08:00
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
stage('Resolve Version') {
|
2026-05-23 01:20:57 +08:00
|
|
|
|
steps {
|
|
|
|
|
|
script {
|
2026-06-29 11:28:18 +08:00
|
|
|
|
def propsText = readFile('version.properties')
|
2026-06-29 12:50:34 +08:00
|
|
|
|
def match = (propsText =~ /SDK_VERSION=(\d+)\.(\d+)\.(\d+)/)
|
|
|
|
|
|
if (!match) error('version.properties 中找不到 SDK_VERSION=x.y.z')
|
|
|
|
|
|
def major = match[0][1] as int
|
|
|
|
|
|
def minor = match[0][2] as int
|
|
|
|
|
|
def patch = match[0][3] as int
|
2026-06-29 11:28:18 +08:00
|
|
|
|
|
|
|
|
|
|
if (params.SNAPSHOT) {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
env.PUBLISH_VERSION = "${major}.${minor}.${patch}-SNAPSHOT"
|
2026-06-29 11:28:18 +08:00
|
|
|
|
env.RELEASE_TAG = ''
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "SNAPSHOT 模式 — 标记版本: ${env.PUBLISH_VERSION}"
|
2026-06-29 11:28:18 +08:00
|
|
|
|
} else {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
switch (params.VERSION_BUMP) {
|
|
|
|
|
|
case 'major': major++; minor = 0; patch = 0; break
|
|
|
|
|
|
case 'minor': minor++; patch = 0; break
|
|
|
|
|
|
default: patch++; break
|
|
|
|
|
|
}
|
|
|
|
|
|
env.RELEASE_TAG = "${major}.${minor}.${patch}"
|
|
|
|
|
|
env.PUBLISH_VERSION = env.RELEASE_TAG
|
|
|
|
|
|
def newProps = propsText.replaceAll(/SDK_VERSION=\d+\.\d+\.\d+/, "SDK_VERSION=${env.RELEASE_TAG}")
|
|
|
|
|
|
writeFile file: 'version.properties', text: newProps
|
|
|
|
|
|
echo "Release 模式 — 版本升级至 ${env.RELEASE_TAG}"
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
2026-06-29 12:50:34 +08:00
|
|
|
|
currentBuild.description = "${params.SNAPSHOT ? 'SNAPSHOT' : 'Release'} ${env.PUBLISH_VERSION} [${env.CHANGED_MODULES}]"
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-29 11:28:18 +08:00
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
2026-06-29 12:50:34 +08:00
|
|
|
|
// SNAPSHOT:只推代码到 main,不改版本文件,不打 tag
|
|
|
|
|
|
stage('SNAPSHOT: Push main') {
|
|
|
|
|
|
when { expression { params.SNAPSHOT } }
|
2026-06-29 11:28:18 +08:00
|
|
|
|
steps {
|
|
|
|
|
|
withCredentials([string(credentialsId: 'GITEA_TOKEN', variable: 'TOKEN')]) {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
bat "git push https://xuqinmin12:%TOKEN%@xuqinmin.com/xuqmGroup/XuqmGroup-iOSSDK.git HEAD:main"
|
2026-05-23 01:20:57 +08:00
|
|
|
|
}
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "SNAPSHOT 已推送到 main 分支"
|
|
|
|
|
|
echo "应用端 project.yml 保持 branch: main 即可自动获取最新代码"
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-29 11:28:18 +08:00
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
2026-06-29 12:50:34 +08:00
|
|
|
|
// Release:commit version.properties → 打 tag → 推送 commit + tag
|
|
|
|
|
|
stage('Release: Commit & Tag') {
|
|
|
|
|
|
when { expression { !params.SNAPSHOT } }
|
2026-05-09 14:53:42 +08:00
|
|
|
|
steps {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
bat "git add version.properties"
|
|
|
|
|
|
bat """git commit -m "ci: release %RELEASE_TAG% [%CHANGED_MODULES%]" """
|
|
|
|
|
|
bat "git tag %RELEASE_TAG%"
|
2026-06-29 11:28:18 +08:00
|
|
|
|
withCredentials([string(credentialsId: 'GITEA_TOKEN', variable: 'TOKEN')]) {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
bat "git push https://xuqinmin12:%TOKEN%@xuqinmin.com/xuqmGroup/XuqmGroup-iOSSDK.git HEAD:main"
|
|
|
|
|
|
bat "git push https://xuqinmin12:%TOKEN%@xuqinmin.com/xuqmGroup/XuqmGroup-iOSSDK.git %RELEASE_TAG%"
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-29 11:28:18 +08:00
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
2026-06-29 12:50:34 +08:00
|
|
|
|
// Release:在 Gitea 创建 Release 记录
|
|
|
|
|
|
stage('Release: Gitea Release') {
|
|
|
|
|
|
when { expression { !params.SNAPSHOT } }
|
2026-05-09 14:53:42 +08:00
|
|
|
|
steps {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
script {
|
|
|
|
|
|
def moduleList = env.CHANGED_MODULES.split(', ').collect { "- ${it}" }.join('\\n')
|
|
|
|
|
|
def bodyEscaped = "## 改动模块\\n${moduleList}\\n\\n## 集成方式\\n```yaml\\npackages:\\n XuqmGroupSDK:\\n url: ${env.GITEA_REPO_URL}\\n from: \\\"${env.RELEASE_TAG}\\\"\\n```"
|
|
|
|
|
|
def json = """{"tag_name":"${env.RELEASE_TAG}","name":"${env.RELEASE_TAG}","body":"${bodyEscaped}","draft":false,"prerelease":false}"""
|
|
|
|
|
|
writeFile file: 'release_payload.json', text: json
|
|
|
|
|
|
|
|
|
|
|
|
withCredentials([string(credentialsId: 'GITEA_TOKEN', variable: 'TOKEN')]) {
|
|
|
|
|
|
bat """curl -sf -X POST "${env.GITEA_API_BASE}/repos/${env.GITEA_REPO_PATH}/releases" -H "Authorization: token %TOKEN%" -H "Content-Type: application/json" -d @release_payload.json"""
|
2026-05-23 01:20:57 +08:00
|
|
|
|
}
|
2026-06-29 12:50:34 +08:00
|
|
|
|
bat 'del release_payload.json'
|
|
|
|
|
|
echo "Gitea Release ${env.RELEASE_TAG} 创建完成"
|
2026-05-23 01:20:57 +08:00
|
|
|
|
}
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
post {
|
|
|
|
|
|
success {
|
|
|
|
|
|
script {
|
2026-06-29 11:28:18 +08:00
|
|
|
|
if (params.SNAPSHOT) {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "SNAPSHOT ${env.PUBLISH_VERSION} 推送成功 — 改动模块: ${env.CHANGED_MODULES}"
|
2026-06-29 11:28:18 +08:00
|
|
|
|
} else {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "Release ${env.RELEASE_TAG} 发布成功 — 改动模块: ${env.CHANGED_MODULES}"
|
|
|
|
|
|
echo "应用端 project.yml 更新: from: \"${env.RELEASE_TAG}\""
|
2026-06-29 11:28:18 +08:00
|
|
|
|
}
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
failure {
|
2026-06-29 12:50:34 +08:00
|
|
|
|
echo "发布失败,请检查日志"
|
2026-05-09 14:53:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|