Modern QA2026Стратегии развёртывания
Join

Course16 CI/CD Pipelines

Foundations · Chapter 16

Стратегии развёртывания

Updated Jul 2026

Место тестов в развёртывании

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

Blue-Green-развёртывание

Как это работает

Существуют два идентичных окружения: blue (текущий продакшен) и green (новая версия). Новая версия развёртывается в green. После валидации трафик переключается с blue на green. Если что-то пойдёт не так, переключение обратно происходит мгновенно.

                    Load Balancer
                    /           \
              Blue (v2.3)    Green (v2.4)
              [текущий]      [новый, тестируется]
                              ↑
                         Запуск полного набора тестов здесь
                         перед переключением трафика

Где запускаются тесты

  1. До переключения: запустите полный набор браузерных тестов, интеграционных тестов и дымовых тестов производительности на green-окружении
  2. После переключения: запустите дымовые тесты в продакшене, чтобы убедиться, что переключение прошло чисто
  3. Триггер отката: если дымовые тесты после переключения падают, немедленно переключитесь обратно на blue
# Example: Blue-green deployment with testing gates
deploy-to-green:
  runs-on: ubuntu-latest
  steps:
    - run: ./deploy.sh green

test-green:
  needs: deploy-to-green
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - run: npm ci
    - run: npx playwright test --project=regression
      env:
        BASE_URL: https://green.example.com

switch-traffic:
  needs: test-green
  runs-on: ubuntu-latest
  steps:
    - run: ./switch-traffic.sh blue-to-green

smoke-production:
  needs: switch-traffic
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - run: npm ci
    - run: npx playwright test --project=smoke
      env:
        BASE_URL: https://production.example.com

Уровень риска: низкий

Мгновенный откат путём переключения трафика обратно на blue. Полный набор тестов запускается на новой версии до того, как реальные пользователи её увидят.

Последствия для QA

  • Вам нужен полный, надёжный набор тестов, который может запускаться на изолированном окружении
  • Тесты должны быть не зависящими от окружения (настраиваемыми через BASE_URL)
  • Тестовые данные в green-окружении должны соответствовать условиям, приближенным к продакшену
  • Набор тестов должен завершаться за разумное время (блокировка развёртывания на 2 часа неприемлема)

Канареечное развёртывание

Как это работает

Новая версия развёртывается на небольшую часть серверов («канарейка»). Небольшой процент реального трафика (обычно 1-5%) направляется на канарейку. Если метрики выглядят хорошо, трафик постепенно увеличивается, пока канарейка не становится новым продакшеном.

                    Load Balancer
                   /      |      \
              v2.3     v2.3     v2.4 (canary)
              95%                5% трафика
                                ↑
                           Мониторинг метрик здесь:
                           - Частота ошибок
                           - Задержка p99
                           - Бизнес-метрики

Где запускаются тесты

  1. До канареечного развёртывания: запустите стандартный набор тестов на staging-окружении
  2. Во время канарейки: полагайтесь на синтетический мониторинг и метрики реального времени, а не на полные наборы тестов — канарейка обслуживает реальный трафик
  3. Решение о продвижении: на основе сравнения метрик канарейки и базовой версии
# Example: Canary monitoring
canary-monitoring:
  runs-on: ubuntu-latest
  steps:
    - name: Wait for canary stabilization
      run: sleep 300  # 5 minutes for metrics to accumulate

    - name: Compare canary metrics
      run: |
        CANARY_ERROR_RATE=$(curl -s "$METRICS_API/canary/error-rate")
        BASELINE_ERROR_RATE=$(curl -s "$METRICS_API/baseline/error-rate")

        if (( $(echo "$CANARY_ERROR_RATE > $BASELINE_ERROR_RATE * 1.1" | bc -l) )); then
          echo "Canary error rate ($CANARY_ERROR_RATE) exceeds baseline ($BASELINE_ERROR_RATE) by >10%"
          exit 1
        fi

    - name: Run synthetic smoke tests
      run: npx playwright test --project=smoke
      env:
        BASE_URL: https://canary.example.com

Уровень риска: средний

Реальные пользователи видят новый код рано, но лишь небольшой процент. Если канарейка плохая, затронуты только 5% пользователей, и откат происходит автоматически.

Последствия для QA

  • Тесты синтетического мониторинга должны быть лёгкими и быстрыми (они работают с реальным трафиком)
  • Фокусируйтесь на метриках: частота ошибок, перцентили задержки, показатели бизнес-конверсии
  • Вам нужна хорошая наблюдаемость (логирование, метрики, трейсинг) для обнаружения проблем канарейки
  • Тестируйте сам механизм отката — канарейка, которая не может откатиться, бесполезна

