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

Azure devops 如何在表达式中引用Azure DevOps矩阵变量?,azure-devops,Azure Devops,我试图弄清楚如何在编译时表达式中访问Azure DevOps矩阵变量。参考值始终为空/空/缺少。好像变量还没有设置 下面是我尝试的一个yml文件示例: jobs: - job: LinuxBuild displayName: Pew Pew strategy: matrix: debugJob: buildConfiguration: Debug releaseJob: buildConfiguration: Releas

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

工作:
-工作:LinuxBuild
显示名称:Pew Pew
战略:
矩阵:
调试作业:
构建配置:调试
发布作业:
构建配置:发布
游泳池:
vmImage:'ubuntu-16.04'
步骤:

-脚本:echo${{variables.debugJob.buildConfiguration}}##对于关键字
Matrix
,它用于将多个配置配置为多个运行时作业。换句话说,包含
矩阵
关键字的YAML将在运行时展开,而不是在
解析时
展开。因此,变量
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}}
,这是一个
模板表达式
,在编译时处理。这意味着,系统将解析该值,然后决定是否应运行下一步/作业/模板。此过程发生在管道运行之前。我们称之为初始步骤

如上所述,
buildConfiguration
是一个运行时变量。它仅在运行时可用。因此,在编译时无法获取其值。在编译时,它的值将被解析为
null
。这就是为什么永远不会运行模板

有2个工作可以让这个条件成立。

1)更改为在条件中使用另一个变量,该变量在编译时和运行时都可用。e、 g
Build.SourceBranchName

2)将条件拆分并将其更改为模板yml文件中定义的任务“
条件”

比如:

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

谢谢你的回答。矩阵变量是
运行时变量
,这是我的直觉——所以我很高兴这一点得到了证实。我真正希望的是最后一部分->条件模板的答案。我使用的是编译时的模板表达式,它不能/不起作用。因此,现在我不确定如何使用基于矩阵变量的条件模板。此外,我不能使用建议#1-因为矩阵定义了变量。不是整个管道的全局变量。至于建议#2-这只适用于各种
步骤
。。。但是
模板
步骤没有允许的
条件。这就是我试图利用
编译时
运行时
表达式的原因。@Pure.Krome受您使用的变量限制,是一个运行时变量。无法在编译时获取它。如果你改为使用另一个变量,那就容易多了。@Pure.Krome Nope,对于建议#2,我的意思是把条件放在一个特定的步骤上。例如,模板中有一个powershell任务,然后我将该条件设置为powershell任务。我知道这种方法很麻烦,但我认为它是有效的。我知道
条件
适用于每一步。这现在意味着:矩阵中的所有“运行”(在我的场景中,运行1==Debug,运行2==Release)将-all-include/运行该模板。。但实际上,他们中只有一个人会执行每个
步骤
。(该步骤将显示
条件:如果释放,则跳过
)。因此,发布版的日志中将包含所有这些额外的噪音。跳过/跳过/跳过/跳过/。。等我认为(实际上,我希望并祈祷)这将是Azure DevOps管道的一个特性。如果不是-我们在哪里祈祷/要求这个功能?