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 中,如何将一堆阶段转换为作业矩阵?