如何将输出变量值从一个模板传递到不同作业中的另一个模板参数

问题描述 投票:0回答:1

我想利用可重复使用的模板。我有以下父管道:

resources:
  repositories:
  - repository: templates
    type: git
    name: Configuration/cfgTemplates

pool:
  vmImage: ubuntu-latest

jobs:
- job: ResolveId
  displayName: Resolve ID
  steps:
  - template: /tasks/get_id.yml@templates
    parameters:
      name: test

- job: SetId
  dependsOn: ResolveId
  variables:
    resolvedId: $[ dependencies.ResolveId.outputs['getid.id'] ]
  steps:
    - script: |
        echo Retrieved id: $(resolvedId)

- template: child.yml
  parameters:
    dependsOn: SetId
    id: $(resolvedId)

这是 get_id.yml 管道模板:

parameters:
- name: name
  type: string
- name: showAdditionalOutput
  type: boolean
  default: false

steps:
- script: |
    echo "##vso[task.setvariable variable=id;isOutput=true]${{ parameters.name }}:342c2d35-1ded-438a-971f-a7540f7220d9"
  displayName: Get ID
  name: getid

- script: |
    echo Id = $(getid.id)
  enabled: ${{ parameters.showAdditionalOutput }}

这是child.yml管道模板:

parameters:
  - name: id
  - name: dependsOn
    type: object
    default: []  

jobs:
- job: validate_id
  displayName: ID Validation
  dependsOn: ${{ parameters.dependsOn }}
  steps:
  - script: |
      echo ${{ parameters.id }}

这是输出:

上述示例输出

我知道我可以在 SetId 步骤中访问输出变量:

SetId 的输出值

我根据文章/堆栈溢出帖子尝试了多种方法,但无法在 child.yml 模板中解析值。我究竟做错了什么。我意识到我正在尝试将运行时变量传递到另一个模板中。根据周围的例子,这应该可行,对吧?

如有任何帮助,我们将不胜感激。

我尝试过各种可变格式,如下所示:

- template: child.yml
  parameters:
    dependsOn: SetId
    id: $[ dependencies.ResolveId.outputs['getid.id'] ]
templates azure-devops yaml azure-pipelines
1个回答
0
投票

基于在运行时生成输出变量并将其传递给模板中下游作业的要求,我们不应该直接在

echo
中使用
${{ parameters.id }}
模板表达式
script
,因为此类表达式是在编译时处理的,而我们可以定义作业级别的新变量,其值为
${{ parameters.id }}
并传递到模板中。

此外,

${{ parameters.test }}
在传入模板
/tasks/get_id.yml@templates
时起作用的原因是
${{ parameters.test }}
在编译时具有
test
的静态值;然而,
${{ parameters.id }}
在编译时没有扩展值。请参阅文档来帮助我们理解变量语法

此外,由于我们希望检索上游

job: ResolveId
生成的输出变量,因此我们需要将
ResolveId
设置为
dependency
job: validate_id
强烈建议我们在下游作业中回显
dependencies
信息以进行故障排除。这是我的工作管道的 YAML 定义供您参考。

parent.yml

trigger: none

resources:
  repositories:
  - repository: templates
    type: git
    name: Configuration/cfgTemplates

pool:
  vmImage: ubuntu-latest

jobs:
- job: ResolveId
  displayName: Resolve ID
  steps:
  - template: /tasks/get_id.yml@templates
    parameters:
      name: test

- job: SetId
  dependsOn: ResolveId
  variables:
    resolvedId: $[ dependencies.ResolveId.outputs['getid.id'] ]
  steps:
    - script: |
        echo Retrieved id: $(resolvedId)

- template: child.yml
  parameters:
    dependsOn: [ResolveId, SetId]
    id: $[ dependencies.ResolveId.outputs['getid.id'] ]

child.yml

parameters:
  - name: id
  - name: dependsOn
    type: object
    default: []  

jobs:
- job: validate_id
  displayName: ID Validation
  dependsOn: ${{ parameters.dependsOn }}
  variables:
    TemplateId: ${{ parameters.id }}
    deps: $[convertToJson(dependencies)]
  steps:
  - script: |
      echo Validate id in template: $(TemplateId)
      echo "$(deps)"

Image

© www.soinside.com 2019 - 2024. All rights reserved.