首页 > 解决方案 > 如何在表达式中引用 Azure DevOps 矩阵变量?

问题描述

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

标签: azure-devops

解决方案


对于关键字Matrix,它用于将多配置扩展为多个运行时作业。换句话说,包含Matrix关键字的 YAML 将在运行时扩展,而不是parse time. 所以,该变量buildConfiguration是一个运行时变量,在编译时是不可用的,也无法获取。

此外,是一种在编译时${{ }}处理变量的格式。

现在,毫无疑问,您遇到的问题是预期的操作,因为您试图在compile time获取运行时变量


因此,要打印 的值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)拆分条件并将它们更改为condition模板yml文件中定义的任务。

像:

  - script: echo "hello"
    condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))

推荐阅读