Признаюсь честно: я много лет относился к пятничным падениям пайплайнов как к мистике. Ну не может же быть, чтобы один и тот же код в среду собирался, а в пятницу вечером разваливался. Пока не сел и не разобрал логи за полгода, разложив инциденты по дням недели. Оказалось, никакой магии нет: есть семь совершенно конкретных причин, и почти все они лечатся не героическим дебагом, а организацией процесса.
Первая причина — сам вечер пятницы. К концу недели все уставшие, внимание рассеяно, а релиз мы почему-то назначаем на половину седьмого. Люди торопятся домой, читают диффы по диагонали, апрувят пул-реквесты на автомате. Я ввёл простое правило: никаких плановых выкаток после четырёх часов дня, а для срочных хотфиксов есть отдельный дежурный, который осознанно берёт на себя риск.
Вторая причина — большой батч. За неделю в основную ветку налипает два десятка изменений, и когда пайплайн краснеет, непонятно, кто виноват. Мы перешли на мелкие частые мержи и перестали держать длинные ветки. Разница огромная: если между двумя деплоями было одно изменение, а не тридцать, поиск виновника занимает минуты вместо вечера.
Третья причина — флаки-тесты. Тест, который падает через раз, разрушает доверие ко всему CI сильнее, чем настоящий баг. Команда привыкает жать «перезапустить», и в какой-то момент реальная поломка уезжает в прод вместе с перезапущенным зелёным пайплайном. Мы завели отдельный список нестабильных тестов и договорились: либо чиним за неделю, либо удаляем без сожалений.
Четвёртая причина — внешние зависимости. Тестовые окружения и чужие API живут своей жизнью: у кого-то ночная ротация ключей, у кого-то лимиты на запросы, у кого-то плановые работы на выходных. Я начал выписывать календарь всех внешних сервисов, и сколько пятничных падений это объяснило, вы бы знали. Пятая — инфраструктура и секреты: просроченный токен, разъехавшиеся конфиги между стендами, раннер, упёршийся в лимит. Такое копится незаметно и рвётся в самый неудобный момент. Шестая — отсутствие наблюдаемости: если у пайплайна нет внятных метрик и алертов, о проблеме узнаёшь не от системы, а от злого коллеги в чате. И седьмая — отсутствие ретроспектив: команда повторяет одну и ту же ошибку каждую пятницу, потому что выводы никто не записал и процесс не поменял.
Что реально помогло мне. Заморозка релизов в конце недели, мелкие батчи, канареечные выкатки на малую долю трафика, фича-флаги вместо «включим сразу всем», честный статус пайплайна в общем чате и дежурство по расписанию. Но главное — разбор каждого инцидента без поиска виноватых. Не «кто сломал», а «что в нашем процессе позволило этому случиться». Как только я перестал искать стрелочника, люди начали приносить проблемы раньше, а не молчать до пятницы.
И да, пятница перестала быть днём страха. Пайплайны всё ещё иногда падают, но теперь это скучное техническое событие, а не национальный праздник с созвоном в девять вечера. А как у вас в команде: есть ли свой ритуал пятничных деплоев и что помогло победить эту самую пятничную карму?
Первая причина — сам вечер пятницы. К концу недели все уставшие, внимание рассеяно, а релиз мы почему-то назначаем на половину седьмого. Люди торопятся домой, читают диффы по диагонали, апрувят пул-реквесты на автомате. Я ввёл простое правило: никаких плановых выкаток после четырёх часов дня, а для срочных хотфиксов есть отдельный дежурный, который осознанно берёт на себя риск.
Вторая причина — большой батч. За неделю в основную ветку налипает два десятка изменений, и когда пайплайн краснеет, непонятно, кто виноват. Мы перешли на мелкие частые мержи и перестали держать длинные ветки. Разница огромная: если между двумя деплоями было одно изменение, а не тридцать, поиск виновника занимает минуты вместо вечера.
Третья причина — флаки-тесты. Тест, который падает через раз, разрушает доверие ко всему CI сильнее, чем настоящий баг. Команда привыкает жать «перезапустить», и в какой-то момент реальная поломка уезжает в прод вместе с перезапущенным зелёным пайплайном. Мы завели отдельный список нестабильных тестов и договорились: либо чиним за неделю, либо удаляем без сожалений.
Четвёртая причина — внешние зависимости. Тестовые окружения и чужие API живут своей жизнью: у кого-то ночная ротация ключей, у кого-то лимиты на запросы, у кого-то плановые работы на выходных. Я начал выписывать календарь всех внешних сервисов, и сколько пятничных падений это объяснило, вы бы знали. Пятая — инфраструктура и секреты: просроченный токен, разъехавшиеся конфиги между стендами, раннер, упёршийся в лимит. Такое копится незаметно и рвётся в самый неудобный момент. Шестая — отсутствие наблюдаемости: если у пайплайна нет внятных метрик и алертов, о проблеме узнаёшь не от системы, а от злого коллеги в чате. И седьмая — отсутствие ретроспектив: команда повторяет одну и ту же ошибку каждую пятницу, потому что выводы никто не записал и процесс не поменял.
Что реально помогло мне. Заморозка релизов в конце недели, мелкие батчи, канареечные выкатки на малую долю трафика, фича-флаги вместо «включим сразу всем», честный статус пайплайна в общем чате и дежурство по расписанию. Но главное — разбор каждого инцидента без поиска виноватых. Не «кто сломал», а «что в нашем процессе позволило этому случиться». Как только я перестал искать стрелочника, люди начали приносить проблемы раньше, а не молчать до пятницы.
И да, пятница перестала быть днём страха. Пайплайны всё ещё иногда падают, но теперь это скучное техническое событие, а не национальный праздник с созвоном в девять вечера. А как у вас в команде: есть ли свой ритуал пятничных деплоев и что помогло победить эту самую пятничную карму?