在完成时从Azure Devops构建管道设置Git标记

时间:2019-12-07 12:39:24

标签: azure-devops azure-pipelines gitversion

我试图在成功构建结束时使用GitVersion在GIT提交上设置具有当前版本号的标签。感觉我不可能成为第一个这样做的人,但是我正在努力寻找可行的方法。

Azure Devops Pipeline具有“成功获取源代码以标记源”功能。我已经将此设置并设置为由我拥有的代理任务之一(GitVersion)设置的变量

Tag Sources

我可以在调试日志中看到,该变量是由我添加到管道中的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”命令时,它将设置变量值更高范围的变量。

enter image description here

但是在这种情况下,我只是创建了一个标签“ v”。

所以我有点卡住了。我需要以某种方式能够在动态范围ALL上动态创建或设置一个变量,该变量具有我要在此处标记的值。

我真的很感谢任何想法。

4 个答案:

答案 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任务开始。

enter image description here

作为您所引用的定义,它的作用域必须是所有人。这意味着必须是一个全局变量。例如,系统默认具有的预定义变量以及在变量标签中指定的自定义变量。


实际上,基于GitVersion task的编译和工作逻辑,GitVersion.MajorMinorPatch值已生成并存储为当前版本的build number

enter image description here

因此,最方便的将GitVersion.MajorMinorPatch值标记为存储库的方法是使用 $(Build.BuildNumber)

v$(Build.BuildNumber)

enter image description here

这是我的结果:

enter image description here


更新

要将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'