Azure DevOps Pipelines - 在每个循环中将变量与包装的作业变量组合

Azure DevOps Pipelines - Combining variables with wrapped job variables in an each loop

在这种情况下,我想将传递到模板的作业中的作业变量与模板中定义的公共变量列表结合起来(特别是模板中固定作业的输出变量)。

为了证明这一点,在这个例子中,我通过尝试将模板中的变量组合到传入的作业来扩展 Microsoft sample。为了示例,假设 bar.foo 确实存在并且按 CredScan 中的步骤输出:

parameters:
- name: jobs
  type: jobList
  default: []

jobs:
- job: CredScan                       # Cred scan first
  pool: MyCredScanPool
  steps:
  - task: MyCredScanTask@1

- ${{ each job in parameters.jobs }}: # Then each job
  - ${{ each pair in job }}:          # Insert all properties other than "dependsOn" and "variables"
      ${{ if ne(pair.key, 'dependsOn') }}:
        ${{ if ne(pair.key, 'variables') }}:
          ${{ pair.key }}: ${{ pair.value }}
    dependsOn:                        # Inject dependency
    - CredScan
    - ${{if job.dependsOn}}:            
      - ${{ job.dependsOn }}
    variables:
      bar.foo: $[ dependencies.CredScan.outputs['bar.foo'] ]
      ${{ if job.variables }}:
        ${{ job.variables }}

这给出了错误“预期的映射”。移动缩进并不能改变这一点。添加连字符将其更改为“解析块映射时,未找到预期的键”。

我猜这是因为您可以为变量使用各种结构,例如带有冒号或显式定义 name/value 的密钥对。以某种方式组合变量对象不起作用。尝试循环变量的内容,然后插入键和值也失败了。

也尝试了variable insertion example

${{ insert }}: ${{ job.variables }}

至少编译的是自己添加作业变量:

    ${{ if job.variables }}:
      variables: ${{ job.variables }}

但是我假设由于数据类型结构的原因,向其中添加额外的变量会再次导致错误。

    ${{ if job.variables }}:
      variables: ${{ job.variables }}
      bar.foo: $[ dependencies.CredScan.outputs['bar.foo'] ]

或者

    ${{ if job.variables }}:
      variables:
      ${{ job.variables }}
      bar.foo: $[ dependencies.CredScan.outputs['bar.foo'] ]

注意:我实际上不希望 if job.variables 检查整个变量部分,因为我想添加我的公共变量,而不管作业是否已经有一些自己的变量。目前尚不清楚这是否可以完全删除或存在于变量部分中。

帮助不胜感激!

终于破解了

有两个问题阻碍了之前的尝试。首先,我需要再次遍历 job.variables 中的变量,而不是仅仅尝试将 job.variables 转储进去,但是当我之前尝试过这个时,我永远无法编译它。这是因为使用了连字符,而在这种情况下根本不需要它们。

第二个问题是变量对中“键”的名称。在变量的上下文中,它是“名称”而不是“键”,当您意识到它们在显式设置时以这种方式定义时,这当然是显而易见的。

运行结果如下,希望对大家有所帮助:

variables:
  bar.foo: $[ dependencies.CredScan.outputs['bar.foo'] ]
  ${{ if job.variables }}:
    ${{ each var in job.variables }}:
      ${{var.name}}: ${{ var.value }}