如何在YAML流水线中获取待构建代码所在的资源分支名称?
根据你的场景(非PR触发,Build.SourceBranchName返回YAML文件所在分支),分以下几种情况解决:
场景1:流水线引用了外部资源仓库(待构建代码在另一个仓库/分支)
如果你的流水线YAML存储在仓库A,而待构建代码来自仓库B的指定分支(比如development),可以通过资源仓库的预定义变量获取分支名:
方法1:直接读取资源仓库的ref变量
Azure DevOps为资源仓库提供了预定义变量resources.repositories.<仓库别名>.ref,它会返回资源仓库的完整引用路径(比如refs/heads/development)。你可以通过脚本截取分支名:
- Bash示例:
# 截取分支名,去掉refs/heads/前缀 TARGET_BRANCH=$(echo $(resources.repositories.CodeRepo.ref) | sed 's/refs\/heads\///') echo "待构建代码分支:$TARGET_BRANCH"
- PowerShell示例:
$targetBranch = "$(resources.repositories.CodeRepo.ref)" -replace 'refs/heads/', '' Write-Host "待构建代码分支:$targetBranch"
注:这里的CodeRepo是你在resources.repositories中定义的仓库别名。
方法2:变量化配置分支名
如果待构建分支是固定的,建议在YAML中显式定义变量,避免重复配置:
variables: # 定义待构建代码的分支名 TargetCodeBranch: 'development' resources: repositories: - repository: CodeRepo type: git name: MyProject/CodeRepo ref: $(TargetCodeBranch) steps: - script: echo "待构建代码分支:$(TargetCodeBranch)"
场景2:同仓库下,YAML来自固定分支但触发构建其他分支
如果你的流水线配置为从固定分支加载YAML(比如main),但实际触发构建的是同仓库的另一个分支(比如development),可以通过以下方式获取触发分支:
方法1:修改流水线YAML加载策略
在Azure DevOps流水线编辑页面,点击右上角的... → Triggers → 切换到YAML标签页,将“使用来自特定分支/标签的YAML”改为与触发分支相同。修改后,Build.SourceBranchName就会返回待构建代码的分支名(即触发分支)。
方法2:通过构建API获取原始触发分支
如果无法修改YAML加载策略,可以调用Azure DevOps的构建API获取触发分支:
$buildId = "$(Build.BuildId)" $orgUrl = "$(System.TeamFoundationCollectionUri)" $project = "$(System.TeamProject)" $accessToken = "$(System.AccessToken)" $authHeader = @{ Authorization = "Bearer $accessToken" } $buildDetails = Invoke-RestMethod -Uri "$orgUrl$project/_apis/build/builds/$buildId?api-version=7.1-preview.7" -Headers $authHeader # 截取分支名 $targetBranch = $buildDetails.sourceBranch -replace 'refs/heads/', '' Write-Host "待构建代码分支:$targetBranch"
注:需要确保流水线的服务账号有读取构建信息的权限。
场景3:确认Build.SourceBranchName的实际含义
如果你的YAML和待构建代码在同一个分支,那Build.SourceBranchName默认就会返回待构建代码的分支名。如果它返回的是其他分支名,大概率是你的流水线配置了从其他分支加载YAML文件,参考场景2的方法1修改即可。
内容的提问来源于stack exchange,提问作者HelloWorld

