Откат важнее идеального деплоя

Идеальный деплой случается раз в год, а падать будет каждая система. Поэтому в нашем CI первым сценарием тестируется не выкатка, а откат.

Первая версия нашего пайплайна умела только одно: доставлять образ в кластер. Работала она исправно ровно до первого инцидента в пятницу вечером, когда выяснилось, что «вернуть как было» — это ручной ритуал на сорок минут с kubectl и поиском тега прошлой версии по истории сборок.

С тех пор главное правило деплоя у меня такое: сначала чинится путь отката, потом скорость выкатки.

Что должно быть в декларации каждого сервиса

Поле Зачем
previous конкретный образ, который крутился до этого
rollback hook что сделать с состоянием при откате (миграции, кэш)
smoke две-три проверки, что сервис живой после отката
owner человек, которого будят, а не general channel

Миграции — единственное, что не откатывается

Образ откатывается за секунды. Схему БД — нет. Поэтому миграции у нас живут отдельной жизнью от релиза: сначала колонка, через релиз — код, который её читает, и только потом удаление старого. Backward-compatible миграции скучны ровно до того дня, когда они спасут вам вечер.

Деплой — это не когда образ встал в под. Деплой — это когда любой человек за две минуты может вернуть всё назад и доказать это двумя smoke-тестами.

Тестируется это, кстати, тоже автоматически: в CI есть джоба, которая деплоит, катит битый образ, откатывает и проверяет smoke. Падение этой джобы считается инцидентом, хотя ничего пользовательского не упало.

СКОПИРОВАНО