Сборка раз в неделю «руками старшего» – источник сюрпризов. Кто-то закоммитил код, который не компилируется, кто-то забыл добавить файл в репозиторий, тесты не гоняли с прошлого спринта. К релизу набегает гора ошибок, и разбирать их приходится под дедлайн. Непрерывная интеграция убирает эту боль простым правилом: каждый коммит автоматически собирается и проверяется. Сломал сборку – узнал об этом через минуты, а не через две недели. Ниже – как мы поднимаем такой конвейер на проектах для бизнеса и госсектора.
Из чего собирается конвейер
Базовый стек, который мы ставим на наших площадках, – Jenkins плюс система контроля версий (Git или SVN). Jenkins слушает репозиторий через хук или опрос, и на каждый push запускает job. Внутри job – последовательность шагов: чекаут кода, сборка (Maven, Ant, MSBuild – по платформе проекта), прогон юнит-тестов, статический анализ, упаковка артефакта.
Минимальный набор стадий, который окупается сразу:
- Компиляция. Код, который не собирается, не доходит до остальной команды.
- Юнит-тесты. Прогоняем на каждый коммит, билд красный – мержить нельзя.
- Статический анализ. FindBugs, Checkstyle, PMD ловят утечки и уязвимости до того, как они попадут в продакшен. После истории с Heartbleed в OpenSSL проверка зависимостей и предупреждений компилятора – не формальность.
- Артефакт. Версионированный пакет уходит в репозиторий (Nexus, Artifactory), а не собирается заново перед каждым деплоем.
Конвейер должен укладываться в несколько минут. Если сборка идёт полчаса, разработчик не дождётся результата и уйдёт писать дальше – обратная связь теряет смысл.
Где CI спотыкается о реальность
На монолите CI работает, но медленно: один большой билд, общие тесты, долгая упаковка. Когда мы разносим монолит на модули, каждый компонент собирается и тестируется отдельно, билды идут параллельно, а сломанный модуль не блокирует остальные. Конвейер и декомпозиция усиливают друг друга.
Второй камень – окружение сборки. Тесты, которые зелёные на машине разработчика и красные на сервере, обычно упираются в разницу версий JDK, библиотек или настроек локали. Лечится фиксацией версий и чистым агентом сборки: Jenkins-агент не должен тащить артефакты прошлых билдов.
Для госпроектов добавляется регуляторный слой. CI-сервер, репозиторий артефактов и тестовые данные размещаем на инфраструктуре в нужном контуре – это часть аудита размещения данных, который мы проводим до старта разработки. Сборка с боевыми данными в облаке за периметром организации – прямой путь к замечанию проверяющего.
Что это даёт команде
Конвейер на каждый коммит меняет дисциплину разработки. Красный билд становится событием, на которое реагируют сразу, а не «потом разберёмся». Релиз перестаёт быть авралом: артефакт уже собран, протестирован и лежит в репозитории – остаётся развернуть проверенную версию. Новый разработчик видит правила игры в первый день: запушил – получил вердикт.
Поднять Jenkins за час может любой, а вот выстроить сборку, которая держит нагрузку команды, переживает релизы и соответствует требованиям заказчика, – отдельная работа. От агентов сборки и репозитория артефактов до размещения в требуемом контуре всё это держится на продуманной инфраструктуре под конкретный стек, а не на одном настроенном на коленке job.
Начните с малого – компиляция и юнит-тесты на каждый коммит. Этого хватит, чтобы перестать ловить сюрпризы перед релизом. Остальное наращивается по мере роста проекта.