Объединить конвейеры в один

#azure-devops #azure-pipelines

#azure-devops #azure-конвейеры

Вопрос:

У нас есть 2 конвейера

Конвейер 1:

  • Создает и развертывает ветвь нашего кода на server1
  • Запускает .exe, выполняя команду запуска dotnet

Конвейер 2:

  • Запускает тестовый скрипт с сервера 2 и отправляет запросы в exe-файл, запущенный на сервере 1 в конвейере 1
  • остановите .exe на server1

Цель состоит в том, чтобы объединить эти 2 конвейера в 1 или сделать это таким образом, чтобы одним щелчком мыши оба конвейера запускались там, где начинается конвейер 1, а затем запускается конвейер 2. Каков наилучший способ добиться этого? Обратите внимание, что конвейер 1 не считается завершенным, поскольку .exe запущен.

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

1. Привет, вы ознакомились с приведенными ниже решениями. Как все прошло с этим делом?

Ответ №1:

Одним из вариантов было бы оставить все как есть и добавить шаг в конвейер 1, чтобы запустить конвейер 2 через REST API

 https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.0
  

с помощью этого тела

 {
    "definition": {
        "id": 217
    },
    "sourceBranch": "refs/heads/master",
    "sourceVersion": "",
    "reason": 1,
    "demands": [],
    "parameters": "{"system.debug":"true"}"
}
  

(здесь у вас есть пример, как это сделать из задачи powershell)

или с помощью этого расширения Запустить конвейер Azure DevOps

Вы также можете попробовать объединить эти два конвейера в один, используя этапы. Чтобы выполнить оба этапа параллельно, вам нужно, чтобы они были независимыми, как это:

 stages:
- stage: FunctionalTest
  jobs:
  - job:
    ...

- stage: AcceptanceTest
  dependsOn: []    # this removes the implicit dependency on previous stage and causes this to run in parallel
  jobs:
  - job:
    ...
  

затем, если вы запустите конвейер, будут выполняться оба этапа.

Третий вариант — использовать триггеры конвейера, но для этого подхода я бы рекомендовал вам создать два этапа в первом конвейере и использовать фильтр этапов.

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

1. Только что добавлено это в конце вопроса — Обратите внимание, что конвейер 1 не считается завершенным, поскольку .exe запущен. Будет ли вышеупомянутый подход по-прежнему работать? Подумав, следует ли добавить шаг для запуска конвейера непосредственно перед запуском .exe

2. Извините, но это действительно конкретный вопрос, на который, я немного боюсь, я не смогу ответить без подробного знания вашего exe-файла. Как бы то ни было, если ваш exe ожидает некоторых запросов, поддерживая ваш конвейер в рабочем состоянии, все должно быть в порядке, если вы запускаете конвейеры после Builds and Deploys a branch of our code to server1

3. Что вы можете сделать, чтобы убедиться, что все запущено, — это добавить какой-либо тест в конвейер2, чтобы проверить, запущено ли ваше приложение на сервере 1, и только после этого запускать тесты и отправлять данные. Конечно, установите некоторый тайм-аут, чтобы он не сработал после некоторого количества попыток или фиксированного времени.

Ответ №2:

Вы можете попробовать приведенный ниже обходной путь, чтобы объединить 2 конвейера в 1.

В конвейере 1 вы можете открыть другой командный терминал для запуска .exe. Для приведенного ниже примера с использованием Start-Process в сценарии powershell:

Когда задача powershell завершит выполнение приведенной ниже команды, dotnet run команда будет выполнена в новом окне poweshell, и конвейер продолжит выполнение следующих задач.

 Start-Process powershell  -ArgumentList "dotnet run ..."
  

Затем вы можете добавить PowerShell на целевые компьютеры или задачу развертывания SSH в конвейер 1, чтобы запустить тестовый сценарий на сервере 2

Смотрите ниже простой пример:

 steps:

- powershell: |
    Start-Process powershell -ArgumentList "dotnet run ..."

- task: PowerShellOnTargetMachines@3
  inputs:
    Machines: 'server2'
    UserName: 'userName'
    UserPassword: '123456'
    InlineScript: |
      # Write your powershell commands here.
     
- powershell: |
    Stop-Process -Name processName
  
  

Ответ №3:

Если у вас уже есть оба конвейера, настроенные и запущенные отдельно, и это желаемое состояние, то пусть завершение одного конвейера инициирует следующее. Это можно сделать с помощью триггеров конвейера

 resources:
  pipelines:
  - pipeline: Pipeline1 # Name of the pipeline resource
    source: Pipeline1Name # Name of the pipeline referenced by the pipeline resource
    trigger: 
      branches:
      - releases/*
      - master
  

Pipeline1 — это имя, которое ваш YAML будет использовать для ссылки на ресурс конвейера, аналогичный шаблону в другом репозитории.

Источником будет имя конвейера, определенное в вашем Azure Devops.