Jenkins多分支Pipeline集成Bitbucket:PR构建env.BRANCH_NAME取值异常求方案
解决Jenkins多分支Pipeline对接Bitbucket时PR构建BRANCH_NAME异常的问题
我之前刚好碰到过一模一样的问题!当时在做PR自动构建时,也发现env.BRANCH_NAME返回的是PR编号而非特性分支名,导致后续推送分支的步骤直接失败,折腾了好一阵才找到几个可行的解决办法,分享给你:
1. 使用Jenkins内置的PR专属环境变量(最推荐)
Jenkins针对Bitbucket的PR构建,其实提供了专门的环境变量来获取源分支和目标分支信息,完全可以替代BRANCH_NAME:
env.CHANGE_BRANCH:直接返回PR对应的特性分支名称(比如feature/test-branch)env.CHANGE_TARGET:返回PR的目标分支名称(比如main或develop)
你只需要在Pipeline代码里做个简单的判断,兼容普通分支构建和PR构建的场景:
// 优先使用CHANGE_BRANCH(PR场景),否则用BRANCH_NAME(普通分支场景) def workingBranch = env.CHANGE_BRANCH ?: env.BRANCH_NAME // 后续推送分支的逻辑改用workingBranch sh "git push origin ${workingBranch}"
这个方法最省心,而且是Jenkins官方支持的方式,只要你的Bitbucket插件版本不是特别老旧,都能正常使用。
2. 调整Jenkins多分支项目的PR命名配置
如果你更希望保持BRANCH_NAME返回特性分支名,可以尝试修改Jenkins多分支项目的分支源配置:
- 进入你的Jenkins多分支项目配置页面,找到「分支源」下的Bitbucket配置
- 查找「Pull Request Strategy」或类似的选项,有些新版本的插件允许设置PR的显示名称格式,选择「使用源分支名称」而非PR编号
- 保存配置后重新扫描分支,PR构建的
BRANCH_NAME应该就会返回特性分支名了
不过这个方法依赖插件版本,有些旧版本可能没有这个选项,所以还是第一种方法更通用。
3. 手动调用Bitbucket API获取源分支名(备选方案)
如果上面两种方法都不适用(比如插件版本过旧),可以通过调用Bitbucket的REST API来解析PR对应的源分支名。不过这个方法需要配置凭据,而且依赖外部调用,优先级最低:
// 从BRANCH_NAME中提取PR编号 def prNumber = env.BRANCH_NAME.replace('PR-', '') // 替换成你的Bitbucket项目和仓库信息 def bitbucketApiUrl = "https://your-bitbucket-instance/rest/api/1.0/projects/你的项目key/repos/你的仓库名/pull-requests/${prNumber}" // 调用API获取PR信息(需要提前在Jenkins配置BITBUCKET_CRED凭据) def prResponse = sh( script: "curl -s -u \${BITBUCKET_CRED} ${bitbucketApiUrl}", returnStdout: true ) // 解析JSON获取源分支名 def sourceBranch = new groovy.json.JsonSlurper().parseText(prResponse).fromRef.displayId // 后续使用sourceBranch进行推送操作
额外注意点
- 可以在Pipeline里添加
sh 'printenv'或者echo env.getEnvironment()的步骤,打印所有可用的环境变量,确认CHANGE_BRANCH等变量是否存在 - 建议把Jenkins的Bitbucket插件升级到最新版本,避免旧版本的兼容性问题
内容的提问来源于stack exchange,提问作者YaOg
相关产品推荐
相关产品推荐

