Как использовать матричные переменные в рамках требований пула?

Для yaml-файла конвейеров Azure я хочу запустить набор задач один раз для каждого агента в определенном пуле. Когда я смотрел на матрицу стратегии занятости, это выглядело как хорошее решение для этого, но в настоящее время он не может подобрать переменную, которую я использую для этого.

Файл конвейерного yaml, релевантный для этой проблемы, является этой частью:

resources:
- repo: self

trigger: none

jobs:
- job: RunOnEveryAgent
  strategy:
    maxParallel: 3
    matrix:
      agent_1:
        agentName: Hosted Agent
      agent_2:
        agentName: Hosted VS2017 2
      agent_3:
        agentName: Hosted VS2017 3
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals $(agentName)

  steps:
  - (etc.)

С помощью этого сценария я попытался настроить матрицу для запуска по одному на каждом из трех агентов в пуле. Однако, когда я пытаюсь сослаться на агента в списке требований, он не подхватывает его. Фактическое сообщение об ошибке выглядит следующим образом:

[Ошибка 1] В пуле Hosted VS2017 не найден агент, удовлетворяющий указанным требованиям:

MSBuild

VisualStudio

Agent.Name -equals $ (agentName)

Agent.Version -gtVersion 2.141.1

Если я жестко закодирую имя агента, оно работает:

    demands:
    - msbuild
    - visualstudio
    - Agent.Name Hosted VS2017 3

Поддерживается ли использование этих переменных в требованиях пула? Или я должен использовать другую переменную или выражение?

0 ответов

parameters:
  - name: agentNames
    type: object
    default: []
jobs:
- job: RunOnEveryAgent
  strategy:
    matrix:
       ${{ each agentName in parameters.agentNames }}:
        ${{ agentName }}:
         agentName: ${{ agentName }}
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals $(agentName)

Это было бы лучшим решением, если вы захотите добавить больше агентов в будущем.

В некоторых из этих заданий переменные не поддерживаются из-за порядка, в котором они раскрываются.

Однако вы можете использовать синтаксис включения шаблона (https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops) для своей стратегии работы и передать имя агента в качестве параметра.

Итак, ваша работа по сборке в собственном файле YAML может выглядеть так:

parameters:
  agentName1: ''
  agentName2: ''
  agentName3: ''

jobs:
- job: RunOnEveryAgent
  strategy:
    maxParallel: 3
    matrix:
      agent_1:
        agentName: ${{ parameters.agentName1 }}
      agent_2:
        agentName: ${{ parameters.agentName2 }}
      agent_3:
        agentName: ${{ parameters.agentName3 }}
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals ${{ parameters.agentName3 }}

  steps:

Ваш главный azure-pipelines.yml затем изменится, чтобы выглядеть так:

resources:
- repo: self

trigger: none

jobs:
  - template: buildjob.yml
    parameters:
      agentName1: 'Hosted Agent'
      agentName2: 'Hosted VS2017 2'
      agentName3: 'Hosted VS2017 3'
Другие вопросы по тегам