Azure Матрица, управляемая данными - PullRequest
2 голосов
/ 13 июля 2020

В GitHub Actions я могу написать матричное задание следующим образом:

jobs:
  test:
    name: Test-${{matrix.template}}-${{matrix.os}}
    runs-on: ${{matrix.os}}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
        template: ['API', 'GraphQL', 'Orleans', 'NuGet']
    steps:
      #...

Это будет запускать каждую комбинацию os и template. В Azure Pipelines вы должны указать каждую комбинацию вручную следующим образом:

stages:
- stage: Test
  jobs:
  - job: Test
    strategy:
      matrix:
        Linux:
          os: ubuntu-latest
          template: API
        Mac:
          os: macos-latest
          template: API
        Windows:
          os: windows-latest
          template: API
        # ...continued
    pool:
      vmImage: $(os)
    timeoutInMinutes: 20
    steps:
      #...

Можно ли создать матричную стратегию, управляемую данными, аналогичную GitHub Actions?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Можно ли создать матричную стратегию, управляемую данными, аналогичную GitHub Actions?

Ответ - да. Это известная проблема, о которой уже сообщалось на github:

Добавить стратегию матрицы перекрестного продукта

Кроме того, существует обходной путь, в котором эта проблема упоминается в официальная документация :

Примечание

Матричный синтаксис не поддерживает автоматическое c масштабирование задания, но вы можете реализовать аналогичные функции с помощью ключевого слова each. Для примера см. nedrebo / parameterized- azure -jobs .

jobs:
- template: azure-pipelines-linux.yml
  parameters:
    images: [ 'archlinux/base', 'ubuntu:16.04', 'ubuntu:18.04', 'fedora:31' ]
    pythonVersions: [ '3.5', '3.6', '3.7' ]
    swVersions: [ '1.0.0', '1.1.0', '1.2.0', '1.3.0' ]
- template: azure-pipelines-windows.yml
  parameters:
    images: [ 'vs2017-win2016', 'windows-2019' ]
    pythonVersions: [ '3.5', '3.6', '3.7' ]
    swVersions: [ '1.0.0', '1.1.0', '1.2.0', '1.3.0' ]

azure -pipelines- windows .yml:

jobs:
  - ${{ each image in parameters.images }}:
    - ${{ each pythonVersion in parameters.pythonVersions }}:
      - ${{ each swVersion in parameters.swVersions }}:
        - job:
          displayName: ${{ format('OS:{0} PY:{1} SW:{2}', image, pythonVersion, swVersion) }}
          pool:
            vmImage: ${{ image }}
          steps:
            - script: echo OS version &&
                      wmic os get version &&
                      echo Lets test SW ${{ swVersion }} on Python ${{ pythonVersion }}
0 голосов
/ 14 июля 2020

Не идеальное решение, но пока вы можете oop сверх параметров. Напишите шаблон, подобный следующему, и передайте в него свои данные.

# jobs loop template
parameters:
  jobs: []

jobs:
- ${{ each job in parameters.jobs }}: # 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
    - task: SetupMyBuildTools@1       # Pre steps
    - ${{ job.steps }}                # Users steps
    - task: PublishMyTelemetry@1      # Post steps
      condition: always()

Дополнительные примеры см. Здесь: https://github.com/Microsoft/azure-pipelines-yaml/blob/master/design/each-expression.md#scenario -wrap-jobs

...