Невозможно условно добавить скрипт в конвейер Azure Devops Yaml

Я пытаюсь использовать шаблон Container Job в конвейере, который работает как на Microsoft Hosted, так и на Self-Hosted (Containerized) агентах сборки.

Шаблон ContainerJob хорошо работает при запуске в Microsoft Hosted но не работает в Self-Hosted agent, говоря cannot run container inside a containerized build agent. Однако ошибка имеет смысл.

Я полагал, что если следующий раздел можно добавить / удалить условно, то один и тот же шаблон задания контейнера работает в обоих агентах.

${{ if not(parameters.isSelfHosted) }}:
  container:
    image: ${{ parameters.generalImage}}
    endpoint: ${{ parameters.endpoint}} 
  environment: ${{ parameters.environment }}

Но условие всегда верно и containerраздел всегда добавляется и всегда терпит неудачу в локальном агенте. Я думаю, что выражения не могут быть случайными внутри шаблона.

Я могу разделить этот шаблон на 2 шаблона и загрузить их в соответствующий агент сборки, но это последнее средство. Любая помощь в динамическом создании / изменении шаблона приветствуется.

1 ответ

Вы ищете работу с условным контейнером? Смотрите мой сценарий:

parameters:
- name: isSelfHosted
  displayName: isSelfHosted
  type: boolean
  default: true
  values:
  - false
  - true

stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: Build
    displayName: Build
    ${{ if not(parameters.isSelfHosted) }}:
      container: mcr.microsoft.com/dotnet/core/sdk:2.2
      steps:
        - task: CmdLine@2
          inputs:
            script: |
                echo 2.2 SDK

    ${{ if eq(parameters.isSelfHosted, 'true') }}:
      container: mcr.microsoft.com/dotnet/core/sdk:2.1
      steps:
        - task: CmdLine@2
          inputs:
            script: |
                echo 2.1 SDK

Я могу выбрать, какой контейнер (.net core 2.1 или.net core 2.2) с помощью значения isSelfHosted параметр.

Он использует параметры времени выполнения, поэтому я могу управлять состоянием (установить или снять флажок) при запуске конвейера:

Обновить:

Просмотр шаблонов заданий, этапов и этапов с параметрами

Переместите содержимое ниже в файл шаблона:

stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: Build
    displayName: Build
    ${{ if not(parameters.isSelfHosted) }}:
      container: mcr.microsoft.com/dotnet/core/sdk:2.2
      steps:
        - task: CmdLine@2
          inputs:
            script: |
                echo 2.2 SDK

    ${{ if eq(parameters.isSelfHosted, 'true') }}:
      container: mcr.microsoft.com/dotnet/core/sdk:2.1
      steps:
        - task: CmdLine@2
          inputs:
            script: |
                echo 2.1 SDK

Тогда основные azure-pipelines.yml должно быть

parameters:
- name: isSelfHosted
  displayName: isSelfHosted
  type: boolean
  default: true
  values:
  - false
  - true

stages:
- template: templates/xxx.yml  # Template reference
  parameters:
    isSelfHosted: xxx (Value of isSelfHosted parameter)
Другие вопросы по тегам