Bitbucket取消三方合并后,Jenkins拉取PR的替代方案咨询
替代Bitbucket三方合并拉取PR的可行方案
方案1:本地合并PR源分支与目标分支
既然Bitbucket不再提供远程合并提交,可在Jenkins节点本地完成PR源分支与目标分支的合并,模拟原三方合并效果,适合需要验证合并后代码的场景:
- 拉取PR的源分支和目标分支
- 切换到目标分支并合并源分支(可按需处理冲突)
- 基于合并后的代码执行构建
修改后的Jenkins代码示例:
if (isPR(config.BRANCH)) { echo 'In PR type commit' PR_ID=parsePRId(config.BRANCH) // 从webhook payload或Bitbucket API获取PR的源分支、目标分支 SOURCE_BRANCH = getPRSourceBranch(PR_ID) TARGET_BRANCH = getPRTargetBranch(PR_ID) // 拉取分支 sh "git fetch origin $SOURCE_BRANCH" sh "git fetch origin $TARGET_BRANCH" // 切换到目标分支并合并源分支 sh "git checkout -f origin/$TARGET_BRANCH" try { sh "git merge --no-ff origin/$SOURCE_BRANCH" result.targetCommitId = sh(returnStdout: true, script: "git rev-parse HEAD").trim() result.targetCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short HEAD").trim() } catch (Exception err) { echo 'Merge conflict occurred, build aborted' result.targetCommitId = null result.targetCommitIdShort = null throw err } // 记录源分支commit信息 result.fromCommitId = sh(returnStdout: true, script: "git rev-parse origin/$SOURCE_BRANCH").trim() result.fromCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short origin/$SOURCE_BRANCH").trim() } else { echo 'Non PR type commit' TARGET_COMMIT=config.BRANCH FROM_COMMIT=config.BRANCH sh "git fetch origin $FROM_COMMIT" result.branch = config.BRANCH result.fromCommitId = sh(returnStdout: true, script: "git rev-parse FETCH_HEAD").trim() result.fromCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short FETCH_HEAD").trim() try { sh """ git fetch origin $TARGET_COMMIT && \ git checkout -f FETCH_HEAD """ result.targetCommitId = sh(returnStdout: true, script: "git rev-parse FETCH_HEAD").trim(); result.targetCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short FETCH_HEAD").trim(); } catch (Exception err) { result.targetCommitId = null result.targetCommitIdShort = null } }
方案2:直接拉取PR源分支快照
Bitbucket会为PR提供指向源分支最新提交的快照引用(refs/pull-requests/<PR_ID>/head),可直接拉取该引用进行构建,适合无需验证合并效果、仅需检查PR代码本身的场景:
if (isPR(config.BRANCH)) { echo 'In PR type commit' PR_ID=parsePRId(config.BRANCH) SOURCE_REF="refs/pull-requests/$PR_ID/head" sh "git fetch origin $SOURCE_REF" result.fromCommitId = sh(returnStdout: true, script: "git rev-parse FETCH_HEAD").trim() result.fromCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short FETCH_HEAD").trim() try { sh "git checkout -f FETCH_HEAD" result.targetCommitId = result.fromCommitId result.targetCommitIdShort = result.fromCommitIdShort } catch (Exception err) { result.targetCommitId = null result.targetCommitIdShort = null } } else { // 保留原非PR分支处理逻辑 echo 'Non PR type commit' TARGET_COMMIT=config.BRANCH FROM_COMMIT=config.BRANCH sh "git fetch origin $FROM_COMMIT" result.branch = config.BRANCH result.fromCommitId = sh(returnStdout: true, script: "git rev-parse FETCH_HEAD").trim() result.fromCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short FETCH_HEAD").trim() try { sh """ git fetch origin $TARGET_COMMIT && \ git checkout -f FETCH_HEAD """ result.targetCommitId = sh(returnStdout: true, script: "git rev-parse FETCH_HEAD").trim(); result.targetCommitIdShort = sh(returnStdout: true, script: "git rev-parse --short FETCH_HEAD").trim(); } catch (Exception err) { result.targetCommitId = null result.targetCommitIdShort = null } }
方案3:使用Jenkins Bitbucket插件内置能力
如果你的Jenkins已集成Bitbucket插件,可直接利用插件的PR处理逻辑,无需手动编写git命令:
- 源码管理选择「Bitbucket Team/Project」
- 配置PR触发规则(如新PR创建、PR更新时触发)
- 插件会自动拉取PR代码(支持模拟合并到目标分支的版本),构建步骤直接使用工作区代码即可
该方案无需维护自定义git逻辑,自动适配Bitbucket的API变化,是最省心的选择。
内容的提问来源于stack exchange,提问作者callback
相关产品推荐
相关产品推荐

