Azure Devops提供了两个变量,其中包含有关当前git分支名称的信息:$(Build.SourceBranchName)
和$(Build.SourceBranch)
。
尽管SourceBranch
包含对分支的完整引用,但是SourceBranchName
仅包含简短的分支名称。
不幸的是,当分支名称包含斜杠(/
)时,该行为有点意外:
+---------------------------------------------------------------------------------------------------------+
| Situation | Git branch name | Build.SourceBranch | Build.SourceBranchName |
|---------------------------------------------------------------------------------------------------------|
| branch name contains no slash | mybranch | refs/heads/mybranch | mybranch |
| branch name contains slash | release/mybranch | refs/heads/release/mybranch | mybranch |
+---------------------------------------------------------------------------------------------------------+
斜杠前的分支名称部分不被视为分支名称的一部分。我的同事指出,这是documented behavior of Azure Devops:
Git仓库分支或请求请求:引用中的最后一个路径段。例如,在refs / heads / master中,此值为master。在refs / heads / feature / tools中,此值为工具。
我不确定这种行为是否特别有用:我想检出分支,并需要将分支名称 include 放在斜杠上。另外,如果将斜杠前的部分去掉,则实际路径可能会造成混淆,因为名称可能不明确。
我需要分支名称包括斜杠。有没有简单的方法可以得到它?为了安全起见,我是否总是需要使用完整的裁判?
答案 0 :(得分:6)
我总是在脚本中使用Build.SourceBranch
。只需将其分配给新变量,然后从一开始就删除refs/heads/
。我只用于CI和PR:
Build.SourceBranch
变量而不使用refs/heads
。我使用PowerShell:$ branchSource =“ $(Build.SourceBranch)”
$ branchSourcePath = $ branchSource-替换“ refs / heads /”,“”
System.PullRequest.SourceBranch
变量而不使用refs/heads
,因为Build.SourceBranch
包含远程PR的路径。替换与第一个选项相同,只是使用了正确的变量。$ branchSource =“ $(System.PullRequest.SourceBranch)”
$ branchSourcePath = $ branchSource-替换“ refs / heads /”,“”
答案 1 :(得分:4)
在PR上构建时,可以使用System.PullRequest.SourceBranch
和System.PullRequest.TargetBranch
变量。
System.PullRequest.TargetBranch
作为拉取请求目标的分支。例如:
refs/heads/master
。仅当构建时才初始化此变量 由于Git PR受分支机构政策的影响而运行。
Use Predefined Build Variables
此外,如果要使用完整路径或短路径,还可以根据需要定义自己的变量。
只需创建一个bash脚本,即可将较短的分支名称分配给变量。
# Bash script
BRANCH_NAME=$(echo "$(System.PullRequest.TargetBranch)" | awk -F/ '{print $NF}')
echo "##vso[task.setvariable variable=PullRequest_Target_Branch;]$BRANCH_NAME"
然后,您可以稍后在管道中引用$(PullRequest_Target_Branch)。