Выполнение задания 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:
Другие вопросы по тегам