Devops YAML - 使用表达式设置构建名称

Devops YAML - set build name using expression

在 yaml 构建中,是否可以使用表达式设置构建名称;如果我可以将发布管道与实际构建 ID 匹配,那将是有利的。

示例:

trigger:  
- master

variables:  
    major: 2  
    minor: 3  
    offset: 2000  
    bid: $[$build.BuildID -as [int] + $offset]

name: "$(major).$(minor).$(bid)"

该示例因语法错误而无法运行。

您可以查看 MSDN 文档 Expressions 并且没有提供求和之类的数学运算。

更好的解决方法是退出偏移量:

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  major: 2  
  minor: 3  
  #offset: 2000  

name: $(major).$(minor).$(build.BuildID)

这将 return 你的名字,例如 2.3.101

您可以使用 UpdateBuildNumber command 将名称动态设置为 bash 或 PowerShell 脚本的一部分。

更多细节你可以看this blog post,但它的要点是这样的:

name: 'Set dynamically below in a task'

variables:  
    major: 2  
    minor: 3  
    offset: 2000

steps:
- task: PowerShell@2
  displayName: Set the name of the build (i.e. the Build.BuildNumber)
  inputs:
    targetType: 'inline'
    script: |
      [int] $buildIdWithOffset = ([int] $(Build.BuildId)) + ([int] $(offset))
      [string] $buildName = "$(major).$(minor).$buildIdWithOffset"
      Write-Host "Setting the name of the build to '$buildName'."
      Write-Host "##vso[build.updatebuildnumber]$buildName"

还有另一种不使用脚本设置内部版本号的方法。这种方法的优点是构建名称是从一开始就设置的,不像脚本在构建过程中更改原始名称。并且序列号生成更清晰(请参阅仅在管道的“名称”属性 中起作用的 $(Rev:r) 部分。

您必须使用“格式”表达式而不是 ($Variable) 语法,因为构建名称是在编译阶段创建的,此时 $(Variable) 语法尚不可用。否则,变量将不会被评估,并将作为 $(Variable).

进入构建名称
name: '$(buildNumber).$(Rev:r)'
variables:
  majorVersion: '1'
  minorVersion: '0'

  ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/master') }}:
    buildNumber: ${{ format('{0}.{1}',  variables['majorVersion'], variables['minorVersion']) }}
  ${{ if eq(variables['Build.Reason'], 'PullRequest') }}:
    buildNumber: ${{ format('{0}.{1}.PR-{0}', variables['majorVersion'], variables['minorVersion'], variables['System.PullRequest.PullRequestId']) }}

这里有更多关于表达式的信息:Azure Pipelines Reference

如果您希望使用生成的表达式为每个唯一值自动递增 counter 函数(只能用作变量声明的一部分),您可以使用以下方法:

jobs:
- job: VERSION_BUILD
  displayName: Version Build
  variables:
    - name: pipeline_start_date
      value: $[format('{0:yyyy}-{0:MM}-{0:dd}', pipeline.startTime)]
  steps:
  - checkout: none
  - task: PowerShell@2
    name: generate_minor_version
    displayName: Generate Minor Version
    inputs:
      targetType: 'inline'
      script: |
        Write-Host "Pipeline start date is '$(pipeline_start_date)'."
        [int] $minorVersion = [math]::floor(((New-TimeSpan -Start '2022-02-01' -End '$(pipeline_start_date)').Days) / 14) + 1
        Write-Host "Minor version is '$minorVersion'."
        Write-Host "##vso[task.setvariable variable=minor_version;isOutput=true;]$minorVersion"
- job: VERSION_BUILD_2
  displayName: Version Build 2
  dependsOn:
  - VERSION_BUILD
  variables:
    - name: minor_version
      value: $[dependencies.VERSION_BUILD.outputs['generate_minor_version.minor_version']]
    - name: major_minor_version
      value: $[format('{0}.{1}', variables['major_version'], variables['minor_version'])]
    - name: build_version
      value: $[counter(variables['major_minor_version'], 0)]
  steps:
  - checkout: none
  - task: PowerShell@2
    displayName: Update Build Number
    inputs:
      targetType: 'inline'
      script: |
        Write-Host "Major-minor version is '$(major_minor_version)'."
        Write-Host "Build version is '$(build_version)'."
        [string] $buildNumber = "$(major_version).$(minor_version).$(build_version)"
        Write-Host "Setting the name of the build to '$buildNumber'."
        Write-Host "##vso[build.updatebuildnumber]$buildNumber"

此特定脚本将 $minor_version 计算为从给定时间点开始的 2 周间隔(迭代)的数量。因此理论上,每隔一个星期二,管道会将内部版本号的次要版本增加 1,并将内部版本号的内部版本重置为 0,然后将自动为该 two-week 中的每个后续版本递增期间。