如何从Bitbucket获取Pull Request ID并传入TeamCity的Bash脚本
自动获取Pull Request ID并传入TeamCity中的Bash脚本
我来帮你搞定这个问题!其实不用发愁TeamCity API的限制,我们有两种可靠的方案来自动获取当前分支的PR ID,不用手动传入参数:
方案一:利用TeamCity内置参数(推荐)
TeamCity在触发PR相关的构建时,会自动生成一系列内置环境变量,直接就能拿到PR ID,完全不用额外脚本。不同版本控制系统(VCS)对应的变量名略有不同:
- 如果你用的是Bitbucket:
TEAMCITY_PULLREQUEST_ID - 如果你用的是GitHub:
TEAMCITY_GITHUB_PULLREQUEST_NUMBER - 其他VCS可以在TeamCity的「构建参数」页面查看自动生成的参数(搜索
pullRequest相关的关键词)
修改方法:
直接在TeamCity的构建步骤中,调用脚本时传入这个参数:
./your-script.sh %teamcity.pullRequest.id%(注意这里用TeamCity的参数语法
%参数名%,会自动替换成对应的值)或者更省事的是,直接在你的Bash脚本里读取环境变量,把原来的
$1替换成${TEAMCITY_PULLREQUEST_ID},这样脚本在TeamCity环境中会自动获取到值。
方案二:通过Bash脚本从Git refs中提取PR ID
如果因为某些原因无法使用TeamCity的内置参数,我们可以直接从Git远程仓库的refs中找到当前分支对应的PR ID(以Bitbucket为例,PR的refs格式是refs/pull-requests/<ID>/from):
编写获取PR ID的函数
在你的脚本里加入这段逻辑,自动检测当前分支对应的PR ID:
get_pr_id() { # 获取当前分支的最新提交SHA local current_sha=$(git rev-parse HEAD) # 从远程仓库查找对应SHA的PR ref local pr_ref=$(git ls-remote origin refs/pull-requests/*/from | grep "$current_sha" | awk '{print $2}') if [[ -n "$pr_ref" ]]; then # 从ref路径中提取PR ID数字 echo "$pr_ref" | sed 's/refs\/pull-requests\/\([0-9]*\)\/from/\1/' else echo "Error: 未找到当前分支对应的Pull Request ID" >&2 exit 1 fi }
修改你的现有脚本
把原来手动传入的$1替换成函数调用的结果,同时注意你原来脚本里的两个小错误(Dsonar前面少了-,已经修正):
#!/bin/bash # 获取PR ID PR_ID=$(get_pr_id) branch=$(git symbolic-ref --short HEAD) repository="${PWD##*/}" # 执行Sonar扫描,传入自动获取的PR ID mvn sonar:sonar \ -Dsonar.projectKey="$repository" \ -Dsonar.analysis.mode=issues \ -Dsonar.stash.comments.reset \ -Dsonar.stash.notification=true \ -Dsonar.stash.project=datasmurfen-repos \ -Dsonar.stash.repository="$repository" \ -Dsonar.stash.pullrequest.id="$PR_ID" \ -Dsonar.stash.password.variable=SONAR_STASH_PASSWORD
方案三:混合方案(优先用TeamCity参数, fallback到Git方法)
为了让脚本更健壮,可以结合两种方案:优先读取TeamCity的环境变量,如果没拿到再用Git方法提取:
#!/bin/bash # 优先从TeamCity环境变量获取PR ID PR_ID=${TEAMCITY_PULLREQUEST_ID:-} # 如果TeamCity变量不存在,尝试从Git refs获取 if [[ -z "$PR_ID" ]]; then current_sha=$(git rev-parse HEAD) pr_ref=$(git ls-remote origin refs/pull-requests/*/from | grep "$current_sha" | awk '{print $2}') if [[ -n "$pr_ref" ]]; then PR_ID=$(echo "$pr_ref" | sed 's/refs\/pull-requests\/\([0-9]*\)\/from/\1/') else echo "Error: 无法获取Pull Request ID" >&2 exit 1 fi fi branch=$(git symbolic-ref --short HEAD) repository="${PWD##*/}" mvn sonar:sonar \ -Dsonar.projectKey="$repository" \ -Dsonar.analysis.mode=issues \ -Dsonar.stash.comments.reset \ -Dsonar.stash.notification=true \ -Dsonar.stash.project=datasmurfen-repos \ -Dsonar.stash.repository="$repository" \ -Dsonar.stash.pullrequest.id="$PR_ID" \ -Dsonar.stash.password.variable=SONAR_STASH_PASSWORD
这样不管是在TeamCity环境还是本地终端运行,脚本都能自动获取到PR ID啦!
内容的提问来源于stack exchange,提问作者datasmurfen
相关产品推荐
相关产品推荐

