Настройте CI/CD и первый деплой проекта с нуля
Планирование и настройка CI/CD пайплайна: выбор хостинга, конфигурация деплоя, настройка автотестов. Используйте при первоначальной настройке деплоя или миграции на новую платформу.
Как агент работает
Первый шаг — инвентаризация репозитория через sandbox_bash, а не опрос команды: lock-файлы, каталог миграций и конфиги проверяются сами. Дальше площадка выбирается по критериям, а не по списку платформ, который устаревает за квартал: гиперскейлеры вроде Yandex Cloud и VK Cloud дают managed Postgres и S3-совместимое хранилище, провайдеры инфраструктуры — выделенные серверы под постоянную нагрузку, массовый хостинг — низкий порог входа, а свой VPS — максимум контроля и все обязанности по бэкапам.
Базовое требование к размещению — 152-ФЗ «О персональных данных», и ответственность за обработку несёт оператор, то есть вы, а не хостер. Проверяются две вещи: локализация, при которой сбор, запись, хранение и извлечение данных граждан РФ идут в базах на территории России, включая реплики и бэкапы, — про дампы в зарубежное S3 забывают чаще всего; и первичность, из-за которой схема «форма на зарубежном сервисе, потом синхронизируем» не спасает, ведь первый раз данные записались не там.
Проверки в CI выстраиваются от дешёвых к дорогим: секунды на линтер и сверку lock-файла с манифестом, десятки секунд на типы и юнит-тесты, минуты на сборку образа и прогон миграций туда и обратно, десятки минут на E2E и нагрузочные. Бюджет — красный ответ на очевидную ошибку до 3 минут и полный вердикт по PR за 10-15 минут. Ключ кеша — хеш lock-файла плюс версия рантайма, а не имя ветки, и в сборке релизного образа кеш не участвует никогда: артефакт собирается один раз и продвигается по контурам по digest, а не по тегу.
Миграции не применяются автоматически при деплое: на PR они гоняются на пустой базе и на копии структуры прода, отдельная задача показывает сгенерированный SQL и затронутые таблицы, дальше идут ручное подтверждение и проверка, что свежий бэкап читается, а не просто создан. Health-эндпоинтов должно быть два: liveness без внешних вызовов, чей отрицательный ответ означает перезапуск, и readiness с проверкой БД, очереди и переменных, выводящий экземпляр из балансировки. Readiness не ходит в API маркетплейса — иначе чужие плановые работы уведут весь трафик.
Навык не называет цены площадок: они меняются быстрее, чем живёт текст, поэтому сравнивается модель тарификации, а смета считается по калькулятору площадки на объёмах пользователя. Пороговые значения алертов — 5xx выше 1% за 5 минут подряд, p95 вдвое выше обычной за 10 минут — тоже стартовые и через две недели пересчитываются по своим данным. Дамп прод-базы в стейджинг навык не предлагает вовсе: это перенос персданных в контур со слабой защитой, вместо него синтетика по схеме или обезличивание до попадания в контур.
1. Инвентаризация: до первой строки конфига
Lock-файлы, каталог миграций и конфиги проверь сам через sandbox_bash — это минута и точнее опроса.
2. Выбор площадки
2.1 Критерии важнее списка
Список платформ устаревает за квартал, критерии — нет; заполненная таблица и есть обоснование.
Цены не называй — сравнивать надо модель тарификации; смета — по калькулятору площадки на объёмах пользователя.
2.2 Локализация персданных
Базовый закон — 152-ФЗ; ответственность несёт оператор (вы), не хостер. Две проверяемые вещи:
- Локализация. Сбор, запись, хранение и извлечение персданных граждан РФ — в базах на территории России: боевая БД, реплики и бэкапы. Бэкап забывают чаще всего — база в РФ, а дампы льются в зарубежное S3.
- Первичность. «Форма на зарубежном сервисе → потом синхронизируем в РФ» не спасает: первый раз данные записались не там. Сюда же зарубежная CRM и аналитика с телефоном в событии.
2.3 Российские площадки: отличия по существу
- Гиперскейлеры (Yandex Cloud, VK Cloud). Managed Postgres с восстановлением на точку времени, S3-совместимое хранилище, Kubernetes, Terraform-провайдер. Стоимость труднее всего предсказать, легко прирасти к их сервисам.
- Провайдеры инфраструктуры (Selectel и подобные). Выделенные серверы, приватные сети; managed-надстроек меньше. Берут при тяжёлой постоянной нагрузке.
- Массовый хостинг с приложенческим слоем (Timeweb и подобные). Приложение из репозитория, база, домен, сертификат; низкий порог входа. Упирается в приватную сеть и свои раннеры.
- Свой VPS / выделенный сервер / машина в офисе. Максимум контроля — и обязанности: обновления ОС, сертификаты, файрвол, бэкапы и проверенное восстановление.
Git-платформа выбирается отдельно, вопрос один: что с релизами, если она завтра недоступна. «Не сможем выкатить фикс» — повод держать зеркало репозитория.
2.4 Когда зарубежная площадка допустима
Три условия сразу: нет персданных граждан РФ, есть законный способ оплаты юрлицом, сервис не единственная точка отказа для выкатки. Обычно проходят статика, CDN, внешний мониторинг. Риски: отказ карты отключает сервис по неоплате, блокировка аккаунта приходит без уведомления — держи локальные копии образов и дампов.
3. Порядок проверок в CI
3.1 Бюджет времени
Красный ответ на очевидную ошибку — до 3 минут, полный вердикт по PR — до 10–15 минут. Дольше 15 минут разработчик уходит в другую задачу; дольше 30 — мержат, не дожидаясь зелёного. Не влезаешь — измерь по шагам: обычно 80% съедают два.
3.2 Очередь от дешёвых проверок к дорогим
- Секунды: линтер, валидность конфигов, сверка lock-файла с манифестом — без зависимостей и без БД.
- Десятки секунд: типы, юнит-тесты без внешних сервисов, поиск секретов в диффе.
- Минуты: сборка образа, интеграционные тесты с БД в контейнере, прогон миграций туда и обратно.
- Десятки минут: E2E, нагрузочные, тесты против песочниц внешних API.
Уровни 1–2 — на каждый push, 3 — на PR, 4 — на PR в основную ветку и ночью: ночной прогон ловит зависящее от времени и чужих сервисов.
3.3 Параллельность и её предел
Уровни 1 и 2 независимы — гоняй параллельно, сборку образа вместе с линтером. Тесты дели по измеренному времени, а не по числу файлов: один интеграционный файл часто длиннее сотни юнитов, а смысл деления теряется, когда старт задачи сравним с куском работы (30–60 секунд).
3.4 Кеш зависимостей и когда он врёт
Ключ кеша — хеш lock-файла плюс версия рантайма и хеш базового образа: ключ по имени ветки значит, что после смены зависимостей установится старый набор.
Главный режим отказа: кеш скрывает сломанную установку — зависимость удалили из реестра, CI зелёный из кеша, чистая сборка падает. Признак: «на CI собирается, у нового нет»; лечится ночным прогоном без кеша. Кеш никогда не участвует в сборке релизного образа: он собирается из фиксированных версий с нуля.
4. Воспроизводимость сборки
«У меня собиралось» — почти всегда плавающие версии. Четыре слоя:
Проверка: собери один коммит дважды с интервалом и сравни списки пакетов. Различаются — воспроизводимости нет, есть везение.
5. Секреты
5.1 Где хранить
По возрастанию зрелости: переменные CI с маскированием и ограничением на защищённые ветки → секреты платформы деплоя → менеджер секретов (Vault, KMS) с короткоживущими токенами.
Минимум: секретов нет в репозитории и его истории; переменные недоступны прогонам из форков; у прода и стейджинга разные значения — один ключ платёжного шлюза на оба контура значит, что тестовый прогон может списать реальные деньги. Поиск секретов — pre-commit хуком: в CI он ловит поздно, коммит уже в истории.
5.2 Почему маскирование не защищает
Маскирование заменяет точное вхождение значения и проваливается предсказуемо: секрет напечатан по частям или изменённым (URL-кодирование, base64, обрезка); секрет внутри выведенной целиком структуры (дамп окружения, set -x, трассировка со строкой подключения); секрет ушёл в артефакт — отчёт тестов, HAR-файл, скриншот, дамп ответа API.
5.3 Ротация
У каждого секрета есть владелец и запись «где выпускается, где применяется, где отзывается». Система обязана переживать две одновременно действующие версии ключа — иначе ротация равна простою и её будут откладывать. Уход сотрудника с доступом к CI — обязательный триггер замены.
6. Окружения и тестовые данные
Изолируется не только БД: своё объектное хранилище, очередь, ключи внешних API, отправитель писем и СМС, ключи подписи. Классическая авария: стейджинг с прод-ключом рассылок отправил письма всей базе, потому что «это же тест». На нижних контурах запрещай исходящие вызовы наружу по умолчанию: тогда «случайно ушло в прод» технически невозможно, а не запрещено инструкцией.
6.1 Почему копия прода в стейджинге — утечка
Дамп прод-базы переносит персданные в контур, где доступ шире, защита слабее, а бэкапы никто не считает: обработка вне заявленных целей. Плюс тестовое письмо уходит клиенту. Вместо дампа:
- Синтетика по схеме: правдоподобные ФИО, телефоны из диапазонов для вымышленных номеров, почта на
example.com, ИНН и карты, проходящие контрольную сумму, но не существующие. - Обезличивание при выгрузке, если нужны объём и распределение: маскируй до попадания в стейджинг, стабильной заменой, иначе связи между таблицами рассыплются. Оно слабое — «город + дата рождения + сумма заказа» часто восстанавливает личность.
7. Артефакты и версионирование образов
Артефакт собирается один раз и продвигается по контурам без пересборки: пересборка перед продом — едет не то, что тестировали.
Версия — для человека, коммит — для связи «что в проде с какой строкой кода», digest — для деплоя. Разворачивай по digest: тег можно перезаписать, digest — нет; latest в проде — прямая дорога к «откатились, а версия та же». Храни прод-образы 30 дней или 10 версий: политика очистки registry обнаруживается в момент, когда откат уже нужен.
8. Миграции БД в пайплайне
Миграция — единственный шаг деплоя, необратимый по данным: код откатывается подменой образа за секунды, удалённая колонка — только из бэкапа. Автоприменение при деплое опасно втройне: при откате кода схема остаётся новой; экземпляры гонятся за одной блокировкой; никто не читает SQL перед применением.
- На каждом PR — прогон на пустой базе и на копии структуры прода: ловит синтаксис и конфликты имён.
- Отдельная задача показывает сгенерированный SQL и затронутые таблицы с числом строк.
- Ручное подтверждение с фиксацией, кто подтвердил.
- Перед применением — свежий бэкап и проверка, что он читается, а не просто создан.
- Применение с таймаутом на блокировку: миграция, зависшая на блокировке активной таблицы, копит очередь и роняет сервис вернее ошибки.
Правило совместимости: новая схема работает со старым кодом, иначе откат невозможен. Порядок: добавили nullable-колонку → код пишет в обе → заполнили данные → код читает новую → следующим релизом удалили старую.
Опасные операции: NOT NULL с проверкой, смена типа колонки, индекс без конкурентного режима, переименование — блокировка на время, пропорциональное размеру таблицы:
Миллион строк в затронутой таблице — миграцию нельзя ставить в рабочие часы.
10. Health-check
200 OK без логики проверяет одно: процесс жив и порт открыт — и балансировщик держит инстанс с мёртвой БД, отдающий пятисотки. Нужны два эндпоинта:
- Liveness — «процесс не завис»: никаких внешних вызовов, ответ за единицы миллисекунд, отрицательный ответ означает перезапуск. Проверка БД здесь превратит недоступность базы в перезапуск всех экземпляров.
- Readiness — «может обслуживать трафик сейчас»: БД (простейший запрос с таймаутом 1–2 секунды), очередь, обязательные переменные, применённость миграций. Отрицательный ответ выводит из балансировки без перезапуска.
Readiness не зависит от необязательных внешних сервисов: проверка, ходящая в API маркетплейса, при его плановых работах выведет из ротации весь сервис. Их состояние — в диагностический эндпоинт для людей:
После настройки останови БД и убедись: liveness зелёный, readiness красный, трафик уведён. Health-check, не проверенный отключением зависимости, не проверен.
11. Логи и алерты без выгорания
Логи структурированные (JSON), одна запись — одно событие; поля: время, уровень, сервис, версия, идентификатор запроса и пользователя. Идентификатор запроса протаскивается через все сервисы — без него разбор инцидента станет сопоставлением по времени. Пароли, токены и тела запросов в логи не попадают; логи с персданными хранятся там же, где база.
Алерт оправдан при двух условиях: это видит пользователь и человек может что-то сделать сейчас. Остальное — дашборд или дайджест.
| Сигнал | Порог | Окно | Куда |
|---|---|---|---|
| Доля ответов 5xx | > 1% запросов | 5 минут подряд | Немедленно дежурному |
| Задержка p95 | вдвое выше обычной | 10 минут подряд | Немедленно дежурному |
| Недоступен снаружи | нет ответа | 2 проверки подряд | Немедленно дежурному |
Пороги стартовые — через две недели пересчитай по своим данным. Алерт, срабатывающий чаще раза в неделю без действий человека, чини или удаляй: пять ложных подряд — и настоящее проигнорируют. Против шума — окно вместо мгновенного значения и группировка.
Отдельно алертай на бизнес-метрику: «ноль заказов за час днём» ловит сломанную интеграцию с маркетплейсом, когда техника зелёная — сервис исправно отвечает 200 на пустой список.
12. Типовые ошибки первой настройки
- Автоприменение миграций при деплое → откат кода невозможен, схема ушла вперёд.
- Один набор секретов на все контуры → тестовый прогон списывает деньги и шлёт СМС клиентам.
- Кеш по имени ветки → CI зелёный на старых зависимостях, чистая сборка падает.
- Дамп прода в стейджинге → персданные в слабозащищённом контуре и письмо реальному клиенту.
- Health-check вида
return "ok"→ балансировщик держит инстанс с мёртвой БД. - Деплой без ограничения одновременности → два прогона катят разные коммиты, побеждает финишировавший вторым.
- Прогон из форка получает прод-секреты → нужны защищённые переменные и запрет автозапуска внешних веток.
13. План внедрения для команды, которая деплоит руками
Ориентир — неделя на шаг; всё сразу не предлагай. Через месяц после последнего шага пересчитай пороги алертов и проверь восстановление из бэкапа.
План держи задачей с подзадачами через manage_task, решения — в documents. На выходе: таблица выбора площадки, карта данных, конфигурации CI и деплоя, реестр секретов без значений, таблица алертов, процедура отката.
Похожие навыки
Попробуйте этот навык
Зарегистрируйтесь и используйте навык «Настройка CI/CD» бесплатно.