1

Azure DevOps YAML 中变量支持和语法的一致性差异很大。一个例子:

trigger:
- master

# Variable Group has $(testCategory1) with value
# 'TestCategory=bvttestonly | TestCategory=logintest'
variables:
  - group: DYNAMIC_VG

jobs:
  - job:
    pool: 'MyPool' #Has about 10+ self hosted agents

    strategy:
      parallel: $[ variables['noOfVMsDynamic']]

    variables:
      indyx: '$(testCategories$(System.JobPositionInPhase))'
      indyx2: $[ variables['indyx'] ] 
      testCategories: $[ variables[ 'indyx2' ] ]

    steps:
    - script: |
        echo "indyx2 - $(indyx2)"
        echo "testCategories $(testCategories)"
      displayName: 'Display Test Categories'

步骤打印:

"indyx2 - $(testCategories1)"
"testCategories $(testCategories1)"

我需要打印变量组中定义的 $(testCategories1) 的值:

'TestCategory=bvttestonly | TestCategory=logintest'

4

3 回答 3

2

Howto:动态解析 Azure DevOps YAML 中的嵌套变量

$(testCategories$(System.JobPositionInPhase))那是因为此时构建管道中尚不支持嵌套变量(如 )的值。

这就是为什么你总是得到值$(testCategories1)而不是变量的实际值的原因testCategories1

我在过去的帖子中多次遇到此问题,在 Azure Devops 支持此功能之前,我们没有完美的解决方案。

为了方便测试,我简化了您的 yaml,如下所示:

jobs:
  - job: ExecCRJob
    timeoutInMinutes: 800

    pool:
      name: MyPrivateAgent

    displayName: 'Execute CR'


    variables:
      testCategories1: 123456
      testCategoriesSubscripted: $(testCategories$(System.JobPositionInPhase))

    strategy:
      parallel: $[variables['noOfVMs']]     
    steps:
    - template: execute-cr.yml
      parameters:
        testCategories: $(testCategoriesSubscripted)

execute-cr.yml: _

steps:
    - script: echo ${{ parameters.testCategories }}

我们总是得到$(testCategories1)它的价值。

如果我更改$(testCategories$(System.JobPositionInPhase))$(testCategories1),一切正常。

由于尚不支持嵌套变量,作为解决方法,我们需要为 的每个值扩展嵌套变量testCategories,例如:

- job: B
  condition: and(succeeded(), eq(dependencies.A.outputs['printvar.skipsubsequent'], 'Value1'))
  dependsOn: A
  steps:
  - script: echo hello from B

检查表达式依赖项以获取更多详细信息。

希望这可以帮助。

于 2020-03-18T09:50:39.950 回答
1

这可能对您有用:

variables
   indyx: $[ variables[format('{0}{1}', 'testCategories', variables['System.JobPositionInPhase'])] ]

它对我有用,在稍微不同的情况下也需要一些动态变量名。

于 2020-06-05T13:02:56.377 回答
0

如果我正确理解您的问题,问题是管道在作业运行时评估所有变量。这种情况下的解决方案是将您的任务拆分为具有依赖关系的单独作业。

看看我在这篇文章中的回答,如果它是你所追求的,请告诉我:YAML 管道 - 设置变量并在模板表达式中使用

于 2020-03-18T03:59:35.137 回答