Azure DevOps YAML向模板传字典循环下载指定版本构件方案
实现结论
Azure DevOps YAML管道原生支持模板内循环嵌套传参逻辑,你当前配置运行失败是语法写法错误导致,并非平台不支持该能力,修正后即可正常实现多指定版本构件循环下载。
核心错误点
- object类型参数遍历取值语法错误:
instantclient.template.yml的each循环遍历键值对结构的object时,每个循环项包含key(自定义键名)、value(对应配置对象)两个属性,包名、版本号都属于value下的属性,你直接写${{ packageVersion }}、${{ package }}没有对应上下文取值来源,会直接传空值。 - 带横杠的变量取值语法错误:变量名包含
-时,不能用variables.xxx的点号写法取值,模板引擎会把横杠识别为减号运算符,必须用variables['xxx']的索引写法取值。 - 模板参数未显式声明类型,容易触发参数类型推断异常,导致任务执行失败。
修正后完整配置
pipeline.yml
variables: - template: project.variables.yml jobs: - job: 'Deploy' steps: - template: instantclient.template.yml parameters: artifacts: oracle-instantclient: package: 'oracle-instantclient' packageVersion: ${{ variables['oracle-instantclient'] }} oracle-data-access-components: package: 'oracle-data-access-components' packageVersion: ${{ variables['oracle-data-access-components'] }}
instantclient.template.yml
parameters: - name: artifacts type: object - name: feed type: string default: ahitapplicationteam - name: downloadDirectory type: string default: deployment/s steps: - ${{ each artifact in parameters.artifacts }}: - template: artifacts.template.yml parameters: packageVersion: ${{ artifact.value.packageVersion }} feed: ${{ parameters.feed }} package: ${{ artifact.value.package }} downloadDirectory: ${{ parameters.downloadDirectory }}
artifacts.template.yml
parameters: - name: packageVersion type: string - name: feed type: string - name: package type: string - name: downloadDirectory type: string steps: - task: UniversalPackages@0 displayName: 'Downloading | Feed: ${{ parameters.feed }} | Package: ${{ parameters.package }} | PackageVersion: ${{ parameters.packageVersion }}' inputs: command: 'download' downloadDirectory: ${{ parameters.downloadDirectory }} vstsFeed: ${{ parameters.feed }} vstsFeedPackage: ${{ parameters.package }} vstsPackageVersion: ${{ parameters.packageVersion }} verbosity: 'Debug'
补充说明
后续如果需要新增下载构件,只需要在pipeline.yml的artifacts节点下按照现有格式新增对应包配置即可,不需要修改模板文件逻辑,循环会自动遍历所有传入的构件项执行下载。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

