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 }]

Раннер выбирается на каждую задачу, поэтому требование внутренней сети может закрыть одна задача вместо каждой машины, которой владеет команда. Сужение круга сужает и учётные данные, и патчинг — это и есть цена, которую несут самостоятельно размещённые агенты. Обычная ошибка — принять весь набор ради единственной возможности, которая его требовала, и ввезти инструменты, которых никто не просил.