【问题标题】:How to automatically create a Build Pipeline TAG (not a GIT TAG) after a successful build?成功构建后如何自动创建构建管道标签(不是 GIT 标签)?
【发布时间】:2021-11-08 22:22:53
【问题描述】:

到目前为止的故事:

  • 当我有一个想要部署的提交时,我会创建一个 GIT TAG 以作为构建的基础,例如“RC1”
  • GIT TAG 的创建会自动触发 PipeLine Build 开始。
  • 成功完成 PipeLine Build 后,它会在源提交上创建一个新的 GIT TAG,并使用 BuildNumber_BuildId 稍后进行交叉引用。
  • 我还有一个发布管道,然后用于执行部署(我喜欢分离),我想过滤 Build TAG = "RC*"
  • 我可以手动创建构建标签,但是....

这是需要帮助的地方。

几天来,我一直在寻找一种自动创建 PipeLine Build TAG 的方法,并且只找到我已有的答案。如果它是 YAML 中的步骤/任务或构建管道中的设置,我可能不会。如果有人能指出我正确的方向,我将不胜感激。

如果构建成功,最终目标是将原始源 GIT TAG 推送到 Build TAG 中。

注意:我只在 YAML 中工作,并且任何设置都来自 Azure Devops 版本 Dev18.M170.1,即没有插件。

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    如果仍处于构建阶段,您可以轻松地从脚本、bash 或 PowerShell(写入主机而不是回显)任务中运行以下命令:

    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
    

    【讨论】:

    • 感谢您的解决方案。这导致我最终拥有: - task: PowerShell@2 displayName: 'Add Build Tag' condition: succeeded() # 仅当所有先前的任务都成功时 env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) 输入:targetType:内联脚本: | $newSourceBranch = "$(Build.SourceBranch)" -replace 'refs/tags/', '' $Command = "##vso[build.addbuildtag]"+$newSourceBranch write-host "创建一个名为 $newSourceBranch 的构建标签"写主机 $Command
    • 你甚至不需要访问令牌!
    • 而且成功的条件也可以去掉,这是默认的。
    【解决方案2】:

    当然。构建成功后可以使用API​​“Tags - Add Build Tag”添加标签。

    如果你想同时为成功构建添加多个标签,可以使用API​​“Tags - Add Build Tags”。

    以下是为成功构建添加标签的演示。您可以参考它并在构建管道中设置相关步骤。

    对于经典构建管道:

    1. 在构建作业的设置页面上启用“允许脚本访问 OAuth 令牌”选项。

    2. 添加一个 PowerShell 任务作为构建作业的最后一项。

      • 选择“仅在之前的所有任务都成功后运行此任务
      • 将以下脚本添加到任务中。将 {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
    

    结果:

    【讨论】:

    • 非常感谢您提供的非常有帮助和有见地的回答,涵盖了 Classic 和 Yaml 管道。目前,我在本地 DevOps 上,URL 似乎与您为 dev.azure.com 显示的内容大不相同因为我仍在实际管道构建中,当我添加 TAG 时,我选择了“#最后#vso[build.addbuildtag]"+$newSourceBranch"。
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2019-01-27
    • 2020-04-11
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多