如何在 Azure DevOps 中动态描述作业?

How do I describe jobs dynamically in Azure DevOps?

我有许多针对不同平台的工作,我想 运行 并行进行。我想为不同的情况构建一组不同的平台(即完整构建、冒烟、拉取请求等)。如何根据变量创建动态的工作列表?

例如,如果这是“硬编码”实现之一:

jobs:

- job: Platform1
  pool: Pool1
  steps:
      - template: minimal_template.yml
        parameters:
          BuildTarget: Platform1

- job: Platform2
  pool: Pool1
  steps:
      - template: minimal_template.yml
        parameters:
          BuildTarget: Platform2
        
- job: Platform3
  pool: Pool2
  steps:
      - template: minimal_template.yml
        parameters:
          BuildTarget: Platform3

我怎样才能提取出一组变量集,即

[[Platform1, Pool1], [Platform2, Pool1], [Platform3, Pool2]]

并在类似以下的管道上执行:

jobs:

??(Foreach platform in platforms)??

- job: $(platform[0])
  pool: $(platform[1])
  steps:
      - template: minimal_template.yml
        parameters:
          BuildTarget: $(platform[0])

您正在寻找条件:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml

阶段、作业和步骤都可以定义条件。

例如,运行 如果变量设置为 true,则作业:

condition: eq(variables['System.debug'], 'true')

你可以在parameters中定义它并循环它:

parameters:
  - name: Platforms
    type: object
    default:
      - name: 'Platform1'
        pool: 'Platform1Pool'
      - name: 'Platform2'
        pool: 'Platform2Pool'
jobs:
- ${{ each platform in parameters.Platforms}}:        
  - job: ${{ platform.name }}
     pool: ${{ platform.pool }}
     steps:
         - template: minimal_template.yml

您也可以使用 'jobList' 模板参数类型:

parameters:
- name: 'testsJobsList'
  type: jobList
  default: []

jobs:
- ${{ each job in parameters.testsJobsList }}: # Each job
  - ${{ each pair in job }}:          # Insert all properties other than "steps"
      ${{ if ne(pair.key, 'steps') }}:
        ${{ pair.key }}: ${{ pair.value }}
    steps:                            # Wrap the steps
    - ${{ job.steps }}                # Users steps

然后:

trigger:
- none

pool:
  vmImage: 'windows-latest'

jobs:
- template: deployment-template.yml
  parameters:
    testsJobsList: 
      - job: Platform1
        pool: Platform1Pool
        steps:
        - template: minimal_template.yml
      - job: Platform2
        pool: Platform2Pool
        steps:
        - template: minimal_template.yml