我试图弄清楚如何在编译时表达式中访问Azure DevOps矩阵变量。引用值始终为空/空/缺失。好像变量还没被设定一样。
下面是我正在尝试的一个示例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发布于 2020-04-08 05:07:16
对于关键字Matrix,它用于将多个信任分配到多个运行时作业。换句话说,包含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 }},这是一个在编译时处理的template expression。这意味着,系统将解析该值,然后决定是否运行下一个步骤/作业/模板。此过程发生在管道运行之前。我们称之为初始步骤。
正如我前面提到的,buildConfiguration是一个运行时变量。只有在运行时才可用。因此,它的值无法在编译时得到。在编译时,它的值将被解析为null。这就是为什么你的模板永远不会被运行。
有两个工作,你可以考虑使这个条件成为现实。
1)更改为在条件下使用另一个变量,即在编译时和运行时都可用的变量。例如Build.SourceBranchName。
2)将条件拆分,并将其转换为模板yml文件中定义的任务的condition。
比如:
- script: echo "hello"
condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))https://stackoverflow.com/questions/61079112
复制相似问题