0

我的问题

我尝试创建模板化 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 构建管道时出错。数组必须至少包含一个元素。参数名称:阶段

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

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

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

我需要的

我能够让这个场景使用单个文件脚本,但我想让它使用模板化脚本。

是否支持此场景?我该怎么办?

谢谢

4

1 回答 1

0

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

  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. 结果 在此处输入图像描述

如果你不想硬编码 ' 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 架构参考”。

于 2021-05-21T07:13:06.947 回答