Ответ
Релизный процесс был автоматизирован через CI/CD и следовал модели GitFlow.
Основные этапы:
- Подготовка:
- Создание ветки
release/vX.Y.Zотdevelop. - Финальное тестирование (smoke, регрессия) на staging-окружении.
- Проверка чек-листов (миграции БД, конфигурация).
- Создание ветки
- Сборка и деплой:
- Сборка артефакта и деплой на production через Jenkins/GitLab CI.
- Постепенный rollout (canary-релиз) на 10%, затем 50%, затем 100% трафика.
- Мониторинг и откат:
- Отслеживание ключевых метрик (ошибки 5xx, latency, бизнес-показатели) в Grafana и Sentry.
- Готовность к мгновенному rollback через переключение на предыдущий стабильный образ.
- Фиксация:
- После успешного релиза — мерж ветки
releaseвmainиdevelop. - Создание аннотированного тега (
git tag -a v1.2.0).
- После успешного релиза — мерж ветки
Пример конфигурации стадии в GitLab CI:
release_to_prod:
stage: deploy
rules:
- if: $CI_COMMIT_REF_NAME =~ /^release/vd+.d+.d+$/
script:
- echo "Deploying to production..."
- ./scripts/deploy_prod.sh
environment:
name: production
url: https://app.company.com
Почему так: Постепенный rollout и автоматизированный откат минимизируют downtime и риски.
Ответ 18+ 🔞
А, ну это ж классика, блядь! Релизный процесс, который у нас настроен — это не просто так, хуй с горы, а целая наука, ёпта! Автоматизировали всё через CI/CD, по священной модели GitFlow, чтобы не было как в том анекдоте: "задеплоили и помолились". Тут всё чётко, по полочкам, хотя иногда всё равно волнение ебать, как перед выступлением.
Основные этапы, на которых все мозги выносят:
-
Подготовка, или "собираем чемоданы в ад":
- От ветки
developотпочковываемrelease/vX.Y.Z. Это как объявить по радио: "Внимание, началось!" - Потом начинается финальное тестирование на staging-окружении. Smoke, регрессия — вся эта хуйня, чтобы убедиться, что мы ничего не сломали. В идеале.
- И обязательный ритуал — проверка чек-листов. Миграции БД не сожрут ли данные? Конфигурация не наебёт? Всё, сука, перепроверяем.
- От ветки
-
Сборка и деплой, или "точка невозврата":
- Джинкс или Гитлаб CI берут наш код, делают из него артефакт и начинают осторожно, как сапёры, закатывать это в продакшен.
- И не сразу, овердохуища! Канареечный релиз, мать его. Сначала 10% трафика получают новинку. Посмотрели метрики — не горит? Ладно, 50%. Всё ещё живём? Тогда уже 100%, пизда, поехали!
-
Мониторинг и откат, или "палец на кнопке":
- Вот тут все сидят и не дышат. Grafana, Sentry — все дашборды открыты. Следим за ошибками 5xx, за латенси, чтобы не упёрлась в потолок. Если бизнес-метрики просели — это пиздец-сигнал.
- И главное — готовность к откату. Если что-то пошло не так, мы не геройствуем, а сразу, блядь, откатываемся на предыдущий стабильный образ. Быстро и без лишних вопросов. "Лучше живой позор, чем мёртвая красота", как говорится.
-
Фиксация, или "поставить жирную точку":
- Если всё прошло гладко и все ещё на рабочих местах, а не под окнами, — фиксируем успех. Мержим ветку
releaseобратно вmainиdevelop. - И кульминация — создаём аннотированный тег, типа
git tag -a v1.2.0. Это как памятная табличка: "Здесь был Вася".
- Если всё прошло гладко и все ещё на рабочих местах, а не под окнами, — фиксируем успех. Мержим ветку
Вот, смотри, кусок конфигурации из GitLab CI, который это всё запускает. Код не трогаю, он святой:
release_to_prod:
stage: deploy
rules:
- if: $CI_COMMIT_REF_NAME =~ /^release/vd+.d+.d+$/
script:
- echo "Deploying to production..."
- ./scripts/deploy_prod.sh
environment:
name: production
url: https://app.company.com
А почему, спрашивается, такой геморрой? Да чтобы, блядь, минимизировать простой и риски! Постепенный rollout — это как ногой лёд проверять, а не прыгать с разбегу. Автоматизированный откат — это чтоб не бегать с криком "откатывай, откатывай!", а тыкнуть одну кнопку. В общем, чтобы спать спокойно. Ну, почти спокойно.