Выполнение задания Azure Devops в пуле на основе условного параметра
Я пытаюсь выполнить задание Azure Devops в определенном пуле в зависимости от условия. Цель состоит в том, чтобы переключаться между локальным агентом и агентом Microsoft. Вот конфигурация:
parameters:
custom_agent: true
jobs:
- job: Test
displayName: Test job
- ${{ if eq(parameters.custom_agent, true) }}:
- pool:
name: mypool
demands:
- agent.os -equals Linux
- ${{ if eq(parameters.custom_agent, false) }}:
- pool:
vmImage: 'ubuntu-latest'
steps:
- task: npmAuthenticate@0
https://i.stack.imgur.com/8p3s7.png
Есть идеи?
5 ответов
Мы можем указать условия, при которых будет выполняться шаг, задание или этап. Мы можем настроить задания в конвейере с различными записями условий и установить требования на основе этих условий.
Скелетная версия выглядит так:
parameters:
- name: custom_agent
displayName: Pool Image
type: boolean
default: True
jobs:
- job: selfhostedagent
condition: eq(${{ parameters.custom_agent }}, True)
displayName: 'self_hosted agent'
pool:
name: Default
demands:
- Agent.Name -equals WS-VITOL-01
steps:
- script: echo self_hosted agent
- job: hostedagent
condition: eq(${{ parameters.custom_agent }}, False)
displayName: 'hosted agent'
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo hosted agent
Обновление1
Кроме того, мы можем настроить шаблон задачи, а затем использовать шаблон в шагах.
Результат:
Приведенный ниже пример решил мое требование
parameters:
- name: 'vmImage'
type: string
default: 'ubuntu-latest'
- name: 'agentPool'
type: string
default: ''
jobs:
- job: 'Example'
pool:
${{ if ne(parameters.agentPool, '') }}:
name: ${{ parameters.agentPool }}
${{ if eq(parameters.agentPool, '') }}:
vmImage: ${{ parameters.vmImage }}
steps:
- script: example
Другой способ условного выбора пулов, если вы используете пулы без виртуальных машин:
variables:
- ${{ if eq(parameters.custom_agent, true) }}:
- name: testJobPool
value: mypool
- ${{ if eq(parameters.custom_agent, false) }}:
- name: testJobPool
value: mypool_second
jobs:
- job: Test
displayName: Test job
pool:
name: $(testJobPool)
steps:
- task: npmAuthenticate@0
Это оказалось эффективным.
Единственное, что я не видел полностью разъясненным, это то, что, хотя это невозможно на уровне «конвейера» (т. е. установить его один раз глобально), поскольку параметры являются вещью, ограниченной средой выполнения, и настройка на уровне конвейера не может ждать для параметров времени выполнения, НО вы все равно можете ЛЕГКО переопределить агента для каждого этапа, задания или шага.
Чтобы сделать это простым и последовательным образом, вы можете использовать шаблонный этап/задание/шаг, который принимает пул агентов в качестве параметра (но только его часть), а затем вы можете использовать условие YAML, чтобы определить, является ли он одним из допустимых. Управляемые агенты Azure DevOpswindows-latest
/ubuntu-latest
/macos-latest
/etc с несколькими конкретными версиями, ЕСЛИ НЕТ, вы можете предположить, что это автономный пул, и использовать его в качествеname:
атрибутpool:
противvmImage:
.
Спасибо Вито, Мариусу и Г.Ю. за полезные примеры.
azure-pipelines.yml
parameters:
- name: agentPool
type: string
default: windows-latest
# Valid Azure images: https://github.com/actions/runner-images#available-images
values:
- selfHosted1
- selfHosted2
- windows-latest
- windows-2019
- macos-latest
- ubuntu-latest
stages:
- template: azure-deploy.yml
parameters:
agentPool: ${{ parameters.agentPool }}
azure-deploy.yml
parameters:
- name: agentPool
type: string
default: windows-latest
stages:
- stage: Deploy
displayName: Deploy Bicep
pool:
${{ if or(or(startsWith(parameters.agentPool, 'windows'), startsWith(parameters.agentPool, 'macos')), startsWith(parameters.agentPool, 'ubuntu')) }}:
vmImage: ${{ parameters.agentPool }}
${{ if not(or(or(startsWith(parameters.agentPool, 'windows'), startsWith(parameters.agentPool, 'macos')), startsWith(parameters.agentPool, 'ubuntu'))) }}:
name: ${{ parameters.agentPool }}
jobs: <snipped to avoid too much boilerplate>
Похоже, пул не является допустимым свойством типа задания
Попробуйте переключить свою работу на тип развертывания:
вакансии:
- deployment: Test
- ${{ if eq(parameters.custom_agent, true) }}:
pool:
name: mypool
demands:
agent.os -equals Linux
strategy:
runOnce:
deploy:
steps: