迁移构建系统至Jenkins:基于变更列表的构建号配置问题咨询
我之前帮团队搞定过几乎一模一样的Jenkins版本号适配需求,给你几个落地性强的方案,完全能覆盖你的场景:
核心思路
不用硬改Jenkins默认的递增编号逻辑(毕竟很多插件依赖这个数字),而是自定义版本号并替换Jenkins界面显示名称,同时把版本号注入到构建流程中,既满足你的命名规则,又不破坏Jenkins的内部机制。
具体实现步骤
1. 先获取关键参数:变更列表(CL)和分支名
根据你用的版本控制系统,用Shell命令捕获changelist编号和分支名:
- 如果是Git(短哈希作为CL标识):
# 获取短变更哈希 git rev-parse --short HEAD # 获取当前分支名 git rev-parse --abbrev-ref HEAD - 如果是SVN(修订号作为CL标识):
# 获取SVN修订号 svn info | grep Revision | awk '{print $2}' # 获取当前分支路径的最后一段作为分支名 svn info | grep URL | awk -F/ '{print $NF}'
2. 在Pipeline中生成对应版本号
推荐用Jenkins Pipeline实现,灵活可控。下面是完整的示例脚本,支持区分CI构建和正式构建:
pipeline { agent any // 可选:添加构建参数,让用户触发时选择是否为正式构建 parameters { booleanParam(name: 'IS_RELEASE_BUILD', defaultValue: false, description: '勾选则生成正式构建版本号') } stages { stage('生成版本号') { steps { script { // 1. 获取变更列表(CL)编号 def clNumber = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() // 2. 获取分支名(多分支Pipeline也可以直接用env.BRANCH_NAME) def branchName = sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim() // 3. 根据构建类型生成对应版本号 if (params.IS_RELEASE_BUILD) { // 正式构建:日期-CL-分支 def buildDate = sh(returnStdout: true, script: 'date +%Y%m%d').trim() env.BUILD_VERSION = "${buildDate}-${clNumber}-${branchName}" } else { // CI构建:CI-CL-分支 env.BUILD_VERSION = "CI-${clNumber}-${branchName}" } // 4. 替换Jenkins界面显示的构建名称 currentBuild.displayName = env.BUILD_VERSION // 可选:把版本号写入文件,方便后续步骤读取 writeFile file: 'BUILD_VERSION.txt', text: env.BUILD_VERSION } } } stage('执行构建') { steps { echo "当前构建版本:${env.BUILD_VERSION}" // 这里替换成你的实际构建命令,比如Maven/Gradle打包 // sh "mvn clean package -Dproject.version=${env.BUILD_VERSION}" // sh "./gradlew build -Pversion=${env.BUILD_VERSION}" } } } }
3. 关键细节说明
- 版本号传递:生成的
BUILD_VERSION是环境变量,可在所有后续构建步骤中直接引用 - 界面显示:
currentBuild.displayName会把Jenkins构建列表里的数字编号替换成你的自定义版本号,方便识别 - 日期格式:可以根据需求修改
date命令的参数,比如date +%Y-%m-%d生成2024-05-20格式 - 兼容性:保留了Jenkins默认的
BUILD_NUMBER(数字),避免依赖该参数的插件出错
替代方案:用插件简化操作
如果不想写Pipeline脚本,可以试试Build Name and Description Setter Plugin:
- 安装插件后,在构建步骤中添加"Set build name"操作
- 用变量引用的方式拼接版本号,比如:
- CI构建:
CI-${GIT_COMMIT_SHORT}-${GIT_BRANCH} - 正式构建:
${BUILD_DATE,format="yyyyMMdd"}-${GIT_COMMIT_SHORT}-${GIT_BRANCH}
- CI构建:
- 注意:需要确保插件能正确获取到Git/SVN的相关变量
内容的提问来源于stack exchange,提问作者Dubl1n
相关产品推荐
相关产品推荐

