如何在表达式内引用Azure DevOps矩阵变量?

时间:2020-04-07 11:33:48

标签: azure-devops

我试图找出如何在编译时表达式中访问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

1 个答案:

答案 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'))