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