Rolling-развёртывание

Как это работает

Экземпляры обновляются по одному (или небольшими группами) по всему флоту. В любой момент во время раскатки некоторые экземпляры работают на старой версии, а некоторые — на новой.

Start:    [v2.3] [v2.3] [v2.3] [v2.3]
Step 1:   [v2.4] [v2.3] [v2.3] [v2.3]  ← Health check на v2.4
Step 2:   [v2.4] [v2.4] [v2.3] [v2.3]  ← Health check на v2.4
Step 3:   [v2.4] [v2.4] [v2.4] [v2.3]  ← Health check на v2.4
Step 4:   [v2.4] [v2.4] [v2.4] [v2.4]  ← Завершено

Где запускаются тесты

  1. До развёртывания: стандартный набор тестов на staging
  2. Во время раскатки: health check на каждом обновлённом экземпляре перед продолжением
  3. После полной раскатки: дымовые тесты в продакшене

Уровень риска: средний

Смешанные версии работают одновременно во время раскатки. Это может вызвать проблемы, если старая и новая версии имеют несовместимые схемы базы данных или контракты API.

Последствия для QA

  • Тесты должны учитывать обратную совместимость во время окна раскатки
  • Эндпоинты health check должны быть содержательными (а не просто возвращать 200)
  • Миграции базы данных должны быть обратно совместимыми (паттерн expand-contract)
  • Версионирование API становится важным — могут ли старые клиенты взаимодействовать с новыми серверами и наоборот?

Сравнение стратегий

Стратегия Как работает Где запускаются тесты Уровень риска Скорость отката Лучше всего для
Blue-Green Два окружения; трафик переключается Полный набор на green перед переключением Низкий Мгновенный Команд с надёжными наборами тестов
Canary Малый % трафика на новую версию Мониторинг и синтетические тесты Средний Быстрый (автоматический) Высоконагруженных приложений с хорошей наблюдаемостью
Rolling Экземпляры обновляются по одному Health check на каждом экземпляре Средний Медленный (раскатка вперёд/назад) Stateless-сервисов с большими флотами

Feature flags как стратегия тестирования

Feature flags отделяют развёртывание от релиза. Вы развёртываете код, но скрываете новые функции за флагами, затем включаете их постепенно.

// Feature flag check in application code
if (featureFlags.isEnabled('new-checkout-flow', { userId })) {
  return newCheckoutFlow();
} else {
  return legacyCheckoutFlow();
}

Последствия feature flags для QA:

  • Тестируйте оба состояния каждого флага (включён и выключен)
  • Тестируйте комбинации флагов, если функции взаимодействуют
  • Убедитесь, что отключение флага чисто откатывает к старому поведению
  • Убирайте старые флаги — устаревшие флаги создают технический долг и увеличивают сложность тестирования
// Test both flag states
test('checkout flow with new feature enabled', async () => {
  await setFeatureFlag('new-checkout-flow', true);
  // ... test new behavior
});

test('checkout flow with new feature disabled', async () => {
  await setFeatureFlag('new-checkout-flow', false);
  // ... test legacy behavior
});

Тестирование самого пайплайна развёртывания

Пайплайн развёртывания — это программное обеспечение. В нём могут быть баги. Тестируйте его.

Что проверять:

  • Откат работает корректно (инициируйте откат и убедитесь, что старая версия восстановлена)
  • Health check действительно обнаруживают нездоровые экземпляры (разверните сломанную версию и убедитесь, что пайплайн останавливается)
  • Дымовые тесты запускаются на правильном окружении (а не случайно тестируют staging, когда вы думаете, что тестируете продакшен)
  • Уведомления срабатывают при сбое (намеренно сломайте пайплайн и убедитесь, что оповещения в Slack/email приходят)

Практическое упражнение

  1. Определите, какую стратегию развёртывания использует ваша команда. Если вы не знаете, спросите у DevOps-/платформенной команды.
  2. Отобразите, где в вашем процессе развёртывания сейчас запускаются тесты. Есть ли пробелы?
  3. Напишите набор дымовых тестов, который может запускаться на любом окружении (настраиваемый через BASE_URL)
  4. Если вы используете канареечное развёртывание, определите ключевые метрики, которые вы должны мониторить во время раскатки
  5. Протестируйте процедуру отката. Можете ли вы откатить развёртывание менее чем за 5 минут?
  6. Если ваша команда использует feature flags, напишите тесты, покрывающие оба состояния флага для текущей функции