You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bitbucket取消三方合并后,Jenkins拉取PR的替代方案咨询

替代Bitbucket三方合并拉取PR的可行方案

方案1:本地合并PR源分支与目标分支

既然Bitbucket不再提供远程合并提交,可在Jenkins节点本地完成PR源分支与目标分支的合并,模拟原三方合并效果,适合需要验证合并后代码的场景:

  1. 拉取PR的源分支和目标分支
  2. 切换到目标分支并合并源分支(可按需处理冲突)
  3. 基于合并后的代码执行构建

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:21:11