Jenkins中获取origin master与PR提交ID失败,求替代实现方案
问题:Bitbucket仓库提交ID获取失败的替代实现方式
问题描述
我在Groovy脚本中编写了以下代码,用于从Bitbucket仓库获取origin master的当前提交ID,以及当前Pull Request的最新提交ID:
TARGET_COMMIT=sh(returnStdout: true, script: "git rev-parse origin/master^{commit}").trim() SOURCE_COMMIT=sh(returnStdout: true, script: "git rev-parse pull-requests/" + env.BRANCH_NAME + "/from^{commit}").trim() COMMIT_RANGE="$TARGET_COMMIT...$SOURCE_COMMIT"
第一行代码在本地机器运行正常,但在Jenkins中执行失败,报错信息如下:
+ git rev-parse origin/master^{commit} fatal: ambiguous argument 'origin/master^{commit}': unknown revision or path not in the working tree.
将脚本改为git rev-parse upstream/master^{commit}后可在Jenkins中正常运行,但本地会出现相同错误。获取SOURCE_COMMIT的命令在本地和Jenkins中均执行失败。原本配置运行正常,推测是Bitbucket更新导致语法失效,寻求其他实现方式。
替代实现方案
一、兼容本地与Jenkins的TARGET_COMMIT获取方式
问题根源是本地和Jenkins的远程仓库命名不一致(本地为origin,Jenkins为upstream),可通过以下方式兼容:
- 动态检测远程仓库
先尝试获取upstream/master的提交ID,失败则 fallback 到origin/master:
def targetCommitCmd = "git rev-parse upstream/master^{commit} 2>/dev/null || git rev-parse origin/master^{commit}" TARGET_COMMIT=sh(returnStdout: true, script: targetCommitCmd).trim()
通过2>/dev/null屏蔽错误输出,确保命令在两种环境下都能正常执行。
- 简化git命令
如果不需要严格排除tag等非commit引用,可简化命令:
TARGET_COMMIT=sh(returnStdout: true, script: "git rev-parse origin/master").trim()
若要确保返回有效提交ID,可添加--verify参数:
TARGET_COMMIT=sh(returnStdout: true, script: "git rev-parse --verify origin/master").trim()
二、SOURCE_COMMIT的替代获取方式
Bitbucket的pull-requests/XX/from引用可能因版本更新被移除,推荐以下几种替代方案:
- 利用Jenkins Bitbucket插件环境变量
若Jenkins集成了Bitbucket插件,插件会自动注入PR相关环境变量,直接调用即可:
SOURCE_COMMIT=env.BITBUCKET_PR_SOURCE_COMMIT TARGET_COMMIT=env.BITBUCKET_PR_DESTINATION_COMMIT
常用相关变量还包括:
BITBUCKET_PR_ID:Pull Request编号BITBUCKET_PR_SOURCE_BRANCH:PR源分支名称BITBUCKET_PR_DESTINATION_BRANCH:PR目标分支名称
- 通过git命令直接获取
直接获取当前分支的最新提交ID,再结合目标分支生成提交范围:
# 获取源分支最新提交ID SOURCE_COMMIT=sh(returnStdout: true, script: "git rev-parse " + env.BRANCH_NAME).trim() # 生成提交范围 COMMIT_RANGE="${TARGET_COMMIT}...${SOURCE_COMMIT}"
如果需要获取PR的所有提交记录,可使用:
def commitList = sh(returnStdout: true, script: "git log --pretty=format:'%H' ${TARGET_COMMIT}.." + env.BRANCH_NAME).trim()
- 调用Bitbucket API获取
通过Groovy发送HTTP请求调用Bitbucket API,解析返回的JSON数据获取提交ID(需替换仓库信息与认证信息):
// 假设env.BRANCH_NAME格式为PR-XX,提取PR编号 def prId = env.BRANCH_NAME.replaceAll("PR-", "") def apiUrl = "https://你的Bitbucket地址/rest/api/1.0/projects/项目名/repos/仓库名/pull-requests/${prId}" // 用curl发起请求(需配置用户名密码或令牌) def response = sh(returnStdout: true, script: "curl -u 用户名:密码 ${apiUrl}") def jsonData = new groovy.json.JsonSlurper().parseText(response) SOURCE_COMMIT = jsonData.fromRef.latestCommit TARGET_COMMIT = jsonData.toRef.latestCommit
内容的提问来源于stack exchange,提问作者AngularDebutant
相关产品推荐
相关产品推荐

