20

我正在尝试使用 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)”的标签,这意味着在创建标签时该变量不再存在。

标签格式帮助工具提示说

“标签格式可以是范围为“全部”的用户定义或预定义变量的组合。例如:'$(Build.DefinitionName) $(Build.DefinitionVersion) $(Build.BuildId) $(Build .BuildNumber) $(My.Variable)'"

所以我想问题是在管道期间创建的这个变量没有All的范围。

然后我尝试将管道变量添加到“GitVersion.MajorMinorPatch”的管道中,希望这是在正确的范围内,并希望当“task.setvariable”命令运行时,这将设置这个更高的变量值范围变量。

在此处输入图像描述

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

所以我有点卡住了。不知何故,我需要能够在 ALL 范围内动态创建或设置一个变量,其中包含我想在此处标记的值。

我将非常感谢您对此的任何想法。

4

4 回答 4

33

如果是做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 存储库。

对于带注释的标签而不是轻量级标签,语法看起来像这样......

- script: |
     git tag -a <tagname> -m <message>

要获取用户/日期,您还需要设置用户名/电子邮件,例如

- 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 )分配 Repositories 的 Contribute 权限

在此处输入图像描述

于 2020-03-21T13:04:11.593 回答
3

我可以在调试日志中看到,这个变量是由我添加到管道的 GitVersion 组件设置的。

GitVersion.MajorMinorPatch你从日志中看到的变量是一个阶梯级变量,也就是说它的生命周期只是从当前GitVersion任务开始。

在此处输入图像描述

正如您所指的定义,它的范围必须是所有人。这意味着它必须是一个全局变量。例如,系统默认具有的预定义变量,以及在“变量”选项卡中指定的自定义变量。


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

在此处输入图像描述

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

v$(Build.BuildNumber)

在此处输入图像描述

这是我的结果:

在此处输入图像描述


更新:

要将任务GitVersion.MajorMinorPatch生成的内容添加到变量中,请将以下脚本应用到PowerShell任务中:GitVersion

$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)

于 2019-12-08T10:28:49.883 回答
2
- 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'
于 2021-05-20T15:25:13.337 回答
1

扩展 Paul Hatcher 的出色回答,我想补充一点,该帐户是Project Collection Build Service在 Azure DevOps Server 2019 中调用的。这似乎也符合当前的Microsoft 文档

对不起,我的名声还不足以评论。

于 2020-08-20T14:13:15.803 回答