在Azure DevOps中生成标签时如何获取分支名称?
Azure Pipeline中标签构建时获取对应分支名称的方法
问题场景
原本在Azure Pipeline中通过以下脚本获取分支名称:
- script: | echo "Original Source Branch: $(Build.SourceBranch)" BRANCH_NAME=${BUILD_SOURCEBRANCH#refs/heads/} echo "Branch Name: $BRANCH_NAME" displayName: 'Display source branch name'
但执行以下命令创建并推送标签后:
git tag -a v1.0.1 -m "Release version 1.0.1" git push origin v1.0.1
Pipeline中获取到的分支名称变为标签路径:
- Branch Name: refs/tags/v1.0.1
需要在标签触发的构建中,获取该标签对应的原始分支名称。
解决方案
可以通过git命令查询标签关联的提交,进而找到包含该提交的分支,以下是优化后的Pipeline脚本:
- script: | # 区分标签构建和分支构建 if [[ "$BUILD_SOURCEBRANCH" == refs/tags/* ]]; then # 提取标签名称 TAG_NAME=${BUILD_SOURCEBRANCH#refs/tags/} # 获取标签指向的提交哈希 COMMIT_HASH=$(git rev-parse "$TAG_NAME^{commit}") # 查询包含该提交的本地分支(排除HEAD引用) BRANCH_LIST=$(git branch --contains "$COMMIT_HASH" | grep -v HEAD | sed 's/^\* //') # 若存在多个分支,取第一个匹配项(可根据需求调整过滤规则) BRANCH_NAME=$(echo "$BRANCH_LIST" | head -n 1) else # 分支构建沿用原有逻辑 BRANCH_NAME=${BUILD_SOURCEBRANCH#refs/heads/} fi echo "最终获取的分支名称: $BRANCH_NAME" # 将分支名设置为Pipeline变量,供后续任务使用 echo "##vso[task.setvariable variable=TargetBranch]$BRANCH_NAME" displayName: '获取标签对应的分支名称'
注意事项
- 如果一个提交被多个分支包含,
git branch --contains会返回所有匹配分支,可根据项目规范添加过滤规则(比如只保留main、release/*分支),示例:BRANCH_NAME=$(echo "$BRANCH_LIST" | grep -E 'main|release/' | head -n 1) - 确保Pipeline的构建任务中已拉取完整的git历史(比如勾选"获取源版本"中的"获取所有历史记录、标签和分支"选项),否则可能无法查询到分支信息。
内容的提问来源于stack exchange,提问作者Mina
相关产品推荐
相关产品推荐

