Правило «не в пятницу»: регламент выкаток и его законные исключения
«Не выкатывай в пятницу» — фраза, которую в любой команде разработки слышал каждый, но мало где она записана как правило с чёткими границами. В итоге она работает наполовину: кто-то откладывает релиз до понедельника из суеверия, а кто-то в пятницу вечером всё равно катит фичу, потому что «код же протестирован». Разница между суеверием и рабочим регламентом простая — регламент объясняет, от чего именно он защищает, и честно описывает, когда его можно нарушать.
Содержание
- От чего на самом деле защищает правило
- Как маленькая проблема в пятницу вечером превращается в проблему всех выходных
- Что здесь можно измерить, а что — нет
- Законное исключение №1: мелкий критичный фикс безопасности
- Законное исключение №2: команда с полноценным круглосуточным дежурством
- Что исключением не является — частые самообманы
- Как формализовать правило регламентом, а не держать его на честном слове
От чего на самом деле защищает правило
Смысл правила не в дне недели как таковом, а в доступности ресурсов на исправление, если релиз пойдёт не по плану. Пятничный вечерний деплой отличается от вторничного дневного не техническими рисками кода — код тот же самый, — а тем, кто и с какой скоростью сможет отреагировать, если что-то сломается.
Смоделируйте два сценария одного и того же релиза с багом, который проявляется не сразу, а через несколько часов под нагрузкой. Во вторник в 11:00 баг проявляется к 15:00: на связи вся команда, DBA доступен для срочной миграции, вендор техподдержки отвечает в течение часа по SLA — инцидент закрыт до конца рабочего дня. В пятницу в 17:00 тот же баг проявляется в субботу утром, когда трафик подрос после ночного затишья: дежурный один, доступа к продовой базе у него нет — только у DBA, который уехал без ноутбука, а тикет в поддержку вендора обрабатывается уже по SLA выходного дня — это часто сутки, а не часы. Пользователи весь уикенд видят деградацию, а разбор откладывается до понедельника, потому что чинить всерьёз некому.
Технический риск релиза в обоих случаях одинаков. Разница — исключительно в стоимости последствий, если риск реализуется. Правило «не в пятницу» — это не про код, а про то, что цена ошибки в конце недели асимметрично выше цены той же ошибки в начале недели, и это единственное разумное основание для регламента. При этом в выходные медленнее отвечает и всё остальное — вендоры, платёжные провайдеры, поддержка хостинга: часть служб просто не работает до понедельника.
Как маленькая проблема в пятницу вечером превращается в проблему всех выходных
Механика провала почти всегда одна и та же, и она хорошо описывается цепочкой, а не единичным событием.
- Релиз выкатывается в пятницу днём или вечером, всё выглядит штатно — тесты прошли, smoke-check зелёный.
- Проблема не проявляется мгновенно: она зависит от накопления состояния (утечка соединений с базой, переполнение очереди, деградация кеша), которое достигает критической точки через несколько часов или на следующий день под другим профилем нагрузки.
- К моменту, когда проблема заметна, большая часть команды уже недоступна — кто-то в дороге, кто-то физически не смотрит в рабочие чаты до понедельника.
- Дежурный, если он вообще есть, сталкивается с багом, для разбора которого нужен контекст релиза, которого у него нет — потому что деплоил не он.
- Откат оказывается не таким простым, как казалось: за прошедшие часы в базу уже записались данные в новой схеме, и просто вернуть предыдущую версию кода нельзя без потери данных или ручной миграции обратно.
- Разбор и полноценное исправление откладываются до понедельника, а всё это время пользователи получают деградированный сервис.
Похожая история случается не только с релизами кода, но и с любыми изменениями конфигурации, которые «сработают позже». Хороший пример из смежной темы — сертификат протух в пятницу вечером: сама проблема не связана с деплоем приложения, но механика та же — событие, спокойно предсказуемое заранее, случилось в момент минимальной готовности команды среагировать, и это превратило рутинную задачу продления сертификата в вечер разгребания последствий.
Важный нюанс: цепочка запускается не самим фактом пятницы, а совпадением дня недели с моментом проявления проблемы. Именно поэтому мелкие, немедленно проверяемые изменения безопаснее крупных релизов со скрытым эффектом — об этом дальше в разделе про исключения.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверЧто здесь можно измерить, а что — нет
Честно: не существует общедоступной точной статистики вида «пятничные релизы ломаются в X раз чаще будничных» — цифры, которые иногда всплывают в статьях и докладах, обычно относятся к конкретной компании и её стеку, и переносить их один к одному на другую команду некорректно. Если вам встретится точный процент — относитесь к нему как к ориентиру конкретного контекста, а не универсальному закону.
Что можно утверждать без ссылки на чужую статистику — это структурный, а не вероятностный аргумент: сам факт релиза не становится опаснее от смены дня недели, но стоимость реагирования на проблему меняется предсказуемо, потому что количество людей, физически готовых включиться в разбор, в выходные ниже почти в любой компании без формального дежурства; время ответа внешних вендоров в выходные регламентировано более мягким SLA, если оно вообще есть; а решения принимаются медленнее, когда ответственного приходится ждать или заменять кем-то без полного контекста.
Это не про вероятность поломки, а про дисперсию времени восстановления: пятничный релиз не более вероятно сломается, но если он ломается, время на исправление растягивается непредсказуемо сильнее. Именно эта асимметрия и есть содержательное основание правила, а не примета.
Законное исключение №1: мелкий критичный фикс безопасности
Правило «не в пятницу» рассчитано на релизы с непредсказуемым эффектом и высокой стоимостью отката — новую функциональность, миграции схемы, изменения в биллинге. Оно не рассчитано на ситуацию, где откладывание релиза само по себе создаёт риск выше риска самого деплоя.
Критичный патч безопасности — это ровно такой случай. Если опубликована уязвимость в используемой вами версии библиотеки или прямо в вашем коде и эксплойт уже гуляет публично, каждый день промедления — это открытое окно атаки, а не «спокойное ожидание понедельника». Здесь логика правила разворачивается: цена бездействия в выходные выше цены действия в пятницу.
Чтобы исключение оставалось законным, а не отговоркой, полезно проверять фикс по чек-листу:
- Изменение маленькое и точечное — патч конкретной уязвимости, а не «заодно» довезённая крупная фича вместе с security-фиксом в одном релизе. Смешивание рискованных изменений с критичным патчем — самая частая ошибка в этом сценарии.
- Откат тривиален — предыдущая версия образа доступна, и откат занимает минуты, а не требует ручного разбора миграций.
- Изменение протестировано на стейджинге, пусть и в сжатые сроки — экономия времени на тестировании ради скорости выкатки уязвимости не закрывает риск, а меняет один риск на другой.
- Есть кому мониторить последствия хотя бы несколько часов после релиза — выкатить фикс и разойтись без наблюдения так же опасно, как не выкатывать его вовсе.
Практический пример: критичная уязвимость в зависимости (условно, RCE в парсере пользовательского ввода) — обновление пакета и передеплой в пятницу вечером оправданы, потому что риск эксплуатации с публичным PoC растёт с каждым часом, а сама правка минимальна и легко откатывается. А вот «заодно доедем миграцию базы, раз всё равно катим» в тот же релиз — уже нарушение духа исключения, даже если формальный повод был законным.
Законное исключение №2: команда с полноценным круглосуточным дежурством
Второе законное исключение работает не потому, что риск ниже, а потому, что стоимость реагирования на этот риск не зависит от дня недели. Если в команде есть настоящая ротация on-call — с дежурным, который физически доступен, имеет права на откат и инструкции по эскалации, — день недели перестаёт быть значимым фактором.
Ключевое слово здесь — «полноценное». Формальная запись в календаре «дежурный на этой неделе — Иван» без остального контура не создаёт того же эффекта, что настоящая практика 24/7 поддержки. Полноценное дежурство обычно включает:
| Признак | Формальное дежурство | Полноценное дежурство |
|---|---|---|
| Доступ дежурного | Может не иметь прав на прод или базу | Полный доступ и права на откат без ожидания одобрения |
| Эскалация | «Написать тимлиду в личку и подождать» | Формальная цепочка эскалации с таймаутами по каждому уровню |
| Оповещение | Дежурный узнаёт по чату, когда откроет телефон | Алерты через пейджинг-сервис с гарантированной доставкой |
| Контекст релиза | Дежурный не в курсе, что и когда выкатывалось | Журнал релизов доступен, дежурный знает, что менялось |
| Компенсация | Дежурство «по умолчанию», без учёта нагрузки | Дежурство оплачивается или компенсируется отгулом |
Если в компании есть только левая колонка — исключение не действует, и правило «не в пятницу» применяется в полном объёме, потому что фактическая доступность команды в выходные всё равно близка к нулю. Как устроена реальная ротация и эскалация в небольшой команде — в статье дежурство и эскалация в маленькой команде, а что нужно передать при смене дежурного, чтобы контекст не терялся, — в статье передача дежурства: пять пунктов для смены.
Даже при полноценном дежурстве разумно сохранять более мягкую версию правила: разрешать в пятницу рутинные и хорошо протестированные выкатки, но переносить на начало недели релизы с миграциями схемы базы или изменением критичных процессов (оплата, аутентификация) — потому что даже дежурный с полными правами дольше разбирает сложный инцидент без поддержки остальной команды, недоступной по выходным.
Что исключением не является — частые самообманы
Отдельного внимания заслуживают формулировки, которые звучат как законное исключение, но им не являются. Их стоит явно проговорить в регламенте — именно они чаще всего размывают правило до состояния «работает, только когда удобно».
- «Мы всё равно будем онлайн вечером» — неформальная готовность одного-двух человек посмотреть в чат не равна дежурству и не покрывает случай, если оба одновременно окажутся вне сети или проблема потребует доступа, которого у них просто нет.
- «Это же маленькое изменение» — размер diff не коррелирует напрямую с размером риска: одна строчка в конфиге балансировщика может уронить прод так же надёжно, как крупная миграция. Исключение из первого пункта работает не потому что изменение маленькое, а потому что оно точечное, протестированное и легко откатываемое — это разные критерии.
- «Мы задеплоим рано утром в пятницу, а не вечером» — снижает риск, но не убирает его: проблема под вечерней или ночной нагрузкой всё равно всплывёт в худшее для реагирования время, просто чуть позже.
- «В прошлый раз пронесло» — систематическая ошибка выжившего: отсутствие инцидента в прошлый раз не говорит ничего о вероятности в этот раз, а количество «пронесло» без анализа причин обычно молча растёт, пока не случится один раз, который перекроет всю экономию.
Разбор реальной стоимости ручных, непродуманных деплоев без страховки хорошо иллюстрирует, почему эти самообманы обходятся дороже, чем кажется в моменте, — в статье цена ручного деплоя в часах и инцидентах.
Как формализовать правило регламентом, а не держать его на честном слове
«Все и так знают» — самая ненадёжная форма правила: она работает, пока состав команды стабилен, и перестаёт работать в первую же неделю с новым сотрудником, подрядчиком или просто человеком, который не застал момент, когда правило проговорили вслух. Формализация переводит правило из культурной нормы в проверяемый процесс.
Практический минимум формализации:
- Письменно зафиксировать точную границу. Не «не катить в пятницу» вообще, а конкретное время отсечки — например, «крупные релизы не выкатываются после 14:00 в пятницу и в выходные», с явным определением, что считается «крупным» (миграция базы, изменение биллинга, изменение схемы аутентификации, релиз в часы пиковой нагрузки).
- Явно перечислить исключения и условия их применения — критичный security-патч по чек-листу и наличие полноценного дежурства, с указанием, какая именно ротация считается «полноценной» в вашей компании.
- Назначить, кто утверждает исключение. Это право не должно принадлежать тому, кто хочет выкатить прямо сейчас — иначе любое желание задеплоить в пятницу превратится в «ну это же критично». Подтверждение даёт тимлид или дежурный инженер, не участвующий в подготовке релиза.
- Перенести правило в инструменты, а не только в документ. Документ читают редко, автоматическая проверка срабатывает всегда. Пример гейта в GitLab CI, блокирующего джобу деплоя в пятницу вечером и в выходные без лейбла исключения:
deploy_prod:
stage: deploy
script:
- ./deploy.sh
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /friday-exception/'
when: on_success
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: manual
allow_failure: false
А сама проверка дня недели и времени может жить прямо в скрипте деплоя как последний защитный барьер, даже если CI-гейт кто-то обошёл:
#!/usr/bin/env bash
# deploy_guard.sh — грубая проверка перед стартом деплоя
day=$(date +%u) # 1=понедельник ... 7=воскресенье
hour=$(date +%H)
if [[ "$day" -ge 5 && "$hour" -ge 14 ]] || [[ "$day" -ge 6 ]]; then
if [[ "$DEPLOY_EXCEPTION" != "security-hotfix" && "$DEPLOY_EXCEPTION" != "oncall-full" ]]; then
echo "Блок: релиз после 14:00 пятницы или в выходные без флага исключения."
echo "Передайте DEPLOY_EXCEPTION=security-hotfix или oncall-full, если это законное исключение."
exit 1
fi
echo "Деплой разрешён по исключению: $DEPLOY_EXCEPTION"
fi
./deploy.sh
- Проговаривать правило на онбординге — правило, существующее только в документе, до которого никто не доходит, эквивалентно правилу, которого нет.
- Пересматривать регламент на ретро после инцидентов — если пятничное исключение сработало неудачно, разбор входит не в личную память участников, а в обновлённую формулировку правила.
Формализация не делает команду медленнее — она делает быстрые пятничные релизы предсказуемыми там, где они оправданы, и убирает их там, где решение принималось на эмоциях «раз уж всё равно на месте».
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Распространяется ли правило на дни перед длинными выходными или праздниками?
Логика та же: смотрите не на день недели буквально, а на доступность команды после релиза. Если перед праздниками команда так же массово недоступна, как в выходные, применяйте то же правило к четвергу перед длинными выходными, что и к пятнице перед обычными.
Что если команда небольшая и формального дежурства никогда не будет — как быть с исключением для security-патчей?
Оно не требует дежурства — требует точечности изменения, тестирования и лёгкого отката. Небольшая команда применяет его с более консервативным чек-листом: подтверждение от второго человека перед стартом и явное окно наблюдения после релиза.
Правило распространяется только на код приложения или на инфраструктурные изменения тоже?
На инфраструктуру оно распространяется даже строже — смена конфигурации балансировщика, DNS, правил файрвола или сертификатов имеет ту же природу риска (отложенный эффект, сложный откат).
Как быть, если исключение используют слишком часто и правило фактически перестаёт работать?
Это сигнал, что критерии исключения сформулированы слишком широко или согласующий не выполняет роль фильтра. Стоит завести метрику — долю пятничных релизов от общего числа за месяц — и разбирать на ретро каждый спорный случай.
Стоит ли распространять правило на стейджинг?
Нет смысла — правило защищает от дорогой цены восстановления прод-сервиса в момент низкой доступности команды. На стейджинге сломанное состояние не влияет на пользователей и чинится в рабочем порядке.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →