Что такое CI/CD?
CI/CD расшифровывается как Continuous Integration и Continuous Delivery (или Continuous Deployment). Это набор практик и инструментов, автоматизирующих сборку, тестирование и выпуск программного обеспечения. Для QA-инженеров понимание CI/CD больше не является опциональным — это ключевая компетенция, которая отличает современных тестировщиков от тех, кто застрял на ручных процессах.
В традиционном рабочем процессе разработчики пишут код неделями, а затем передают его QA для тестирования. Баги, найденные через недели после написания кода, дорого исправлять. CI/CD устраняет эту задержку, автоматизируя цикл сборка-тестирование-деплой, чтобы каждое изменение кода проверялось за минуты.
Continuous Integration (CI)
Continuous Integration — это практика объединения всех рабочих копий разработчиков в общую основную ветку несколько раз в день. Каждое объединение запускает автоматический процесс:
- Код загружается из репозитория
- Зависимости устанавливаются и приложение компилируется
- Запускаются автоматические тесты — unit-тесты, линтинг, статический анализ
- Результаты сообщаются команде
Ключевой принцип: если тест падает, сборка считается «сломанной» и её исправление становится главным приоритетом команды. Никто не коммитит новый код поверх сломанной сборки.
Почему CI важен для QA
- Раннее обнаружение багов: Баги обнаруживаются через минуты после появления, а не через недели
- Снижение риска интеграции: Маленькие, частые слияния вызывают меньше конфликтов, чем большие и редкие
- Автоматическая регрессия: Каждый коммит автоматически проверяется существующими тестами
- Общая ответственность: Разработчики не могут игнорировать падающие тесты, потому что пайплайн блокирует их работу
Continuous Delivery (CD)
Continuous Delivery расширяет CI, обеспечивая постоянную готовность ПО к развёртыванию. После прохождения всех автоматических тестов код может быть выпущен в продакшен в любой момент — но человек должен нажать кнопку.
Процесс развёртывания автоматизирован и воспроизводим. Тот же пайплайн, который разворачивает в staging, может развернуть в продакшен с одним шагом одобрения.
Пайплайн развёртывания
Типичный CD-пайплайн состоит из этапов, которые последовательно повышают уверенность:
Коммит → Сборка → Unit-тесты → Интеграционные тесты → Деплой в Staging → E2E-тесты → Performance-тесты → Security Scan → [Ручное одобрение] → Деплой в продакшен
Каждый этап действует как quality gate. Если любой этап проваливается, пайплайн останавливается и команда получает уведомление. Код, прошедший все gates, считается готовым к продакшену.
Continuous Deployment
Continuous Deployment идёт на шаг дальше CD: каждое изменение, прошедшее автоматический пайплайн, автоматически разворачивается в продакшен. Ручное одобрение не требуется.
Это звучит рискованно, но работает, когда:
- Набор тестов полный и заслуживает доверия
- Мониторинг и алерты мгновенно обнаруживают проблемы в продакшене
- Механизмы отката быстры и надёжны
- Feature flags контролируют доступность новой функциональности
Компании вроде Netflix, Amazon и Google делают тысячи деплоев в день, используя continuous deployment.
Этапы пайплайна и роль QA
Этап 1: Сборка и статический анализ
CI-сервер компилирует код и запускает инструменты статического анализа (линтеры, проверку типов, проверку стиля кода).
Участие QA: Убедиться, что правила статического анализа включают проверки, связанные с качеством. Проверить, какие правила включены и обнаруживают ли они типичные баги в вашей кодовой базе.
Бюджет времени: 1-5 минут.
Этап 2: Unit-тесты
Быстрые изолированные тесты проверяют отдельные функции и классы.
Участие QA: Проверять отчёты о покрытии unit-тестами. Выявлять непротестированные пути кода и координировать с разработчиками для заполнения пробелов.
Бюджет времени: 2-10 минут.
Этап 3: Интеграционные тесты
Тесты проверяют совместную работу компонентов — API-контракты, операции с базой данных, межсервисное взаимодействие.
Участие QA: Писать и поддерживать интеграционные тесты, особенно тесты на уровне API. Определять, какие интеграции критично тестировать.
Бюджет времени: 5-15 минут.
Этап 4: Деплой в Staging
Приложение разворачивается в предпродакшен-окружении, максимально близком к продакшену.
Участие QA: Проверить здоровье деплоя. Убедиться в корректности конфигураций, миграций и переменных окружения.
Бюджет времени: 2-5 минут.
Этап 5: End-to-End тесты
Автоматические тесты имитируют реальные пользовательские сценарии через полный стек приложения.
Участие QA: Владеть E2E-набором тестов. Решать, какие критические пользовательские сценарии должны пройти перед любым релизом.
Бюджет времени: 10-30 минут.
Этап 6: Performance и безопасность
Нагрузочные тесты, стресс-тесты и сканирования безопасности проверяют соответствие приложения нефункциональным требованиям.
Участие QA: Определять базовые показатели производительности и правила сканирования безопасности. Анализировать результаты и решать, являются ли проблемы блокерами.
Бюджет времени: 10-20 минут.
Распространённые инструменты CI/CD
| Инструмент | Тип | Лучше всего для |
|---|---|---|
| Jenkins | CI/CD self-hosted | Максимальная гибкость и экосистема плагинов |
| GitHub Actions | CI/CD в облаке | Проекты на GitHub |
| GitLab CI | CI/CD облако/self-hosted | Проекты на GitLab |
| CircleCI | CI/CD в облаке | Быстрые сборки, Docker-first процессы |
| Azure DevOps | CI/CD в облаке | Интеграция с экосистемой Microsoft |
| TeamCity | CI/CD self-hosted | Экосистема JetBrains, .NET-проекты |
У каждого инструмента свои сильные стороны. В следующих трёх уроках мы подробно рассмотрим Jenkins, GitHub Actions и GitLab CI — три наиболее используемые CI/CD-платформы.
Анти-паттерны CI/CD
Пайплайн «У меня на машине работает»
Когда CI-окружение отличается от окружений разработки и продакшена, тесты проходят локально, но падают в CI (или наоборот). Решение: используйте контейнеры (Docker) для обеспечения идентичных окружений повсюду.
Медленный пайплайн
Пайплайн, который выполняется более часа, даёт обратную связь слишком поздно. Разработчики переключаются на другие задачи и теряют фокус. Решение: параллелизуйте этапы тестов, используйте кэширование и держите каждый этап в рамках бюджета времени.
Игнорируемый пайплайн
Когда команда привычно игнорирует падения тестов или перезапускает до успеха, пайплайн становится декоративным, а не защитным. Решение: рассматривайте сломанные сборки как проблему наивысшего приоритета. Никогда не мержите код с падающими тестами.
Узкое место ручной проверки
Если один QA-инженер должен вручную одобрять каждый деплой, он становится узким местом, замедляющим всю команду. Решение: автоматизируйте quality gates с чёткими критериями успеха/неудачи. Оставьте ручное тестирование для исследовательских сессий, а не для одобрения gates.
Упражнение: Соотнесите свой текущий процесс с CI/CD
Подумайте о проекте, над которым вы работаете (или о гипотетическом, если вы только начинаете). Ответьте на эти вопросы:
- Как часто ваша команда интегрирует код? (Раз в день? Раз в спринт? В конце фичи?)
- Что происходит, когда тесты падают? (Сборка блокируется? Разработчики всё равно могут мержить?)
- Сколько времени проходит от коммита до деплоя в продакшен?
- Какой процент вашего тестирования автоматизирован vs. ручной?
Теперь соотнесите свой текущий процесс с уровнями зрелости CI/CD:
| Уровень | Практика | Ваша команда? |
|---|---|---|
| 0 - Без CI | Ручные сборки, нет автоматических тестов | |
| 1 - Базовый CI | Автоматические сборки при коммите, некоторые unit-тесты | |
| 2 - Полный CI | Полные автоматические тесты, сборки всегда проходят | |
| 3 - CD (Delivery) | Автоматический деплой в staging, ручное одобрение для продакшена | |
| 4 - CD (Deployment) | Полностью автоматический пайплайн до продакшена |
Руководство по оценке
Уровень 0-1: Сосредоточьтесь на создании автоматических сборок и написании unit-тестов. Это фундамент.
Уровень 2: Ваш CI надёжен. Следующий шаг: автоматизируйте деплой в staging-окружение и добавьте интеграционные/E2E-тесты.
Уровень 3: Вы практикуете Continuous Delivery. Чтобы достичь Уровня 4, нужны: полное покрытие тестами, мониторинг, feature flags и возможность быстрого отката.
Уровень 4: Вы на высшем уровне. Фокусируйтесь на оптимизации: сокращайте время пайплайна, улучшайте надёжность тестов и добавляйте практики chaos engineering.
Основы конфигурации пайплайна
Каждый CI/CD-инструмент использует конфигурационный файл, определяющий пайплайн. Хотя синтаксис различается, базовые концепции универсальны:
Триггеры
Когда должен запускаться пайплайн?
# Пример: Запуск при каждом push в main и на pull requests
on:
push:
branches: [main]
pull_request:
branches: [main]
Этапы (или Jobs)
Какие последовательные шаги должны выполняться?
stages:
- build
- test
- deploy
Steps
Какие команды выполняются внутри каждого этапа?
steps:
- name: Установить зависимости
run: npm ci
- name: Запустить unit-тесты
run: npm test
- name: Запустить E2E-тесты
run: npx playwright test
Артефакты
Какие файлы должны сохраняться между этапами?
Отчёты о тестах, скриншоты упавших E2E-тестов, отчёты о покрытии и результаты сборки — типичные артефакты. Они помогают отлаживать сбои после завершения пайплайна.
Переменные окружения и секреты
Конфигурационные значения и учётные данные, необходимые пайплайну:
env:
NODE_ENV: test
DATABASE_URL: ${{ secrets.TEST_DB_URL }}
Никогда не записывайте секреты непосредственно в конфигурационные файлы пайплайна. Используйте функцию управления секретами вашего CI/CD-инструмента.
Чеклист QA для готовности к CI/CD
Используйте этот чеклист для оценки готовности CI/CD-пайплайна вашей команды:
- Каждый коммит запускает автоматическую сборку
- Unit-тесты запускаются при каждой сборке с покрытием не менее 80%
- Интеграционные тесты проверяют критические API-контракты
- E2E-тесты покрывают топ-5-10 пользовательских сценариев
- Результаты тестов видны в pull/merge requests
- Упавшие тесты блокируют мерж
- Пайплайн выполняется менее чем за 30 минут (быстрый путь) или 1 час (полный путь)
- Тестовые окружения создаются автоматически
- Процесс отката задокументирован и проверен
- Алерты мониторинга срабатывают при проблемах в продакшене после деплоя
Ключевые выводы
- CI/CD — это не только забота DevOps — QA-инженеры должны понимать и влиять на каждый этап пайплайна
- Автоматизация — фундамент — ручные процессы не масштабируются в CI/CD-окружениях
- Скорость имеет значение — быстрые циклы обратной связи позволяют разработчикам исправлять проблемы, пока контекст свеж
- Quality gates должны быть автоматическими — пайплайн должен быть gatekeepr-ом, а не человек, вручную одобряющий каждое изменение
- Начинайте с того, что есть — даже базовый CI (автоматические сборки + unit-тесты) — это огромное улучшение по сравнению с ручными процессами