Первая версия нашего пайплайна умела только одно: доставлять образ в кластер. Работала она исправно ровно до первого инцидента в пятницу вечером, когда выяснилось, что «вернуть как было» — это ручной ритуал на сорок минут с kubectl и поиском тега прошлой версии по истории сборок.
С тех пор главное правило деплоя у меня такое: сначала чинится путь отката, потом скорость выкатки.
Что должно быть в декларации каждого сервиса
| Поле | Зачем |
|---|---|
previous |
конкретный образ, который крутился до этого |
rollback hook |
что сделать с состоянием при откате (миграции, кэш) |
smoke |
две-три проверки, что сервис живой после отката |
owner |
человек, которого будят, а не general channel |
Миграции — единственное, что не откатывается
Образ откатывается за секунды. Схему БД — нет. Поэтому миграции у нас живут отдельной жизнью от релиза: сначала колонка, через релиз — код, который её читает, и только потом удаление старого. Backward-compatible миграции скучны ровно до того дня, когда они спасут вам вечер.
Деплой — это не когда образ встал в под. Деплой — это когда любой человек за две минуты может вернуть всё назад и доказать это двумя smoke-тестами.
Тестируется это, кстати, тоже автоматически: в CI есть джоба, которая деплоит, катит битый образ, откатывает и проверяет smoke. Падение этой джобы считается инцидентом, хотя ничего пользовательского не упало.