YAML管道中的可选作业模板

时间:2019-10-06 20:06:30

标签: azure-devops

是否可以根据某种模板表达选择性地包含模板?具体来说,我希望azure-pipelines.yml中的顶级定义可以指出要在包含的阶段模板中使用的构建作业模板:

azure-pipelines.yml:

stages:
- template: generic-build-stage.yml  # Template reference
  parameters:
    # Example of optional build templates to use
    buildTypes: [SpecificBuildJobs1, SpecificBuildJobs3, SpecificBuildJobs4]

generic-build-stage.yml:

parameters:
  buildTypes: ???

stages:
- stage: generic_build
  jobs:
  ${{ }} # ???? What goes here to include the appropriate templates
  - template: ???

理想情况下,上面的模板表达式将扩展为:

  jobs:
  - template: specific-build-jobs1.yml
  - template: specific-build-jobs3.yml
  - template: specific-build-jobs4.yml

编辑:docs中的“迭代插入”示例似乎表明某种形式的动态解析时插入是可能的。

2 个答案:

答案 0 :(得分:0)

这似乎是不可能的,因为模板引用是在解析时解析的。

您可能必须为主管道设置多个模板,并将>>> divisible_by_7([4,8,21,6]) True >>> divisible_by_7([1,2,8,9]) False 的值设置为作业模板的特定模板名称,并在buildTypes中使用generic-build-stage.yml调用相应的作业模板;

Azure-pipelines.yml:

- template:${{parameters.buildTypes}}.yml

generic-build-stage.yml

stages:
- template: generic-build-stage.yml 
  parameters:
      buildTypes:specific-build-jobs1  

- template: generic-build-stage.yml 
  parameters:
      buildTypes:specific-build-jobs3  

答案 1 :(得分:0)

以下方法可以使顶级管道定义在较低级别消耗可变数量的作业集。

azure-pipelines.yml:

stages:
- template: generic-build-stage.yml  # Template reference
  parameters:
    # Example of optional build templates to use
    buildTypes: [SpecificBuildJobs1, SpecificBuildJobs3, SpecificBuildJobs4]

generic-build-stage.yml:

parameters:
  buildTypes: [MissingBuildType] # Use this if buildTypes is not provided

stages:
  - stage: build_stage
    jobs:
    # Note: VS Code extension for Pipelines (1.1574.4) will
    # say this is an "Unexpected property", but this works in ADO

    - ${{ if containsValue(parameters.buildTypes, 'MissingBuildType') }}:
      - template: build-stage-null.yml
    - ${{ if containsValue(parameters.buildTypes, 'SpecificBuildJobs1') }}:
      - template: specific-build-jobs1.yml
    - ${{ if containsValue(parameters.buildTypes, 'SpecificBuildJobs2') }}:
      - template: specific-build-jobs2.yml
    - ${{ if containsValue(parameters.buildTypes, 'SpecificBuildJobs3') }}:
      - template: specific-build-jobs3.yml
    - ${{ if containsValue(parameters.buildTypes, 'SpecificBuildJobs4') }}:
      - template: specific-build-jobs4.yml