Создать этап, который можно вызвать с другого этапа или вручную?

#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.

Я могу придумать несколько возможных решений:

  1. Вместо того, чтобы иметь зависимость и использовать [ stageDependencies… ] синтаксис, отправьте MyWebSite в качестве параметра конвейера между этапами. (Обратите внимание, что на самом деле есть параметры не 1, я просто упростил, чтобы продемонстрировать проблему.) Если я это сделаю, тестировщику будет предложено заполнить (или выбрать из списка) различные параметры. Но это создает связь между Deploy_Stage и Test_Stage — я не знаю, плохо ли это?
  2. Передайте логический параметр из 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'] ]
 

Это кажется немного неуклюжим.

  1. Создайте новый YML под названием «Test_Stage_Manual» и заставьте его запрашивать различные параметры, а остальное оставьте как есть. (Если я сделаю это, я, вероятно, помещу задания в их собственный файл YML и вызову этот YML с обоих этапов тестирования.)
  2. Что-то еще?

Ответ №1:

Вы можете попробовать, как показано ниже:

  1. Создайте отдельный конвейер YAML только для выполнения теста.
  2. В «Deploy_Stage» основного конвейера добавьте шаг или задание в конце этого этапа для выполнения API «Запускает конвейер«, чтобы запустить конвейер для тестирования после успешного выполнения всех предыдущих шагов и заданий на этом этапе.
  3. При вызове «Запускает — Запускает конвейер» API, вы можете передать переменные и параметры, сгенерированные в «Deploy_Stage«, в конвейер для тестирования через Тело запроса (тип JSON) API.
  4. Поскольку тест выполняется в отдельном конвейере, вы можете вручную запустить этот конвейер, если хотите. При запуске вручную вы можете вручную задать значения требуемых переменных и параметров в конвейере.

Таким образом, вы можете запустить конвейер для тестирования как с помощью «Deploy_Stage«, так и вручную.

Комментарии:

1. Это умная идея! Вместо этого: Конвейер1: Этап сборки — > Этап развертывания — > > Этап тестирования Конвейер2: Этап тестирования Я делаю это: Конвейер1: Этап сборки — > > > Этап развертывания — > > > > Конвейер2 Конвейер2: Этап тестирования Аналогичен моему варианту 3, но это означает, что я поддерживаю сопоставление 1:1 между этапом и конвейером, поэтому это более чистое решение. Спасибо. (Форматирование.)