我试图在成功构建结束时使用GitVersion在GIT提交上设置具有当前版本号的标签。感觉我不可能成为第一个这样做的人,但是我正在努力寻找可行的方法。
Azure Devops Pipeline具有“成功获取源代码以标记源”功能。我已经将此设置并设置为由我拥有的代理任务之一(GitVersion)设置的变量
我可以在调试日志中看到,该变量是由我添加到管道中的GitVersion组件设置的。
2019-12-06T20:54:20.2390794Z ##[debug]Processed: ##vso[task.setvariable variable=GitVersion.MajorMinorPatch;]2.98.0
但是,如果我只保留它,则会得到一个创建为“ v $(GitVersion.MajorMinorPatch)”的标签,这意味着在创建标签时该变量不再存在。
标签格式帮助工具提示
“标记格式可以是范围为“ All”的用户定义或预定义变量的组合。例如:'$(Build.DefinitionName) $(Build.DefinitionVersion) $(Build.BuildId) $(Build.BuildNumber) $(My.Variable)'“
所以我想问题是在管道期间创建的此变量没有All范围。
然后,我尝试将管道变量添加到“ GitVersion.MajorMinorPatch”的管道中,希望这是在正确的范围内,并希望在运行“ task.setvariable”命令时,它将设置变量值更高范围的变量。
但是在这种情况下,我只是创建了一个标签“ v”。
所以我有点卡住了。我需要以某种方式能够在动态范围ALL上动态创建或设置一个变量,该变量具有我要在此处标记的值。
我真的很感谢任何想法。
答案 0 :(得分:14)
如果您正在执行yaml管道,则可以添加以下步骤
- checkout: self
persistCredentials: true
## Rest of pipeline ##
- script: |
git tag $(GitVersion.NugetVersionV2)
git push origin $(GitVersion.NugetVersionV2)
workingDirectory: $(Build.SourcesDirectory)
persistCredentials
允许令牌自动传递给其他git命令。请注意workingDirectory
的分配,否则我将收到一个错误消息,该位置不是git存储库。
对于annotated tag而不是轻量级标签,语法应如下所示……
- script: |
git tag -a <tagname> -m <message>
要针对该用户/日期,还需要set the user name/email,例如
- script: |
git config --global user.name "BuildService"
git config --global user.email "autobuild@fabrikam.com"
git tag -a <tagname> -m <message>
要使用此功能,请使用 Project Collection Build Server 帐户(而不是 Project Build Service Accounts 组 )需要分配存储库的“贡献”权限
答案 1 :(得分:0)
我可以在调试日志中看到该变量已由 我已添加到管道中的GitVersion组件。
您从日志中看到的变量GitVersion.MajorMinorPatch
是 step-level 变量,这意味着其生命周期仅从当前的GitVersion
任务开始。
作为您所引用的定义,它的作用域必须是所有人。这意味着必须是一个全局变量。例如,系统默认具有的预定义变量以及在变量标签中指定的自定义变量。
实际上,基于GitVersion task
的编译和工作逻辑,GitVersion.MajorMinorPatch
值已生成并存储为当前版本的build number
:
因此,最方便的将GitVersion.MajorMinorPatch
值标记为存储库的方法是使用 $(Build.BuildNumber):
v$(Build.BuildNumber)
这是我的结果:
更新:
要将GitVersion.MajorMinorPatch
任务生成的GitVersion
添加到 Variabls 中,请在以下脚本中将其应用到 powershell 任务中:
$connectionToken="{PAT Token}"
$urlget = "https://dev.azure.com/{org}/{project}/_apis/build/definitions/$(System.DefinitionId)?api-version=5.1"
$base64AuthInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
$getdef = Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET -ContentType application/json -Uri $urlget
Write-Host Pipeline = $($getdef | ConvertTo-Json -Depth 100)
$bvalue=@"
{
"value": "$(GitVersion.MajorMinorPatch)"
}
"@
$getdef.variables | add-member -Name "GitVersion.MajorMinorPatch" -value (Convertfrom-Json $bvalue) -MemberType NoteProperty -Force -PassThru
$getdef = $getdef | ConvertTo-Json -Depth 100
$getdef | clip
$urlput = "https://dev.azure.com/{org}/{project}/_apis/build/definitions/$(System.DefinitionId)?api-version=5.1"
$putdef = Invoke-RestMethod -Uri $urlput -Method PUT -Body $getdef -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
如前所述,我仍然认为无法在$(GitVersion.MajorMinorPatch)
中指定Tag format
。
仍然强烈建议您通过调用$(Build.BuildNumber)
标记$(GitVersion.MajorMinorPatch)
值
答案 2 :(得分:0)
根据Paul Hatcher的出色回答,我想补充一点,对我来说,该帐户在Azure DevOps Server 2019中被称为Project Collection Build Service
。这似乎也与当前的{{3} }。
很抱歉,我的声誉还不足以发表评论。
答案 3 :(得分:0)
- pwsh: |
# Construct PAT authentication header
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "user",$env:SYSTEM_ACCESSTOKEN)))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$url="$(System.CollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/annotatedtags?api-version=5.0-preview.1"
$body = @{name = "$(GitVersion.MajorMinorPatch)"
message = "automatically added"
taggedObject = @{
objectId = "$(Build.SourceVersion)"
}
} | ConvertTo-Json
Invoke-RestMethod -Uri $url -Headers $headers -Method Post -ContentType "application/json" -Body ($body)
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: 'Add tag'