我试图找出如何在编译时表达式中访问Azure DevOps矩阵变量。参考值始终为null / empty / missing。就像尚未设置变量一样。
这是我尝试的示例yml文件:
jobs:
- job: LinuxBuild
displayName: Pew Pew
strategy:
matrix:
debugJob:
buildConfiguration: Debug
releaseJob:
buildConfiguration: Release
pool:
vmImage: 'ubuntu-16.04'
steps:
- script: echo ${{variables.debugJob.buildConfiguration}} ## <-- always null/empty
- script: echo ${{variables['debugJob.buildConfiguration']}} ## <-- always null/empty
- ${{ if eq(variables.debugJob.buildConfiguration, 'Debug') }}: ## <-- never ran/executed
- template: doSomething.yml@templates
答案 0 :(得分:4)
对于关键字Matrix
,它用于expand将多重配置转换为多个运行时作业。换句话说,包含Matrix
关键字的YAML将在运行时而不是parse time
处进行扩展。因此,变量buildConfiguration
是运行时变量,在编译时不可用,因此也无法获取。
此外,${{ }}
是一种在编译时处理变量的格式。
现在,毫无疑问地知道您遇到的问题是预期的操作,因为您试图在编译时获取运行时变量。
因此,要打印出buildConfiguration
的值,您需要使用$()
的格式
将您的YAML脚本更改为此:
jobs:
- job: LinuxBuild
displayName: Pew Pew
strategy:
matrix:
debugJob:
buildConfiguration: Debug
releaseJob:
buildConfiguration: Release
pool:
vmImage: 'ubuntu-16.04'
steps:
- script: echo $(buildConfiguration)
- script: echo "hello"
condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))
现在,让我们专注于您尝试的另一种尝试:- ${{ if eq(variables.debugJob.buildConfiguration, 'Debug') }}:
。
首先,您需要知道${{ if xxx }}
,这是一个在{strong>编译时处理的template expression
。这意味着,系统将解析该值,然后决定是否应运行后续步骤/作业/模板。此过程在管道运行之前发生。我们将其称为初始步骤。
如上所述,buildConfiguration
是一个运行时变量。它仅在运行时可用。因此,其值无法在编译时获得。在编译时,其值将解析为null
。这就是为什么模板永远不会被运行的原因。
有两种解决方法,您可以考虑使此条件成立。
1)更改为在条件中使用另一个变量,该变量在编译时和运行时均可使用。例如Build.SourceBranchName
。
2)拆分条件并将其更改为模板yml文件中定义的任务的condition
。
赞:
- script: echo "hello"
condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))