如何将重复的Azure DevOps步骤拆分为可重用模板

如何将重复的Azure DevOps步骤拆分为可重用模板,azure,azure-devops,Azure,Azure Devops,我有下面的Azure DevOps模板,它当前被硬编码到一些特定的文件中。我希望使用循环将它重构成一个更简单的模板,这样我就不需要复制(和硬编码)特定的文件 [为简洁起见的pseduo代码] #tests.yml steps: # pre-test steps. This is done once. - script: install tool1 - script: install tool2 - script: setup path stuff. # Tests

我有下面的Azure DevOps模板,它当前被硬编码到一些特定的文件中。我希望使用循环将它重构成一个更简单的模板,这样我就不需要复制(和硬编码)特定的文件

[为简洁起见的pseduo代码]

#tests.yml

steps:

  # pre-test steps. This is done once.

  - script: install tool1
  - script: install tool2
  - script: setup path stuff.

  # Tests
  - script: test project1 |
            display codecoverage to console-out
  - script: test project 2 |
            display codecoverage to console-out

  # Post-tests
  - script: upload coverage report for project1
  - script: upload coverage report for project2
  - task: PublishTestResults@2 # publish test results to Azure DevOps.
所以请注意我在每个项目中是如何做到这一点的

  • 测试项目
  • 显示codecoverage结果以进行控制台输出(因此我可以在此处查看结果)
  • 将结果上传至第三方网站(供其他人查看)
我希望有一种方法可以让某人将信息传递到模板中,然后在输入数据数组中循环

像这样

steps:

  # pre tests.
  ...

  # tests
  foreach project in projects
    - script: test project |
              display code coverage report
    - script: upload report

  # post-test
  ...
这可以在Azure DevOps中完成吗

    -
就个人而言,也许这些关键词就是你想要的

对于示例:

azure pipelines.yml

extends:
  template: template.yml
  parameters:
    buildArgs:  
      Arg1 : $(arg1-value)
      Arg2 : $(arg2-value)
parameters:
- name: buildArgs 
  type: object
  default: [] 
stages:
  - stage: EachLoop
    displayName: Run Each extends
    jobs:
    - job: looping
      steps:
      - ${{ each arg in parameters.buildArgs }}:
        - bash: |
            echo ${{ arg.key }}
            echo ${{ arg.value }}
            echo "##vso[task.setvariable variable=buildOther]${{ arg.value }}"
          displayName: ${{ arg.key }}
        - bash: |
            echo "buildstring=$(buildOther)"
          displayName: ECHO-${{ arg.key }}
template.yml

extends:
  template: template.yml
  parameters:
    buildArgs:  
      Arg1 : $(arg1-value)
      Arg2 : $(arg2-value)
parameters:
- name: buildArgs 
  type: object
  default: [] 
stages:
  - stage: EachLoop
    displayName: Run Each extends
    jobs:
    - job: looping
      steps:
      - ${{ each arg in parameters.buildArgs }}:
        - bash: |
            echo ${{ arg.key }}
            echo ${{ arg.value }}
            echo "##vso[task.setvariable variable=buildOther]${{ arg.value }}"
          displayName: ${{ arg.key }}
        - bash: |
            echo "buildstring=$(buildOther)"
          displayName: ECHO-${{ arg.key }}



对于您的场景,只需在template.yml中放置
运行测试
/
显示
/
上传
步骤。使用
每个
以及
参数
来扩展模板,这样您就可以实现循环。

感谢Merlin给出的精彩答案!非常感谢。不幸的是,我一直无法让它工作。我希望传入一个参数和一个值。不是键/值。例如,
buildArgs
:project1、project2、project3`。我还没能得到那一点,工作。@Pure.Krome可以给我一个样本数据吗?所需的参数数据结构?如果可以的话,把它更新成你的问题:-)我已经在开场白中这样做了?(我还没有编辑它。)。请参见第二个代码块示例。它需要传入一系列项目名称(字符串)。。。然后我对每个项目执行
foreach
并按2个步骤运行,在那里(也可能是一个模板!)@Pure.Krome,您只需提供有关步骤的示例。但最重要的内容是配置正确的参数,使extends与
每个
一起工作。所以,我想要的是你可以和我分享一个示例参数结构。然后,我可以为您提供帮助,使每个
都能正常工作。