【问题标题】:Conditionally include the branch name in an Azure DevOps build name有条件地在 Azure DevOps 生成名称中包含分支名称
【发布时间】:2020-02-18 15:28:39
【问题描述】:

我正在使用 Azure DevOps 构建管道,但我希望更改构建的名称。根据documentation,这是完全可能的。

考虑到这一点,我测试了以下内容,效果很好。到目前为止一切顺利...

name: '1.0.$(Rev:r)-$(Build.SourceBranchName)'

1.0.1-master

但是,我的要求之一是排除分支名称(如果它是“master”),因此我尝试了以下操作。这似乎在第一个实例中起作用,因为“master”没有附加分支名称,但是当我运行功能分支时,我发现 $(Build.SourceBranchName) 没有被扩展。

variables:
  ${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
    branchName: ''
  ${{ if ne(variables['Build.SourceBranchName'], 'master') }}:
    branchName: '-$(Build.SourceBranchName)'

name: '1.0.$(Rev:r)$(branchName)'

我已经尝试了${{ variables.Build.SourceBranchName }}$[variables.Build.SourceBranchName],如documentation 中所述,但正如所写的那样,它们的令牌要么被忽略,要么返回一个空字符串。这三种格式给我留下了以下构建名称。

1.0.1-$(Build.SourceBranchName)
1.0.1-
1.0.1-$[variables.Build.SourceBranchName]

自定义命名周围的documentation 提到了变量$(SourceBranchName),但我已经尝试过了,它也失败了。

我感到困惑的是variables:段中的表达式可以访问变量值as described here,但似乎variables:段本身不能。

是否可以有条件地命名构建,以便我可以根据需要包含/排除分支名称?

【问题讨论】:

    标签: azure-devops expression


    【解决方案1】:

    问题在于您如何在解析时间表达式中引用 $(Build.SourceBranchName)。它在上下文中以该格式不可用。补充info here

    这对我有用!

    variables:
      system.debug: true
      ${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
        branchName: ''
      ${{ if ne( variables['Build.SourceBranchName'], 'master') }}:
        branchName: -${{ variables['Build.SourceBranchName'] }}
    
    name: '1.0.$(Rev:r)$(branchName)'
    

    Lance 的回答 ##vso[build.updatebuildnumber] 中的一些很好的附加信息可能是一个很好的路径,或者您可以使用 GitVersion。

    【讨论】:

    • 感谢您的回复。这确实有效,尽管我应该指出它没有记录在您链接的附加信息中(也在我的问题中引用)。关于您的回答,我注意到的一件事是缺少引号 - 添加它们会导致错误“无法读取隐式映射对”。
    • @DavidGard 你是对的,它不是很明确。我正在阅读这一页的字里行间。 docs.microsoft.com/en-us/azure/devops/pipelines/process/… "具有宏语法的变量在运行时处理....当系统遇到宏表达式时,会将表达式替换为变量的内容。如果没有该名称的变量,则留下宏表达式不变。例如,如果 $(var) 不能被替换,则 $(var) 不会被任何东西替换。"
    • 我的想法是,当您尝试使用 $(Build.SourceBranchName) 时,它是在编译时模板表达式(您的条件)上下文中使用的运行时宏表达式,因此在该评估上下文\点在时间(编译时),该运行时类型的宏表达式不可用。也许我把它复杂化了?
    • 您引用的另一个链接显示了在条件中引用变量的预期格式,这实际上是支付污垢。 docs.microsoft.com/en-us/azure/devops/pipelines/process/… 但从该页面上并不清楚,在您的情况下,您必须将它们包装在编译时语法 ${{ }} 中。
    • 起初我有点不屑一顾,因为文档似乎暗示我不能使用表达式作为键的值 - 很高兴我可以!希望随着时间的推移,MS 会稍微清理一下文档,因为其中很多用于 DevOps 的文档真的不是很好!
    【解决方案2】:

    是否可以有条件地命名构建,以便我可以 根据需要包含/排除分支名称?

    另一种解决方法是使用PowerShell task 更新内部版本号。检查this official document

    您可以使用类似:##vso[build.updatebuildnumber]my-new-build-number

    例子:

    name: 1.0.$(Rev:r)
    
    steps:
    
    - task: PowerShell@2
      condition: and(succeeded(), ne(variables['Build.SourceBranchName'], 'master'))
      inputs:
        targetType: 'inline'
        script: |
          $buildNumber = $Env:BUILD_BUILDNUMBER
          $revision= $buildNumber.Substring($buildNumber.LastIndexOf('.') + 1)
          Write-Host "##vso[build.updatebuildnumber]1.0.$revision-$(Build.SourceBranchName)"
    

    将此复制到您的 yaml,然后它可以满足您的上述要求。关于如何在任务中使用$(rev:r),得到this issue的提示,感谢Shayki Abramczyk

    希望以上所有帮助:)

    【讨论】:

    • 谢谢,但我不确定我是否想做这样的事情 - 更改构建名称(在 YAML 中肯定应该是 number,因为它无条件显示为带前导的“#”在 UI 中)应该不需要构建管道中的步骤。
    • 嗯,其实##vso[build.updatebuildnumber]my-new-build-number中的build number是指yaml中的名字。您可以通过在测试项目中运行我的脚本轻松检查这一点...
    • 我并不是说它不起作用,只是我不想添加一个额外的步骤来更改构建名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2021-10-29
    • 1970-01-01
    • 2013-10-29
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多