如何在成功构建后自动创建一个构建流水线标签(不是GIT标签)?

11

故事简介:

  • 当我有一个想要部署的提交时,我会创建一个 GIT TAG 来基于构建,例如 "RC1"
  • GIT TAG 的创建自动触发 PipeLine 构建开始。
  • 在 PipeLine 构建成功完成后,它会在源提交上创建一个新的 GIT TAG,其中包含 BuildNumber_BuildId 以供以后交叉引用。
  • 我还有一个 Release Pipeline 用于进行部署(我喜欢分离),我希望过滤器为 Build TAG = "RC*"
  • 我可以手动创建 Build TAG,但是....

这就是需要帮助的地方。

我已经寻找了多天,想要自动创建 PipeLine 构建 TAG 的方法,但只找到了已经在使用的答案。 我不介意它是 YAML 中的步骤 / 任务还是 Build Pipeline 中的设置。 如果有人能指导我正确的方向,我将不胜感激。

最终目标是如果构建成功,则将原始源代码的 GIT TAG 推入 Build TAG。

备注:我仅在 YAML 中工作,并且使用 Azure Devops 版本 Dev18.M170.1 自带的任何设置,即没有插件。

2个回答

14
如果仍处于构建阶段,您可以通过从脚本、bash或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

1
感谢您的解决方案。这让我最终拥有了以下内容:
  • task: PowerShell@2 displayName: '添加构建标签' condition: succeeded() # 仅当所有先前的任务都成功时 env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) inputs: targetType: inline script: | $newSourceBranch = "$(Build.SourceBranch)" -replace 'refs/tags/', '' $Command = "##vso[build.addbuildtag]"+$newSourceBranch write-host "创建一个名为$newSourceBranch的构建标签" write-host $Command
- David
你甚至不需要访问令牌! - jessehouwing
而且成功的条件也可以省略,这是默认值。 - jessehouwing
2
脚本选项无法工作,因为YAML会将第一个井号后面的所有内容视为注释。我不得不将脚本移到下一行:- script: | <next line> echo ##vso [build.addbuildtag]My Tag. - zendu
1
关于上面的代码,有一个重要的注意事项。您需要确保addbuildtag]后面没有空格。如果在标签名称之前有空格,则不会对构建进行标记。 - Newteq Developer
显示剩余4条评论

9
当构建成功时,您可以使用API“Tags - Add Build Tag”添加标记。
如果您想同时将多个标记添加到成功的构建中,可以使用API“Tags - Add Build Tags”。
以下是向成功构建添加标记的演示。 您可以参考它并在构建流水线中设置相关步骤。
对于经典构建流水线:
  1. Enable the option "Allow scripts to access the OAuth token" on the settings page of the build job. enter image description here

  2. Add a PowerShell task as the last one of the build job.

    • Select "Run this task Only when all previous tasks have succeeded"
    • Add the following script to the task. Replace {organization}, {project} and {tag} with the actual organization, project and tag you want.
    $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
    

    enter image description here

对于 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

结果:

输入图片说明


1
非常感谢您提供的非常有帮助和深入的答案,涵盖了经典管道和Yaml管道。目前我正在使用本地DevOps,与您展示的https://dev.azure.com的URL似乎非常不同。由于我仍在实际的管道构建中,因此在添加TAG时,最终我选择了"##vso[build.addbuildtag]"+$newSourceBranch。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接