Azure Devops - 将 YAML 脚本中的变量设置为日期时间

Posted

技术标签:

【中文标题】Azure Devops - 将 YAML 脚本中的变量设置为日期时间【英文标题】:Azure Devops - Setting variable in YAML script to datetime 【发布时间】:2019-06-16 06:31:15 【问题描述】:

我正在尝试为 Azure DevOps YAML 管道中的 NuGet 包生成名称。

上下文是在每个自动构建上使用包名称、分支名称、日期和递增的修订号创建包。

packageName-branchName-year-month-day-revision

这样,当一个新的特性分支被创建时,它会生成一个独特的包,可用于在需要它的项目中进行测试。

我正在努力根据日期或修订号等环境变量在 YAML 文件中设置一个变量。

使用##vso 命令,我可以将'myVariable' 设置为hello 并打印出来。

- script: |
    echo '##vso[task.setvariable variable=myVariable]hello'

- script: |
    echo my variable is $(myVariable)

当我尝试按如下方式从 PowerShell 设置变量时,我收到以下错误“#$dateStr”不被识别为内部或外部命令”。

# Create a variable
- script: |
    #$dateStr = (Get-Date).ToString('yyyy-MM-dd') 
    echo '##vso[task.setvariable variable=myVariable]#$dateStr'

# Print the variable
- script: |
    echo my variable is $(myVariable) 

当我尝试在 YAML 文件的变量部分中设置变量时。

variables:
  solution: '**/*.sln'
  foo: $(Date:yyyyMMdd)

- script: |
    echo my variable is $(foo)

变量没有被插值,它输出为。

'我的变量是 $(Date:yyyyMMdd)'

如何根据 $(rev) 和 $(Date) 等环境变量创建变量?

【问题讨论】:

【参考方案1】:

我认为没有内置的date 变量,但对于 powershell 情况,您只需在变量之前删除 # 并且必须用 " 括起来,否则 powershell 不会扩展您的变量

echo "##vso[task.setvariable variable=myVariable]$dateStr"

【讨论】:

【参考方案2】:

感谢您的帮助。

这就是我最终解决问题的方法。对于非发布分支,我使用 build# + beta + 分支名称为我正在创建的 nuget 包生成一个唯一名称。对于发布分支,我只使用构建#。

# Create version number for non release package(s) - 1.0.xxx-beta-develop for example
- powershell: |
    [String]$buildNumber = $Env:BUILD_BUILDNUMBER.Substring($Env:BUILD_BUILDNUMBER.LastIndexOf('.') + 1)
    [String]$branchName = $Env:BUILD_BUILDNUMBER.Substring(0, $Env:BUILD_BUILDNUMBER.LastIndexOf('.'))
    Write-Host "##vso[task.setvariable variable=nugetVersion]1.0.$($buildNumber)-beta-$($branchName)"
  displayName: 'Create beta version number for production nuget packages - run when in non release branch' 
  condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'release/'))

# Create version number for release package(s) - 1.0.xxx for example
- powershell: |
    [String]$buildNumber = $Env:BUILD_BUILDNUMBER.Substring($Env:BUILD_BUILDNUMBER.LastIndexOf('.') + 1)
    Write-Host "##vso[task.setvariable variable=nugetVersion]1.0.' + $($buildNumber)
  displayName: 'Create version number for production nuget packages - run when in release branch' 
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'release/'))


- task: NuGetCommand@2
  inputs:
    command: 'pack' # Options: restore, pack, push, custom
    versioningScheme: byEnvVar
    versionEnvVar: nugetVersion
    packDestination: '$(Build.ArtifactStagingDirectory)\nuget'
    packagesToPack: '**/Floww.*.nuspec'     

【讨论】:

【参考方案3】:

使用-script 非常适合运行可以跨平台执行的命令,例如npm i

由于日期不是全局变量,您需要创建它。问题在于,根据您正在运行的构建代理 (window|mac|linx),您将有不同的方法来设置该变量,请参阅 documentation...

以下将允许您像其他变量一样使用$d 变量

 steps:
    - bash: |
        export d=$(date +%F)
        echo "The Date is $d"
        echo "##vso[task.setvariable variable=fileName]$d"
      condition: eq( variables['Agent.OS'], 'Linux' )
    - powershell: |
        Set-Variable -Name d -Value (Get-Date).ToString('yyyy-MM-dd')
        Write-Host "##vso[task.setvariable variable=fileName]$d"
      condition: eq( variables['Agent.OS'], 'Windows_NT' )

【讨论】:

以上是关于Azure Devops - 将 YAML 脚本中的变量设置为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 yaml 中处理 Azure DevOps 管道中的错误?

Azure Devops:是不是可以将 yaml 模板嵌套在另一个 yaml 模板中?

在我的 Azure DevOps YAML Pipeline 中,如何将一堆阶段转换为作业矩阵?

将数组作为输入传递给 Azure DevOps YAML 任务

Azure DevOps YAML并行运行未排队

Yaml Azure Devops TerraformInstaller 不明确