Azure devops YAML管道中的可选作业模板

Azure devops YAML管道中的可选作业模板,azure-devops,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: [Speci

是否可以根据某种模板表达式选择性地包含模板?具体地说,我希望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]
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: ???
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
理想情况下,上述模板表达式将扩展为:

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

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

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

您可能需要为主管道设置多个模板,并将
buildTypes
的值设置为作业模板的特定模板名称,并在
generic build stage.yml
中使用
-template:${{parameters.buildTypes}}.yml
调用相应的作业模板

Azure-pipelines.yml:

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

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

parameters:
  buildTypes: ""

stages:
- stage: generic_build
  jobs:
  - template: ${{parameters.buildTypes}}.yml

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

您可能需要为主管道设置多个模板,并将
buildTypes
的值设置为作业模板的特定模板名称,并在
generic build stage.yml
中使用
-template:${{parameters.buildTypes}}.yml
调用相应的作业模板

Azure-pipelines.yml:

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

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

parameters:
  buildTypes: ""

stages:
- stage: generic_build
  jobs:
  - template: ${{parameters.buildTypes}}.yml

下面的方法允许顶级管道定义在较低级别使用数量可变的作业集

azure-pipelines.yml:

stages:
- template: generic-build-stage.yml  # Template reference
  parameters:
    # Example of optional build templates to use
    buildTypes: [SpecificBuildJobs1, SpecificBuildJobs3, SpecificBuildJobs4]
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: ???
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

下面的方法允许顶级管道定义在较低级别使用数量可变的作业集

azure-pipelines.yml:

stages:
- template: generic-build-stage.yml  # Template reference
  parameters:
    # Example of optional build templates to use
    buildTypes: [SpecificBuildJobs1, SpecificBuildJobs3, SpecificBuildJobs4]
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: ???
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

是的,这可能是不可能的,尽管在解析时可以获得执行此操作所需的所有信息。谢谢Levi Lu。是的,这可能是不可能的,尽管所有需要的信息都可以在解析时获得。谢谢Levi Lu。你解决了这个问题,真是太棒了。你可以接受这个答案,这太棒了,你解决了。你可以接受这个答案