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

如何从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相关的关键词)

修改方法:

  1. 直接在TeamCity的构建步骤中,调用脚本时传入这个参数:

    ./your-script.sh %teamcity.pullRequest.id%
    

    (注意这里用TeamCity的参数语法%参数名%,会自动替换成对应的值)

  2. 或者更省事的是,直接在你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:59