无法使用动态创建的阶段运行模板化的 yaml Azure Devops 管道

问题描述

我的问题

我尝试创建模板化的 yaml Azure Devops 管道:

parameters:
- name: envs
  type: object
  default:
    -  QUAL
    -  PROD
    -  PREPROD
    
stages:
- template: orchestrator.yml
  parameters:
   name: envs
   type: object
   default:
      -  QUAL
      -  PROD
      -  PREPROD

这是我的模板:

parameters:
 envs: {}

stages:
- ${{ each env in parameters.envs }}:
  - stage: ${{ env }}
    jobs:
    - job: Deploy
      steps:
        - script: echo Deploy project
          displayName: 'Deploy'
    - job: Tests
      steps:
       - script: echo Unit tests
         displayName: Test 1

但我收到此错误消息:

加载 YAML 构建管道时出错。数组 必须至少包含一个元素。参数名称:stage

好的,我像这样修改我的主脚本:

parameters:
- name: envs
  type: object
  default:
    -  QUAL
    -  PROD
    -  PREPROD
    
stages:
- stage: Build
  jobs:
  - job: Build
    steps:
       - script: echo Compilation completed...
         displayName: 'Compile'

- template: orchestrator.yml
  parameters:
   name: envs
   type: object
   default:
      -  QUAL
      -  PROD
      -  PREPROD

这次管道运行,但只有第一个作业。模板未加载。

我需要什么

我能够使用单个文件脚本使此场景工作,但我想使其与模板化脚本一起工作。

是否支持此方案?我该怎么办?

谢谢

解决方法

这里我有一个示例作为参考:

  1. 在模板 YAML 文件(这里我将其命名为 template.yaml)中,这样写。
parameters:
- name: envs
  type: object
  default:
  - QUAL
  - PROD
  - PREPROD

stages:
- ${{ each env in parameters.envs }}:
  - stage: ${{ env }}
    displayName: 'Stage ${{ env }}'
    jobs:
    - job: job1
      displayName: 'Job 1'
      steps:
      - bash: echo "Current job is job1 in ${{ env }}"
    
    - job: job2
      displayName: 'Job 2'
      steps:
      - bash: echo "Current job is job2 in ${{ env }}"
  1. 在管道 YAML(这里我将其命名为 pipeline.yaml)中,这样写。
trigger:
- main

extends:
  template: template.yaml
  1. 结果 enter image description here

如果您不想硬编码 envs 中参数 'template.yaml' 的值,您可以如下编写。

  1. template.yaml 中这样写。
parameters:
- name: envs
  type: object
  default: []

stages:
- ${{ each env in parameters.envs }}:
  - stage: ${{ env }}
    displayName: 'Stage ${{ env }}'
    jobs:
    - job: job1
      displayName: 'Job 1'
      steps:
      - bash: echo "Current job is job1 in ${{ env }}"
    
    - job: job2
      displayName: 'Job 2'
      steps:
      - bash: echo "Current job is job2 in ${{ env }}"
  1. pipeline.yaml 中这样写。
trigger:
- main

stages:
- template: template.yaml
  parameters:
    envs:
    - QUAL
    - PROD
    - PREPROD
  1. 结果。同上。

要查看更多详细信息,您可以查看“YAML schema reference”。