Релиз как спецоперация
Выкат делается раз в две недели, ночью, по чек-листу из сорока пунктов и силами одного человека. Его отпуск или больничный останавливает выпуск задач.
Выберите тему — соберём контекст
Строим конвейеры сборки, проверок и доставки для Laravel-проектов: автоматические тесты на каждый коммит, одинаковый артефакт на всех окружениях, blue-green и canary-выкат, откат одной командой.
Или сразу: +7 (962) 368-39-51 Telegram
Ниже — то, что мы чаще всего видим в проектах, которые развиваются годами и выросли из одного сервера.
Выкат делается раз в две недели, ночью, по чек-листу из сорока пунктов и силами одного человека. Его отпуск или больничный останавливает выпуск задач.
Полный прогон занимает час, поэтому запускается вручную перед релизом. Регресс находят пользователи, а не конвейер, и стоит это дороже любых тестов.
Схему меняют прямо на продакшене через консоль, без обратной совместимости. Изменение типа колонки требует остановки приложения и не откатывается назад.
Staging либо отсутствует, либо разошёлся с продакшеном по версиям, данным и настройкам настолько, что проверка на нём ничего не доказывает.
Пароли к базе, токены платёжных систем и ключи API лежат в .env на сервере, попадают в бэкапы, дублируются в переписке и не ротируются годами.
Если новая версия ломает сценарий оплаты, команда тратит один-три часа на разбор и восстановление вместо переключения на предыдущий релиз за минуту.
Объём подбираем под проект: кому-то достаточно конвейера и staging, кому-то нужны несколько окружений и canary-выкат с автооткатом.
Каждый merge request проходит одинаковый набор проверок, поэтому качество перестаёт зависеть от дисциплины конкретного разработчика.
Собранный и протестированный артефакт продвигается по окружениям без пересборки — исключаем ситуацию «на стенде работало, в проде другое».
Выбираем схему под ваш риск: полный blue-green для критичных релизов или канареечный выкат на часть трафика для частых изменений.
Конвейер должен жить без нас: оставляем документацию, дашборды и обученную команду, а не хрупкую конструкцию из скриптов.
Работаем итерациями: первая версия конвейера появляется в первые две недели и сразу используется, а не собирается «до идеала» в стороне.
Разбираем, как релиз устроен сегодня: сборка, тесты, миграции, окружения, доступы. Замеряем время выката и частоту сбоев, чтобы было с чем сравнивать.
Настраиваем стадии, кэш, параллельный прогон тестов и сборку образа. Добиваемся, чтобы конвейер падал на реальных ошибках, а не на нестабильных тестах.
Переносим конфигурацию и секреты в управляемое хранилище, описываем окружения кодом, включаем выбранную стратегию выката и откат одной командой.
Проводим несколько реальных релизов вместе с командой, доводим runbook, обучаем инженеров и передаём конвейер в сопровождение.
Пока выкат — это событие, к которому готовятся, его будут делать редко и большими порциями. Чем крупнее порция изменений, тем выше вероятность, что что-то сломается, и тем сложнее найти причину: в одном релизе смешаны новая оплата, обновление каталога и правки вёрстки.
Автоматизация меняет не только скорость, но и саму природу риска. Маленькие релизы, которые выкатываются несколько раз в день, проверяются быстрее и откатываются дешевле. Ошибка, найденная в течение десяти минут после выката, стоит на порядок меньше ошибки, найденной через два дня после ночного релиза.
Основная причина простоя при обновлении — не деплой кода, а изменение схемы базы данных. Пока миграция выполняется, старая версия приложения продолжает обслуживать запросы и уже не соответствует новой структуре таблиц.
Поэтому мы раскладываем изменение на три шага. На первом (expand) добавляем новую колонку или таблицу так, чтобы старая версия кода продолжала работать, и включаем двойную запись. На втором переводим чтение на новые поля и выпускаем релиз. На третьем (contract) удаляем старое — уже отдельным, спокойным релизом, когда убедились, что откат не понадобится. Тяжёлые операции — перестройку индексов, пересчёт больших таблиц — выполняем отдельными задачами под контролем метрик, а не внутри выката.
Отраслевой стандарт измерения — четыре показателя DORA. Частота развёртывания (deployment frequency) показывает, насколько быстро продукт доносит изменения до пользователей. Время от коммита до продакшена (lead time for changes) отражает длину очереди между решением и результатом. Доля неудачных изменений (change failure rate) говорит о качестве проверок в конвейере. Время восстановления (time to restore) — о том, насколько хорошо продуман откат.
Мы замеряем эти метрики до начала работ и после каждого этапа. Типичная картина в проекте, который приходит с ручным деплоем: релиз раз в две недели, lead time около месяца, время восстановления — часы. После внедрения конвейера, окружений и стратегии отката релизы идут несколько раз в неделю, а восстановление занимает минуты.
Для проекта на Laravel с одним-двумя окружениями — от трёх до шести недель до полностью автоматического выката. Первая версия конвейера появляется на первой неделе и сразу используется командой, дальше добавляем окружения, миграции и стратегию отката. Системы из нескольких сервисов с собственной инфраструктурой занимают от двух месяцев.
Нет. Для проекта на классическом сервере конвейер может собирать артефакт и раскладывать файлы с переключением симлинка — это уже даёт воспроизводимость и мгновенный откат без переезда на контейнеры. Docker нужен там, где важно одинаковое окружение на всех машинах, горизонтальное масштабирование и предсказуемая сборка зависимостей.
При наличии SSH и доступа к git можно построить минимальный, но честный конвейер: тесты и сборка на отдельном раннере, выкат по SSH с переключением симлинка и возвратом на предыдущую версию. Полноценные окружения, канареечный выкат и горизонтальное масштабирование потребуют VPS или контейнерной платформы — это отдельный этап, который имеет смысл планировать после базовой автоматизации.
Да, и для многих проектов это обязательное условие: исходный код, артефакты и секреты не должны покидать ваш контур. Разворачиваем GitLab Runner или self-hosted раннер GitHub Actions на вашей инфраструктуре и настраиваем кэш зависимостей локально. Дополнительный плюс — нет ограничений на минуты сборки и очередей облачных раннеров.
Смежные задачи, которые обычно решаются в одном проекте с этой.
Расскажите, как устроен деплой сейчас, — предложим план автоматизации, сроки и стоимость.
Cookie и аналитика
Мы используем необходимые cookie для работы сайта и форм. Аналитические cookie (Яндекс.Метрика, включая запись сессий) подключаем только с вашего согласия — от него можно отказаться. Подробнее: Политика использования cookie и обработка персональных данных.