#azure-devops #azure-devops-pipelines #azure-devops-yaml
Вопрос:
Привет, у меня есть проблема с зависимостью от конвейера, и я придумал ряд возможных решений. Я могу попробовать их все в лаборатории, но проблема в том, что мне интересно, хорошо ли они работают «в полевых условиях», и поэтому я хотел бы знать, пробовал ли их кто-нибудь?
У меня есть 3 этапа, каждый в своем собственном файле YML. Каждый из них вызывается из основного YML, который вызывается из основного конвейера.
- template: 'build.yml'
- template: 'deploy.yml'
- template: 'test.yml'
«Развертывание.yml» генерирует большое количество выходных переменных среды, и 4 из них используются тестом».yml’ с использованием синтаксиса «stageDependencies» :
stages:
- stage: 'Test_Stage'
dependsOn: Deploy_Stage
jobs:
job: 'Test_Job'
variables:
MyWebSite: [ stageDependencies.Deploy_Stage.Variables_Job.outputs['Variables_Job.Variables.MyWebSite'] ]
Это прекрасно работает.
Но я хотел бы иметь возможность создать конвейер, который просто выполняет этап тестирования (для тестирования уже существующего веб-сайта). Это, конечно, не работает из-за зависимости dependsOn: Deploy_Stage.
Я могу придумать несколько возможных решений:
- Вместо того, чтобы иметь зависимость и использовать [ stageDependencies… ] синтаксис, отправьте MyWebSite в качестве параметра конвейера между этапами. (Обратите внимание, что на самом деле есть параметры не 1, я просто упростил, чтобы продемонстрировать проблему.) Если я это сделаю, тестировщику будет предложено заполнить (или выбрать из списка) различные параметры. Но это создает связь между Deploy_Stage и Test_Stage — я не знаю, плохо ли это?
- Передайте логический параметр из Deploy_Stage в Test_Stage, например «CalledFromDeployStage», а затем в Test_Stage выполните следующее:
stages:
- stage: 'Test_Stage'
${{ if eq(parameters.CalledFromDeployStage, true) }}:
dependsOn: Deploy_Stage
jobs:
job: 'Test_Job'
variables:
MyWebSite: [ stageDependencies.Deploy_Stage.Variables_Job.outputs['Variables_Job.Variables.MyWebSite'] ]
Это кажется немного неуклюжим.
- Создайте новый YML под названием «Test_Stage_Manual» и заставьте его запрашивать различные параметры, а остальное оставьте как есть. (Если я сделаю это, я, вероятно, помещу задания в их собственный файл YML и вызову этот YML с обоих этапов тестирования.)
- Что-то еще?
Ответ №1:
Вы можете попробовать, как показано ниже:
- Создайте отдельный конвейер YAML только для выполнения теста.
- В «Deploy_Stage» основного конвейера добавьте шаг или задание в конце этого этапа для выполнения API «Запускает конвейер«, чтобы запустить конвейер для тестирования после успешного выполнения всех предыдущих шагов и заданий на этом этапе.
- При вызове «Запускает — Запускает конвейер» API, вы можете передать переменные и параметры, сгенерированные в «Deploy_Stage«, в конвейер для тестирования через Тело запроса (тип JSON) API.
- Поскольку тест выполняется в отдельном конвейере, вы можете вручную запустить этот конвейер, если хотите. При запуске вручную вы можете вручную задать значения требуемых переменных и параметров в конвейере.
Таким образом, вы можете запустить конвейер для тестирования как с помощью «Deploy_Stage«, так и вручную.
Комментарии:
1. Это умная идея! Вместо этого: Конвейер1: Этап сборки — > Этап развертывания — > > Этап тестирования Конвейер2: Этап тестирования Я делаю это: Конвейер1: Этап сборки — > > > Этап развертывания — > > > > Конвейер2 Конвейер2: Этап тестирования Аналогичен моему варианту 3, но это означает, что я поддерживаю сопоставление 1:1 между этапом и конвейером, поэтому это более чистое решение. Спасибо. (Форматирование.)