Как использовать матричные переменные в рамках требований пула?
Для 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'