Найкращий комплімент моїй роботі — це тиша.
Ми провели міграцію CI/CD без жодної секунди даунтайму: 200 pipeline, 22+ репозиторії, 15 команд переїхали зі старої платформи на сучасний стек. І найгучнішою реакцією було байдуже знизування плечима. Жодного war room. Жодного відкату о другій ночі. Жодного лютого треда в Slack. Якщо міряти міграцію кількістю незадоволених розробників — у нас круглий нуль.
Люди чують це й вирішують, що ми просто погано всіх попередили. Усе навпаки. Коли земля йде з-під ніг, а ніхто цього не відчуває — оце і є перемога.
З чого ми починали
Двадцять два репозиторії — і кожен окрема сніжинка. У кожного свій Jenkinsfile, свої примхи, свої неписані знання в голові однієї людини. Купа Bitbucket-пайплайнів, які міг відлагодити лише їхній автор — а автор звільнився пів року тому. Кожен сервіс — виняток. Кожен деплой — коротка молитва.
Знайомий типаж: працює, ледь-ледь, і чіпати ніхто не хоче. Міняєш один рядок — і ламаються три речі в сервісі, який ти жодного разу не відкривав. Це не інфраструктура. Це будинок з привидами.
Один шаблон замість двадцяти двох
Мета звучала просто, а давалася важко: замінити весь цей зоопарк одним універсальним шаблоном pipeline на GitLab CI. Один файл на 634 рядки, на який через include: посилається кожен сервіс. Міняєш шаблон один раз — оновлення прилітає всім. Жодного розповзання копіпасти. Жодних «чому staging збирається не так, як prod».
І один пункт без права на компроміс: 75% покриття тестами. Не побажання, не «потім допишемо». Не дотягнув до планки — pipeline зупиняється. Міграція стала заразом і моментом, коли ми нарешті почали віддавати роками накопичений борг за тестами.
Щоб довести цей файл до пуття, пішло 350+ комітів. Кожен окремий випадок, кожна випадкова змінна оточення, кожна ротація секретів, кожен дивний крок збірки, який хтось додав у 2022-му й забув, — усе це мав закривати сам шаблон, а не костур-виняток. Шаблон мав сенс, лише якщо він справді універсальний.
Мігрувати за залежностями, а не за дедлайном
Ось тут зазвичай усе й помирає. Хтось призначає дату перемикання. Команди в милі. Щось ламається. Відкат. Довіра випарувалася. Проєкт поповз на пів року вправо. Я бачив рівно цей фільм тричі, у трьох різних компаніях.
Тому дедлайну ми не ставили взагалі. Натомість:
- Порядок за залежностями. Вісім ключових сервісів переїжджали в суворій послідовності — спершу те, від чого залежать усі, споживачі наприкінці. Помилися з порядком — і один зламаний білд каскадом валить усе далі по ланцюжку.
- Нове поруч зі старим. Нові пайплайни тижнями крутилися паралельно зі старими, ще до того, як когось просили перемкнутися. Обидва збирали той самий код одночасно.
- Автоматичні parity-перевірки. Ми порівнювали вивід старого й нового pipeline на кожному прогоні. Найменша розбіжність — стоп, розбираємось, і лише потім чіпаємо наступний сервіс.
- Відкат одним прапорцем. Будь-яка команда могла повернутися на старий pipeline, перемкнувши один флаг. Без тікета, без наради, без дозволу.
- «Переїжджаємо, коли готові», а не «до четверга». Термін належав кожній команді, а не діаграмі Ганта.
Починали свідомо з малого — 3 безпечні пайплайни, потім 10, потім 50. Кожна партія, що пройшла тихо, купувала нам упевненість розширити наступну.
Головний секрет був не технічний
Parity-перевірки і прапорець відкату — усе це важливо. Але по-справжньому спрацювало не те, що лежало в YAML.
Ми жодного разу не попросили команду «повірити новій системі».
Натомість ми дали новій системі ганяти їхні ж реальні білди — коректно — цілих два тижні, перш ніж запропонувати перемкнутися. На момент переїзду новий pipeline уже два тижні катав їхній код у прод. Вірити не було в що. Було лише те, що вони й так на власні очі бачили робочим.
Довіру не оголошують на кікоффі. Її тихо доводять — прогін за прогоном, доки перемикання не перетворюється на порожню формальність.
Що нам дала «нудьга»
Чотири місяці. 200 pipeline. Нуль інцидентів. Жоден сервіс не втратив жодного запиту за всю міграцію.
Найкращі міграції — нудні. Непомітні. Ті, де єдина ознака змін — білди стали трохи швидшими, а черговий телефон перестав дзвонити.
Якщо ви дивитесь в очі власній легасі-платформі CI/CD — план короткий:
- Зведіть усе до одного шаблону, щоб фікс прилітав одразу всім.
- Ганяйте старе й нове паралельно і довіряйте parity-перевіркам, а не думкам.
- Зробіть відкат одним прапорцем, щоб перемикання нічого не коштувало скасувати.
- Покажіть, що система працює, перш ніж просити в неї повірити.
Зробите так — і нагородою буде найтихіший і найнепоказніший запуск у вашій кар'єрі. Вважайте цю тишу оплесками.