如何在成功构建后自动创建构建管道标签(不是 GIT 标签)?
How to automatically create a Build Pipeline TAG (not a GIT TAG) after a successful build?
到目前为止的故事:
- 当我有一个要部署的提交时,我创建了一个 GIT TAG 作为构建的基础,例如“RC1”
- 创建 GIT TAG 会自动触发 PipeLine Build 开始。
- 成功完成 PipeLine 构建后,它会在源代码提交上创建一个新的 GIT 标签,并带有 BuildNumber_BuildId 以便稍后进行交叉引用。
- 我还有一个发布管道,然后用于部署(我喜欢分离),我想过滤 Build TAG = "RC*"
- 我可以手动创建 Build TAG,但是....
这就是需要帮助的地方。
几天来,我一直在寻找一种自动创建 PipeLine Build TAG 的方法,并且只找到我已有的答案。如果它是 YAML 中的 step/task 或构建管道中的设置,我可能不会。如果有人能指出正确的方向,我将不胜感激。
最终目标是在构建成功时将原始源 GIT TAG 推送到构建 TAG。
注意:我只在 YAML 中工作,Azure Devops 版本 Dev18.M170.1 自带任何设置,即没有插件。
当然可以。构建成功后可以使用API“Tags - Add Build Tag”添加标签
如果要同时为构建成功添加多个标签,可以使用API "Tags - Add Build Tags".
下面是为成功构建添加标签的演示。您可以参考它并在构建管道中设置相关步骤。
对于经典构建管道:
在构建作业的设置页面上启用选项“允许脚本访问 OAuth 令牌”。
添加一个 PowerShell 任务作为构建作业的最后一个。
- Select "运行此任务只有在之前的所有任务都成功时才执行"
- 将以下脚本添加到任务中。将
{organization}
、{project}
和{tag}
替换为您想要的实际组织、项目和标签。
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer $env:SYSTEM_ACCESSTOKEN")
$headers.Add("Content-Type", "application/json")
$uri = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/$(Build.BuildId)/tags/{tag}?api-version=6.0"
Invoke-RestMethod -Uri $uri -Headers $headers -Method PUT
对于 YAML 构建管道:
添加一个 PowerShell 任务作为构建作业的最后一个,如下所示。将{organization}
、{project}
和{tag}
替换为您想要的实际组织、项目和标签。
jobs:
- job: build
displayName: 'Build job'
. . .
steps:
. . .
- task: PowerShell@2
displayName: 'Add Build Tag'
condition: succeeded() # Only when all previous tasks have succeeded
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
targetType: inline
script: |
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer $env:SYSTEM_ACCESSTOKEN")
$headers.Add("Content-Type", "application/json")
$uri = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/$(Build.BuildId)/tags/{tag}?api-version=6.0"
Invoke-RestMethod -Uri $uri -Headers $headers -Method PUT
结果:
如果仍处于构建阶段,您可以轻松地从脚本 运行 或 PowerShell(write-host 而不是 echo)任务中执行以下命令:
echo ##vso[build.addbuildtag]My Tag
在 Yaml 中,最简单的语法是:
- script: echo ##vso[build.addbuildtag]My Tag
或者对于 PowerShell,您可以使用短语法:
steps:
- powershell: |
$newSourceBranch = "$(Build.SourceBranch)" -replace 'refs/tags/', ''
$Command = "##vso[build.addbuildtag]"+$newSourceBranch
write-host "Create a Build TAG called $newSourceBranch"
write-host $Command
到目前为止的故事:
- 当我有一个要部署的提交时,我创建了一个 GIT TAG 作为构建的基础,例如“RC1”
- 创建 GIT TAG 会自动触发 PipeLine Build 开始。
- 成功完成 PipeLine 构建后,它会在源代码提交上创建一个新的 GIT 标签,并带有 BuildNumber_BuildId 以便稍后进行交叉引用。
- 我还有一个发布管道,然后用于部署(我喜欢分离),我想过滤 Build TAG = "RC*"
- 我可以手动创建 Build TAG,但是....
这就是需要帮助的地方。
几天来,我一直在寻找一种自动创建 PipeLine Build TAG 的方法,并且只找到我已有的答案。如果它是 YAML 中的 step/task 或构建管道中的设置,我可能不会。如果有人能指出正确的方向,我将不胜感激。
最终目标是在构建成功时将原始源 GIT TAG 推送到构建 TAG。
注意:我只在 YAML 中工作,Azure Devops 版本 Dev18.M170.1 自带任何设置,即没有插件。
当然可以。构建成功后可以使用API“Tags - Add Build Tag”添加标签
如果要同时为构建成功添加多个标签,可以使用API "Tags - Add Build Tags".
下面是为成功构建添加标签的演示。您可以参考它并在构建管道中设置相关步骤。
对于经典构建管道:
在构建作业的设置页面上启用选项“允许脚本访问 OAuth 令牌”。
添加一个 PowerShell 任务作为构建作业的最后一个。
- Select "运行此任务只有在之前的所有任务都成功时才执行"
- 将以下脚本添加到任务中。将
{organization}
、{project}
和{tag}
替换为您想要的实际组织、项目和标签。
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $env:SYSTEM_ACCESSTOKEN") $headers.Add("Content-Type", "application/json") $uri = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/$(Build.BuildId)/tags/{tag}?api-version=6.0" Invoke-RestMethod -Uri $uri -Headers $headers -Method PUT
对于 YAML 构建管道:
添加一个 PowerShell 任务作为构建作业的最后一个,如下所示。将{organization}
、{project}
和{tag}
替换为您想要的实际组织、项目和标签。
jobs:
- job: build
displayName: 'Build job'
. . .
steps:
. . .
- task: PowerShell@2
displayName: 'Add Build Tag'
condition: succeeded() # Only when all previous tasks have succeeded
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
targetType: inline
script: |
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer $env:SYSTEM_ACCESSTOKEN")
$headers.Add("Content-Type", "application/json")
$uri = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/$(Build.BuildId)/tags/{tag}?api-version=6.0"
Invoke-RestMethod -Uri $uri -Headers $headers -Method PUT
结果:
如果仍处于构建阶段,您可以轻松地从脚本 运行 或 PowerShell(write-host 而不是 echo)任务中执行以下命令:
echo ##vso[build.addbuildtag]My Tag
在 Yaml 中,最简单的语法是:
- script: echo ##vso[build.addbuildtag]My Tag
或者对于 PowerShell,您可以使用短语法:
steps:
- powershell: |
$newSourceBranch = "$(Build.SourceBranch)" -replace 'refs/tags/', ''
$Command = "##vso[build.addbuildtag]"+$newSourceBranch
write-host "Create a Build TAG called $newSourceBranch"
write-host $Command