CI/CD: что это такое и зачем нужно, если вы не devops
CI/CD звучит как что-то из мира людей в футболках с логотипами облаков, а на деле это просто ответ на вопрос «как код с вашего ноутбука оказывается у пользователей и не ломает всё по дороге».
Разберём без мистики.
Две буквы, два смысла
CI, непрерывная интеграция. Каждое изменение автоматически собирается и проверяется: линтеры, тесты, сборка. Цель в том, чтобы поломка обнаружилась через пять минут после пуша, а не через неделю от тестировщика.
CD, непрерывная доставка или развёртывание. Прошедшие проверку изменения автоматически едут дальше: на тестовый стенд, а в зрелых командах и в прод. Разница между доставкой и развёртыванием в том, нажимает ли человек кнопку выкатки или всё едет само.
Первое без второго встречается часто, второе без первого почти никогда, потому что автоматически выкатывать непроверенное это способ быстро потерять прод.
Как выглядит пайплайн
Типичная цепочка после пуша в ветку:
Проверка стиля и статический анализ. Секунды, ловит опечатки и мусор.
Модульные тесты. Минуты, ловит логические ошибки.
Сборка артефакта: контейнер, пакет, бинарник. Собирается один раз и дальше едет тот же самый по всем окружениям.
Интеграционные тесты на поднятом окружении с базой и зависимостями.
Выкатка на тестовый стенд, автоматическая.
Выкатка в прод, по кнопке или автоматически.
Ключевая идея, которую любят спрашивать: артефакт собирается один раз. Если для прода вы пересобираете заново, вы выкатываете не то, что тестировали.
Окружения
Обычно три-четыре: локальное, тестовое, препрод, прод. Смысл в постепенном приближении к боевым условиям.
Главная проблема окружений это расхождение. Тестовое на трёх записях, прод на десяти миллионах, и запрос, который летал, внезапно висит. Полностью не лечится, но сокращается: одинаковые версии зависимостей, похожая по структуре база, реалистичные объёмы данных хотя бы на препроде.
Выкатка без даунтайма
Несколько стандартных подходов, названия которых стоит знать.
Постепенная замена. Инстансы обновляются по одному, старая и новая версии какое-то время работают вместе. Отсюда требование совместимости: новая версия должна уметь работать со старой схемой данных, и наоборот.
Сине-зелёная. Поднимается полная копия с новой версией, трафик переключается разом. Откат мгновенный, зато нужно двойное железо.
Канареечная. Новая версия получает малую долю трафика, за метриками смотрят, потом расширяют. Дороже в настройке, но ловит проблемы до того, как их увидят все.
Отдельно про флаги функциональности: код уезжает в прод выключенным и включается настройкой. Это разделяет выкатку и релиз, что сильно снижает нервозность.
Миграции базы: где обычно больно
Самое частое место, где ломается автоматическая выкатка.
Правило простое: изменения схемы должны быть совместимы в обе стороны хотя бы на один релиз. Добавили колонку, выкатили код, который её пишет, потом код, который её читает, и только потом убрали старое поле. Три шага вместо одного, зато откат возможен на каждом.
Второе правило: миграция не должна блокировать таблицу надолго. На большой таблице невинное изменение типа колонки останавливает сервис на минуты.
Откат
Возможность откатиться важнее скорости выкатки. Если что-то пошло не так, нужно вернуть предыдущую версию за минуты, а не чинить в спешке.
Что для этого нужно: тот же артефакт предыдущей версии под рукой, обратимые миграции, отсутствие необратимых операций в момент выкатки.
На собеседовании вопрос «как вы откатываетесь» показывает зрелость команды лучше, чем рассказ про модный стек.
Что это даёт лично разработчику
Даже если вы не трогаете конфиги пайплайна, вы живёте внутри него каждый день.
Обратная связь за минуты вместо дней. Меньше страха выкатывать, потому что откат дёшев. Меньше ручной рутины и человеческих ошибок при выкладке. Возможность релизить маленькими кусками, а маленькие куски ломают прод реже больших.
Что спрашивают на собеседовании
Чем CI отличается от CD. Как выглядит ваш пайплайн: что за стадии и что происходит на каждой. Почему артефакт собирается один раз. Как выкатываетесь без даунтайма. Что делаете с миграциями базы. Как откатываетесь. Что такое флаг функциональности.
Обычно это часть общего разговора про процессы, а не отдельная секция. Но ответы показывают, работали вы в команде со зрелыми процессами или выкладывали руками по ssh.
Как потрогать самому
Если в вашем проекте пайплайна нет, соберите простейший на своём пет-проекте: пуш запускает линтер и тесты, при успехе собирается контейнер. Час работы, зато появляется предметный опыт и понятный ответ на собеседовании.
Проверить себя по смежным темам можно в Сеньорчике: блоки по инфраструктуре, деплою и процессам входят в треки бэкенда и дата-инженерии. Вопросы с реальных собеседований, с вариантами ответов и разбором, движок возвращает темы, где вы ошибаетесь. Десять минут в день в Telegram, бесплатно.