【问题标题】:Can't run a templated yaml Azure Devops pipeline with dynamically created stage无法使用动态创建的阶段运行模板化 yaml Azure Devops 管道
【发布时间】:2021-08-10 04:58:42
【问题描述】:

我的问题

我尝试创建模板化 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

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

我需要什么

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

是否支持这种情况?我该怎么办?

谢谢

【问题讨论】:

    标签: azure-devops azure-pipelines-yaml azure-devops-yaml


    【解决方案1】:

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

    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. 结果

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

    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”。

    【讨论】:

    猜你喜欢
    • 2021-10-14
    • 2020-10-31
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2022-09-23
    • 2020-05-24
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多