Azure DevOps — Примеры
Пример 1 — Конвейер, который разворачивает всё, что собирает
Один конвейер собирает, тестирует и затем разворачивает в продакшен в одном прогоне, поэтому каждое слияние в основную ветку доходит до продакшена без решения. Разделите интеграцию и релиз и поставьте перед продакшеном ворота одобрения.
steps:
- script: ./run-tests.sh
- script: ./build.sh
- script: ./deploy.sh production
Решение
# конвейер интеграции: выполняется на каждом изменении
steps:
- script: ./run-tests.sh
- script: ./build.sh
- publish: dist
---
# конвейер релиза: берёт опубликованный артефакт, разворачивает окружение за окружением
stages:
- stage: staging
steps: [{ script: ./deploy.sh staging }]
- stage: production
environment: production # защищено: выпустить должен одобряющий
steps: [{ script: ./deploy.sh production }]
Разделение двух конвейеров означает, что прошедшая сборка сама по себе не является развёртыванием, а одобрение превращает политику в то, что инструмент обеспечивает и записывает против артефакта. Обычная ошибка — оставить один конвейер и добавить одобрение к шагу: тогда остальной прогон свободен разворачивать.
Пример 2 — Самостоятельно размещённые агенты повсюду
Команда подняла агентов на своих машинах, потому что одна задача развёртывания должна достать до внутренней системы, а затем направила на них все задачи, поэтому обычные сборки теперь ждут мощности, а команда патчит машины, которых ей не нужно. Ниже — настроенные задачи. Верните работу, которой не нужна внутренняя сеть, на хостинговые раннеры.
pool: internal-agents
steps:
- script: ./run-tests.sh
- script: ./build.sh
- script: ./deploy.sh internal
jobs:
- job: nightly-regression
pool: internal-agents
steps: [{ script: ./run-regression.sh }]
Решение
jobs:
- job: build-and-test # внутренний доступ не нужен
pool: hosted
steps: [{ script: ./run-tests.sh }, { script: ./build.sh }]
- job: deploy-internal # единственная задача, которой нужна частная сеть
pool: internal-agents
steps: [{ script: ./deploy.sh internal }]
Раннер выбирается на каждую задачу, поэтому требование внутренней сети может закрыть одна задача вместо каждой машины, которой владеет команда. Сужение круга сужает и учётные данные, и патчинг — это и есть цена, которую несут самостоятельно размещённые агенты. Обычная ошибка — принять весь набор ради единственной возможности, которая его требовала, и ввезти инструменты, которых никто не просил.