在完成时从 Azure Devops Build Pipeline 设置 Git 标签

Bre*_*ett 14 gitversion azure-devops azure-pipelines

我正在尝试使用由 GitVersion 在成功构建结束时的 GIT 提交确定的当前版本号设置标签。感觉我不能成为第一个这样做的人,但我正在努力寻找有用的东西。

Azure Devops Pipeline 在成功时获取源以“标记源”中有一项功能。我已经设置了它并设置为由我拥有的代理任务之一设置的变量(GitVersion)

标签来源

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

2019-12-06T20:54:20.2390794Z ##[debug]Processed: ##vso[task.setvariable variable=GitVersion.MajorMinorPatch;]2.98.0
Run Code Online (Sandbox Code Playgroud)

但是,如果我就这样保留它,我会得到一个创建为“v$(GitVersion.MajorMinorPatch)”的标记,这意味着在创建标记时该变量不再存在。

标签格式帮助工具提示说

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

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

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

在此处输入图片说明

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

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

我真的很感激对此的任何想法。

Pau*_*her 24

如果是做yaml管道,可以添加以下步骤

- checkout: self
  persistCredentials: true

## Rest of pipeline ##

- script: |
     git tag $(GitVersion.NugetVersionV2)
     git push origin $(GitVersion.NugetVersionV2)
  workingDirectory: $(Build.SourcesDirectory)
Run Code Online (Sandbox Code Playgroud)

所述persistCredentials允许标记被自动传递到其他的git命令。注意 的分配workingDirectory,否则我有一个错误,该位置不是 git 存储库。

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

- script: |
     git tag -a <tagname> -m <message>
Run Code Online (Sandbox Code Playgroud)

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

- script: |
    git config --global user.name "BuildService"
    git config --global user.email "autobuild@fabrikam.com"
    git tag -a <tagname> -m <message>
Run Code Online (Sandbox Code Playgroud)

为此,需要为项目集合构建服务器 帐户(而不是项目构建服务帐户 )分配对存储库的贡献权限

  • 对于那些想知道如何配置项目集合构建服务器帐户的人,可以在“项目设置”&gt;“存储库”&gt;“存储库”下找到该帐户。当您单击存储库时,您应该在列出的用户下找到该帐户。 (5认同)
  • @sommmen如果您查看/sf/ask/262159481/,它提到 -follow-tags 只推送带注释的标签,而不是轻量级的,所以既然所述答案有效对于两者来说,我认为不需要改变 (2认同)
  • 我必须使用 `git push origin &lt;tagname&gt; HEAD:origin/$(Build.SourceBranchName)` 因为我处于无头状态。 (2认同)

Mer*_*SFT 3

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

GitVersion.MajorMinorPatch从日志中看到的变量是一个步骤级变量,这意味着它的生命周期仅从当前GitVersion任务开始。

在此输入图像描述

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


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

在此输入图像描述

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

v$(Build.BuildNumber)

在此输入图像描述

这是我的结果:

在此输入图像描述


更新:

GitVersion.MajorMinorPatch要将任务生成的变量添加GitVersionVariables中,请将以下脚本应用到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)}
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,我仍然不认为可以$(GitVersion.MajorMinorPatch)Tag format.

仍然强烈建议你打电话$(Build.BuildNumber)标记$(GitVersion.MajorMinorPatch)价值


归档时间:

查看次数:

12930 次

最近记录:

4 年,8 月 前