我想利用可重复使用的模板。我有以下父管道:
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 步骤中访问输出变量:
我根据文章/堆栈溢出帖子尝试了多种方法,但无法在 child.yml 模板中解析值。我究竟做错了什么。我意识到我正在尝试将运行时变量传递到另一个模板中。根据周围的例子,这应该可行,对吧?
如有任何帮助,我们将不胜感激。
我尝试过各种可变格式,如下所示:
- template: child.yml
parameters:
dependsOn: SetId
id: $[ dependencies.ResolveId.outputs['getid.id'] ]
基于在运行时生成输出变量并将其传递给模板中下游作业的要求,我们不应该直接在
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)"