View on GitHub

wiki

Technical Excellence Wiki

Непрерывная интеграция (CI)

Оглавление

  1. Определение
  2. Источники
  3. Зачем CI
  4. Базовая договоренность команды
  5. Ключевые практики CI
  6. Вспомогательные практики
  7. Ежедневный цикл разработчика в CI
  8. Коротко
  9. Вопросы и ответы

Определение

Непрерывная интеграция (Continuous Integration, CI) — это практика разработки ПО, при которой участники команды часто интегрируют свои изменения в общую основную ветку, а каждая интеграция сразу проверяется автоматической сборкой и тестами, чтобы как можно раньше находить ошибки интеграции и не накапливать «интеграционный ад».

В двух словах

CI = частые маленькие интеграции в одну основную ветку + самопроверяемая автоматическая сборка после каждой интеграции + немедленная починка сломанной сборки.

Источники

  1. Перевод статьи Мартина Фаулера на Scrum.ru: scrum.ru
  2. James Shore: jamesshore.com — на русском: «Непрерывная интеграция за доллар в день» (Хабр)
  3. Martin Fowler — “Continuous Integration Certification”: martinfowler.com
  4. LeSS (Less.works) — Technical Excellence / Continuous Integration: less.works
  5. Trunk-Based Development: trunkbaseddevelopment.com — на русском: trunkbaseddevelopment.ru
  6. Обложка: Extreme Programming Explained
    Extreme Programming Explained — Kent Beck (Pearson — на русском: «Экстремальное программирование»)
  7. Обложка: Continuous Integration
    Continuous Integration: Improving Software Quality and Reducing Risk — Paul M. Duvall, Steve Matyas, Andrew Glover (MartinFowler.com (Books) — на русском: Лабиринт)
  8. Обложка: Continuous Delivery
    Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation — Jez Humble, David Farley (Addison-Wesley / InformIT — на русском: Вильямс)
  9. Видео: “What is Continuous Integration?”
  10. Видео: “Top 10 Rules For Continuous Integration”

Зачем CI

Базовая договоренность команды

CI начинается не с инструмента, а с договорённости:

Код в репозитории всегда должен успешно собираться и проходить тесты.

Если этот принцип не является нормой, ни CI‑сервер, ни «ночные сборки» не дадут эффекта.

Практичный способ “проверить, что у вас действительно CI, а не CI‑театр” — быстрый тест (в пересказе Фаулера):

Если сборка и проверки выполняются только на изолированных feature‑ветках, а интеграция в общую mainline происходит редко, команда часто попадает в «CI‑театр»: инструмент есть, а ценность CI (минимизация рискованных интеграций) — нет.

Ключевые практики CI

Вспомогательные практики

Эти практики помогают сохранить частые интеграции даже при больших изменениях и/или росте команды.

Ежедневный цикл разработчика в CI

  1. Обновиться до актуальной основной ветки.
  2. Сделать небольшое изменение (включая обновление/добавление тестов).
  3. Запустить сборку и тесты локально.
  4. Перед коммитом ещё раз обновиться, разрешить конфликты, снова прогнать сборку/тесты.
  5. Закоммитить в основную ветку.
  6. Убедиться, что интеграционная сборка основной ветки прошла; если нет — сразу исправить или откатить.

Коротко

CI = частые маленькие интеграции в одну основную ветку + самопроверяемая автоматическая сборка после каждой интеграции + немедленная починка сломанной сборки.

Вопросы и ответы

Нужен ли жёсткий запрет «не ломать сборку» и публичный поиск виноватых?

Цель CI — быстро обнаруживать дефекты и быстро их устранять. Жёсткие запреты и стыжение обычно приводят к обратному: люди начинают бояться интегрироваться и копят изменения. Лучше сделать обратную связь быстрой, убрать барьеры для «остановиться и исправить», и договориться: если mainline красная — это приоритет №1 для команды.

Совместимо ли обязательное code review до merge с CI?

Может быть, но часто это увеличивает “стоимость” интеграции и провоцирует слияние большими пачками. Если это начинает мешать частой интеграции, используйте альтернативы: парное/mob‑программирование (ревью в процессе), сильные автоматические проверки, а часть ревью выполняйте позже на небольших порциях уже интегрированного кода.

С чего начинается CI в команде?

Не с инструмента, а с договорённости: код в репозитории всегда должен успешно собираться и проходить тесты. Без этого ни CI‑сервер, ни ночные сборки не дадут устойчивого эффекта.

Почему «ночные сборки» — это не CI?

Потому что сигнал приходит слишком поздно. В CI основная ветка проверяется после каждого коммита (или с минимальной задержкой), чтобы ошибки интеграции находились сразу.

Как часто стоит интегрироваться?

Ориентир — минимум ежедневно, на практике часто несколько раз в день небольшими порциями изменений.

Чем «CI‑сервер на feature‑ветках» отличается от CI?

В CI команда регулярно интегрируется в общую mainline и держит её зелёной. Если проверки крутятся в изоляции на feature‑ветках, а интеграция в mainline происходит редко, то ошибки интеграции всё равно копятся и проявляются поздно — это часто называют «CI‑театром».

Что делать, если commit build стал дольше 10 минут?

Обратная связь становится слишком медленной для частых интеграций. Типичные меры: параллелизация тестов, отделение долгих проверок в отдельные стадии конвейера, кеширование зависимостей/артефактов, пересмотр объёма проверок именно в commit build.

Как масштабировать CI, когда продукт большой и тесты медленные?

Обычно помогает сочетание: (1) ускорение сборки (параллелизация, улучшение зависимостей, рефакторинг медленных тестов, более мощное железо), (2) многоэтапный пайплайн с очень быстрым “нижним” уровнем и более медленными уровнями выше, (3) визуальный сигнал статуса сборки, чтобы команда реагировала быстро и не копила интеграции.

Как делать большие изменения без долгоживущих веток?

Чаще всего помогает комбинация feature flags (сливать код, не включая функциональность) и branch by abstraction (вводить новый слой/интерфейс и постепенно переводить вызовы). Это позволяет продолжать часто интегрироваться в mainline.