Невозможно условно добавить скрипт в конвейер 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)