Чи варто деплоїтись у п’ятницю

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Привіт! Мене звати Сергій, я — Tech Lead у Solidgate. Наші розробники щодня роблять 40-50 деплоїв і випускають оновлення навіть у п’ятницю. В середньому нові фічі потрапляють у продакшн за годину — і все працює стабільно. У цій статті я розповім, як ми налаштувати надійний та швидкий CI/CD процес, який дозволяє нам спати спокійно.

Питання безпечного та ефективного CI/CD процесу — ключове для багатьох компаній. На співбесідах я часто запитую: «Чи деплоїтеся ви в прод у п’ятницю?». Близько 90% кандидатів відповідають: «Ні», і лише 9% кажуть: «Так, але мене змусили» або «Так, але це ненормально».

Чому така реакція? Найчастіше чую: «А раптом все ляже у вихідні?» або «Не хочу виправляти помилки, коли всі відпочивають».

Це страх, який з’являється через невпевненість у своєму продукті або процесах. Чому не п’ятниця? Бо треба мати час:

  • підготувати реліз;
  • добряче його протестувати;
  • розгорнути його на тестовому оточенні;
  • перевірити, що все працює як слід;
  • задеплоїти в прод;
  • знову перевірити, що все працює як слід;
  • якщо щось станеться — швидко розібратися та викатити hotfix;
  • якщо потрібно, повторити всю процедуру ще раз.

На всі ці ритуали може вистачити й двох днів, тож у четвер до обіду деплоїтися можна. Але що, якщо все впаде вночі з четверга на п’ятницю?...

Solidgate щороку зростає у 2-3 рази. Продукт стає більшим і складнішим, а питання швидкості розробки постає гостріше. Ми працюємо у фінтеху — середовищі з великим навантаженням, де ціна помилки дуже висока. Розробка і доставка мають бути не просто швидкими, а ще й надійними; і ми не можемо дозволити собі зупинку системи для maintenance.

До речі, прочитати про це більше ви можете у статті Head of Engineering Solidgate Макса Багінського, в якій він розповідає про втрату $10,000 за хвилину даунтайму нашої системи.

То як при збільшенні та ускладненні системи не сповільнювати розробку? Може здатися, що найкраще рішення — найняти більше людей. Але збільшення команди без зміни процесів може призвести до:

  • ускладнення комунікацій;
  • зменшення швидкості прийняття рішень;
  • розмиття зон відповідальності;
  • збільшення кількості одночасних МR-ів від різних людей;
  • merge conflicts;
  • черги на спільних оточеннях;

Всередині команди ми дійшли розуміння: щоб не втрачати, а прискорювати темп розробки, треба дотримувати підходу Trunk-Based Development (TBD) та мати повністю автоматизований процес CI/CD.

Як це працює: я виконую свою задачу, створюю МR, чекаю апрув, мержу — і далі запускається повністю автоматизований процес:

  • білд;
  • розгортання на staging;
  • виконання автоматичних тестів;
  • розгортання в прод;
  • виконання автоматичних тестів на прод.

У цьому процесі CI/CD виключені всі ручні операції — зокрема, у нас немає мануальних тестувальників, всі тести автоматизовані.

Через 40-60 хвилин нова фіча вже в проді у користувачів, а задача в Jira переходить в статус Done. Це робиться щодня — навіть у п’ятницю — і не викликає страху чи тривоги. Ба більше, кожен розробник може викатити кілька задач на день, тож у звичайний робочий день робиться близько 40-50 деплоїв у прод.

А тепер — про те, як ми зрозуміли, що саме потрібно покращувати та чи потрібно нам це взагалі. В цьому допомогла DORA.

DORA — набір метрик, розроблених Google, які допомагають виміряти та покращити ефективність процесів розробки та доставки коду.

Час внесення змін, частота розгортання, відсоток невдалих розгортань, час відновлення після збою — ці метрики дозволяють командам аналізувати та оптимізувати свої практики CI/CD.

Ми постійно відстежуємо DORA-метрики, щоб переконатися, що рухаємося в правильному напрямку, і постійно вдосконалюємо процеси. Не можна дозволяти собі ручних ритуалів релізів чергових версій з обмеженнями у днях.

Отже, переконуємось, що для продукту, який активно розвивається, налагоджений процес CI/CD — це маст хев. То що ж потрібно, щоб спокійно натиснути «merge», піти пити каву — і знати, що цей процес пройде успішно?

Далі розглянемо 7 практичних кроків, які допомогли нам досягти рівня, коли 40-50 деплоїв на день — це звична справа.

Контроль якості

Почнемо з найочевиднішого. Високу якість і надійність продукту можна забезпечити лише за наявності достатнього тестового покриття.

Скільки тестів — достатньо? Як виміряти «достатність»?

Зазвичай усі говорять про покриття коду, але високого покриття можна досягти дуже легко, написавши кілька порожніх тестів. Тобто «coverage» сам по собі мало що говорить про якість тестів. Так, юніт-тестів має бути якомога більше — але вони не покривають усе. Наприклад, вони не перевірять коректність написання чи виконання SQL-запитів.

Для цього потрібні інтеграційні тести, які запускають реальні запити до реально піднятої БД і перевіряють:

— чи повернулося/змінилося саме те, що мало змінитися;

— і навпаки — чи не змінилося те, що змінюватися не повинно.

Якось наприкінці осені один з наших support-спеціалістів створив в системі тестовий обліковий запис мерчанта. Після певних процедур він вирішив прибрати за собою та натиснув в адмінці кнопку «ВИДАЛИТИ» мерчанта. «Під капотом» в сервісі видалявся запис цього мерчанта та всі його залежності, після чого відразу зупинився весь процесинг. Досліджуючи цей інцидент ми зрозуміли, що проблема була у запиті на видалення ключів доступів мерчанта. В нас не було написано інтеграційного тесту на цей запит, і помилка коштувала нам $50k.

UPDATE credentials
		SET active_till = now()
		FROM credentials as cr 
		INNER JOIN channels as ch ON cr.channel_id = ch.id
		WHERE ch.account_id = $1 AND 
			(cr.active_till >= now() or cr.active_till is null)

Ми керуємося правилом піраміди тестування:

  • юнітами покриваємо все, що можливо (тут орієнтуємося на coverage);
  • функціональними тестами (яких значно менше) — основні флоу сервісу;
  • окрема команда AQA відповідає за e2e-тести, які перевіряють роботу всієї системи в цілому.

Визначити, чи у вас достатньо тестів, дуже просто: якщо ви виконуєте бізнес-задачу, змінюєте кілька місць у коді — і при цьому жоден тест не впав, це означає, що тестів у вас недостатньо :)

Тут варто зважати не лише на якість продукту, а й на якість коду. Наш код перевіряють численні лінтери — на швидкодію, оптимальність, конкурентність, дотримання стилю, вразливості та інші потенційні проблеми. І авжеж важливо дотримуватися практики Code Review — це етап, на якому можна виявити і попередити помилки до того, як вони потраплять до користувача. Для покращення процесу Code Review ми використовуємо CodeRabbit (ШІ).

Stage as Prod

Зупинимось детальніше на автоматизованих тестах. Тут йдеться не просто про окремо підняті шматочки системи з замоканими викликами — це тестування всієї системи з усіма її компонентами.

Щоб змоделювати поведінку системи на проді, потрібно мати оточення, ідентичне до прод — не лише з технічної точки зору (наприклад, за кількістю виділених ресурсів), а й з продуктової. На stage мають бути всі ті самі версії сервісів, що й на проді.

Якось один з наших інженерів робив задачу, в якій помилково зберігав до бази дані, використовуючи RO репозиторій. Локально та на staging усі тести пройшли, бо в конфігурації сервісу використовувалася одна і та сама БД. А от на прод це були мастер БД та її репліка, тому save(autoSettle)на прод на з’єднанні з реплікою викликав помилку. Такі помилки знаходяться легко, якщо stage оточення аналогічне до прод.

Як цього досягти? У пайплайнах є обов’язковий етап — деплой збірки на stage. Вийти на прод, оминувши автотести на stage, неможливо. Крім того, задеплоїтись на stage не можна з будь-якої гілки — лише з main. Це гарантує, що на stage потрапляють лише ті зміни, які вже пройшли Code Review і були влиті в main. А отже, це або те, що вже є на проді, або найближчим часом там з’явиться.

Чому важливо тримати stage «чистим» від експериментів? Якщо викатити на stage свої зміни з feature-гілки, ви ризикуєте зламати якусь бізнес-логіку. Десь в іншої команди впадуть автотести, і вони витратять свій час на те, щоб зрозуміти, що причина помилки — не в їхніх змінах. Наприклад, вони не отримають якийсь колбек, імейл або іншу нотифікацію, за яку відповідає ваш сервіс.

Отже, оточення stage-as-prod додає впевненості в тому, що тести, які щойно успішно пройшли, так само успішно пройдуть і на прод.

Observability

Нарешті сервіс виїхав в прод. Всі тести пройшли успішно, але нова feature занадто важлива і змінює суттєві компоненти системи. Треба переконатися, що вона працює як слід. А якщо щось йде не так — як оцінити ситуацію і зрозуміти, що саме відбувається і чому?

Важливий компонент надійності системи — моніторинг її роботи. Ви маєте бачити якомога більше інформації, щоб швидко і точно визначити стан системи та зрозуміти причини її поломки. В цьому допоможуть логи та метрики. Їх достатньо для процесу CI/CD, але для дослідження причин помилок важливо мати ще і трейсинг. Вам потрібен dashboard, де на одному екрані можна побачити функціонування сервісу.

Ось так виглядає наш summary dashboard, де відображені технічні метрики сервісу. Тут можна побачити важливу загальну інформацію по будь-якому з них.

Всі сервіси пишуть метрики за єдиним стандартом, і це дає можливість побудувати загальні дошки для всіх сервісів.

На цьому зображенні можна побачити всі вхідні HTTP-запити за одним, кількома обраними або навіть одразу за усіма сервісами.

Видно, що кількість запитів є доволі сталою, але в якийсь момент посипались 500-ки. Можемо побачити, в якому саме сервісі(ах), на яких саме ендпоінтах та хто їх викликав. Така дошка в нас є і для вихідних запитів.

Ось те саме, але з запитами до баз даних.

Кожна команда має набір персоналізованих бордів під кожний сервіс. Ці дошки ексклюзивні, тому що сервіси мають свої особливості, за якими зручніше визначати їхній стан. У когось це HTTP-трафік, у когось — RPC, а у когось — черги. В деяких сервісах на центральне місце виводяться бізнес-метрики.

Rollback

Я задеплоївся, переглядаю метрики і раптом бачу, що щось пішло не так — якісь метрики почали перевищувати трешхолди. Наприклад, різко збільшилося споживання CPU або летенсі-запитів в БД, а через це і кількість з’єднань та затримка запитів.

Сервіс досі працює, але почуває себе погано, або, можливо, не працює взагалі. Що робити в такому випадку? Нагадаю, 1 хвилина даунтайму нашої системи — $10k. Немає часу розбиратися, що сталося, шукати причину, а тим паче — випускати фікс.

Найпростіше рішення — rollback. Система має бути побудована таким чином, щоб можна було одним натисканням повернути сервіс у попередній стан. Тут треба зважати на дві компоненти цієї задачі:

  1. DevOps. У CI/CD має бути налаштована окрема мануальна job для rollback — проста, без затримок, додаткових перевірок чи поступових перемикань. Її єдине завдання — якомога швидше підняти попередню стабільну збірку.
  2. Розробка. Інженери мають писати код зі зворотною сумісністю. Це означає, що якщо нам потрібно видалити таблицю чи колонку в базі або перейменувати зовнішні ресурси тощо, ми розбиваємо такі зміни на кілька етапів, щоб на кожному з них була можливість безпечно повернутися до попереднього стану.

У наведеному прикладі, щойно виникає найменший сумнів, я натискаю кнопку «rollback» — а вже потім з’ясовую причину збою. Можливо, проблема була спричинена зовсім іншим сервісом, який вийшов у прод одночасно з моїм. І я зможу натиснути «deploy» ще раз і знову вийти в продакшен.

Деплоймент стратегії

Обзервебіліті і ролбек, про який йшлося вище — це ручні інструменти для виправлення проблеми, яка вже сталася. Та чи можливо запобігти катастрофі на більш ранньому етапі?

Так — для цього можна використовувати щось розумніше, ніж просто rolling update. Rolling update — це безшовне оновлення вашого сервісу зі старої версії на нову; тобто версія сервісу міняється без зупинки його роботи.

У процесі оновлення поруч з працюючою версією підіймається інстанс з новою, оркестратор постійно питає у нової healthcheck, і щойно він отримує ОК — направляє весь трафік на новий под, а старий тушить. І так з усіма інстансами по черзі.

У результаті юзери майже не помічають переходу — спершу працюють зі старою версією, а потім автоматично переходять на нову. Розгляньмо, як оптимізувати цей процес.

Ми використали Blue/Green стратегію та Canary. Спочатку в системі підняті інстанси старої (blue) версії. Оркестратор підіймає поруч таку ж кількість інстансів нової (green) версії, чекає на їхню готовність і запускає smoke-тести — виключно на green-подах, на які ще не йде користувацький трафік.

Якщо тести не проходять, оркестратор тушить green-поди, а система продовжує працювати на старій blue-версії. Користувачі при цьому не помічають жодних помилок.

Якщо ж тести успішні, починається поступове перенаправлення трафіку на green-поди — по 10% щохвилини (це етап Canary). У цей час оркестратор уважно стежить за спеціальним deploy monitor: якщо різко зростає кількість помилок у сервісі, або споживання CPU/memory/latency, оркестратор повертає весь трафік на blue-поди і гасить green. Таким чином негативний вплив помилкового оновлення обмежується мінімальною кількістю користувачів.

Ну і нарешті, якщо всі 100% трафіку переключилися на green-версію, старі blue-поди вимикаються, і сервіс продовжує працювати на новій версії.

Feature flags (toggles)

Важливо чітко розділяти поняття деплой та делівері. Не завжди, але досить часто буває безпечніше випускати фічу не радикально змінюючи код, а мати обидві реалізації в коді одночасно — і стару, і нову.

Наприклад, нещодавно ми винесли частину функціональності з моноліту в окремий сервіс (детальніше про це я писав у статті кілька місяців тому). У моноліті я додав виклик нового сервісу та отримання даних з нього, однак старий розрахунок не видаляв. Обидва розрахунки працювали паралельно декілька тижнів, що дозволяло мені постійно порівнювати їхні результати.

А feature-флаг визначав, яку версію розрахунку я буду використовуватись у подальшій роботі. Коли я повністю переконався, що новий сервіс працює без помилок, я видалив з моноліту стару функціональність. Feature-флаг давав впевненість: якщо щось піде не так, я можу швидко переключити джерело ресурсу.

Так само feature-флаги можуть допомогти, якщо ви викатуєте нову функціональність, до якої ще не готові інші сервіси системи. Або якщо хочете мати на проді функціональність, яку можуть побачити лише тестувальники, пілотні мерчанти чи якийсь відсоток користувачів.

Часто feature-флаги допомагають рухатися по TBD. Може здатися, що в нас немає великих задач, але «кілька деплоїв у прод на день» зовсім не означає роботу лише над завданнями на 1–2 story points — насправді ми реалізовуємо і масштабні задачі. Водночас не створюємо один великий merge request на тисячі рядків коду — щоби не страждати від виправлення конфліктів та не ламати середовище багами, які легко пропустити в такому величезному релізі.

Фічу видаємо порціями, і доки не готова, вона залишається прихованою за feature флагом. Цей флаг прибирається лише в останньому MR.

On-call duty

Наостанок поговоримо про чергування — квінтесенцію надійності системи. Метрики та логи будуть давати мало, якщо за ними ніхто не стежить. Так само і можливість швидко зробити rollback нічого не варта, якщо її застосовують із запізненням.

На базі логів і метрик можна побудувати алертинг, але важливо, щоб за ними спостерігала компетентна людина, яка знає, що з ними робити. Тут йдеться не лише про чергування в межах команд у робочий час — хоча таке в нас теж є. Маю на увазі чергування за критичними сервісами всієї компанії, від яких залежить процесинг платежів. За їхньою роботою цілодобово спостерігає черговий інженер, який реагує на спеціально налаштовані алерти, а через 24 години його змінює наступний.

Чергування — це необхідна, але недостатня умова. Лише її недостатньо, але і без неї також не можна.

Ми дійшли до моделі, де чергуванням займається невелика кількість досвідчених інженерів — здебільшого це техліди, адже найкраще розуміють систему ті, хто її створює. Процес чергування побудували на базі Grafana OnCall. У спеціальний Slack-канал приходять алерти з повним контекстом: що саме спрацювало, в якому сервісі, посилання на метрики та логи, які призвели до цього алерту, інформацію про останні деплої, а також повідомлення від зовнішніх систем про можливі проблеми.

Якщо трапляється alert, саме черговий:

  • Реагує на нього та вирішує, наскільки він важливий і якщо це інцидент, починає процедуру вирішення інциденту.
  • Координує всіх учасників процесу.
  • Долучає потрібних спеціалістів.
  • Комунікує зі стейкхолдерами та мерчантами, оновлює status page компанії.
  • Шукає шляхи вирішення інциденту.
  • Нотує перебіг всього процесу у спеціальному документі.
  • Збирає ретроспективну зустріч для аналізу події та визначення action items, щоб уникнути такого в майбутньому.

Висновок

Кожен із перелічених пунктів додає впевненості під час деплою, а всі разом гарантують, що задачу можна безпечно деплоїти в прод хоч в п’ятницю, хоч кілька разів на день.

А де ж мінуси, спитаєте ви?

Вони є. Безпечний CI/CD-процес існує, але досягти його непросто — щоб побудувати таку систему, потрібні місяці або роки. А особливою перепоною є стан, коли все і так наче працює, хай без тестів або без метрик, але працює — нащо щось міняти?

Та якщо ви будуєте живу й якісну систему, яка активно розвивається, варто інвестувати у це час та ресурси. Інвестиції згодом відіб’ються шляхом зменшення втрат від інцидентів і через оптимізацію процесу розробки.

Підсумуємо:

  • Лінтери, юніт-тести й функціональні тести дають впевненість, що нічого не зламалось ще до мержу в main-гілку.
  • Автоматизовані тести на stage (який as prod) гарантують, що зміни не зачепили інші сервіси.
  • Blue/green + Canary дають впевненість: навіть якщо тести щось пропустили, у проді проблема з’явиться лише ненадовго й зачепить мінімальну кількість користувачів.
  • А якщо й тут щось не спрацює — черговий on-call інженер моментально помітить відхилення за метриками, зможе швидко відкатити сервіс до попередньої версії або вимкнути feature-флаг з новою функціональністю.

Отже, можна натиснути «merge» і йти пити каву. За пів години робота буде в проді.

І це — хороша система:)

Корисні матеріали

$10.000 за хвилину даунтайму: архітектура, черги та стрімінг у фінтех
Як ми розпилювали моноліт. Наш досвід переходу до мікросервісів
DORA research
The Art of Software Testing
The Field Guide to Understanding ’Human Error’
Observability Engineering: Achieving Production Excellence
Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))
Site Reliability Engineering: How Google Runs Production Systems
The Site Reliability Workbook: Practical Ways to Implement SRE

Стартувало літнє зарплатне опитування DOU. Збираємо відповіді 15 тисяч ІТ-фахівців в анкеті. Долучайтеся!

👍ПодобаєтьсяСподобалось16
До обраногоВ обраному7
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

It depends on a type of deployment strategy

ага, ми вже двічі на цьому добряче погоріли цього року. ніяких релізів в п’ятницю, та ще й після обіду. Які би казочки тут вам не розказували.....

Сергію, дуже грунтовна стаття про те, як побудувати справжню культуру continuous delivery! Сподобався підхід до Blue/Green + Canary деплойментів — це дійсно вирішує проблему «деплоя у пятницю».
Цікаво, що ви згадали про той інцидент з видаленням мерчанта — це чудовий приклад того, чому інтеграційні тести критично важливі. Ми рік тому обговорювали подібні виклики під час співбесіди, і цікаво бачити, як ці принципи втілилися в практику у Solidgate.
А як швидко у вас прийшло розуміння, що DORA метрики дійсно допомагають, а не просто «красиві цифри»? Часто команди збирають метрики, але не знають, як їх правильно інтерпретувати.

Якщо нема ручних тестувальників, то хто перевіряє нові фічі на стадії розробки?

Я працював на різних проектах, один з піком в сотні тисяч активних користувачів, інший це стартап з кількома замовленнями в день. Але такого ніде навіть не чув

Наші розробники щодня роблять 40-50 деплоїв

Я ще розумію реліз раз на 2-3 дні, хотфікс залити поза планом.

Тут точно немає чим хвалитися, це погано організований процес доставки продукту.

Ну і це потогонка 100%, 40 тікетів в день зробити, задеплоїти.
Цікаво як часто на проді знаходять баги, як часто дзвонять on call людині.
я не вірю що при такому процесі можливо добитись якісного продукту.

Кароч, норм антиреклама Solidgate)

dou.ua/forums/topic/51033
они год назад распиливали монолит на распределенный монолит, теперь следствие деплой 40 тикетов на прод, как откатить версию, когда после тебя уже кто-то десяток новых версий задеплоил для меня загадка

dou.ua/forums/topic/51033
они год назад распиливали монолит на распределенный монолит, теперь следствие деплой 40 тикетов на прод

Так это и была цель!

как откатить версию, когда после тебя уже кто-то десяток новых версий задеплоил для меня загадка

Изи. В команде 4-5 инженеров и около 10 сервисов, которые они ведут. Предположим, что прямо сейчас активно идёт работа по трем из них. Это означает, что аж 2 инженера будут работать над одним сервисом одновременно. Каждому нужно написать код, пройти код ревью и задеплоить его. Я к тому, что это очень маловероятно, что после моего комита до момента когда я понял, что что-то сломал, ещё кто-то что-то закинет. Но! Такое было и нет ничего сложного. Я нажимаю реверт комита в мастере, выношу его в ветку и фиксаю там. Благодаря тому, что комиты маленькие оооочень маленькая вероятность, что мы зацепим прям один и тот же код

Деплоїти на прод кожен коміт з основної гілки (кожен МР) це обʼєктивно найкрайщий процес, який тільки може бути в розробці софту.
Це те, до чого йшли десятки років: Agile => Lean manufacturing => XP => CI => Trunk Based => Continuous Delivery => Continuous Deployment

І якщо ви працюєте по Continuous Deployment це говорить багато про вашу експертизу і якість софту, який ви деліверите. Тому тут є багато чим похвалитись )

Деплоїти на прод кожен коміт з основної гілки (кожен МР) це обʼєктивно найкрайщий процес, який тільки може бути в розробці софту.

Ні, не найкращий.
Деплоїти кожен коміт означає що *десь* марнується багато ресурсів, особливо людських.
А, он внизу ви і навели самі приклад

Тобто на одну задачу може створюватись будь яка кількість МРів, відповідно будь яка кількість деплоїв.

Тобто на папері в нас 40 релізів, а по факту навіть колір кнопки не міняєм.
Впевнений що в них там тисячі фіча флажків, недороблені фічі на проді які висять вже як легасі.

Я раджу ознайомитись з ідеями Low frequency vs High frequency integration, Lean manufacturing, Continuous Integration, Continuous Delivery, Continuous Deployment.

Всі ці методології корисні і використовуються не тільки в ІТ. Наприклад саме таким чином Toyota змогла вистоїти проти виробництва США в 40ві роки. Так само, як і Tesla в наш час. Тому про марність ресурсів може йти річ як раз в протилежних процесах до наведених вище.

Та не треба мені тих баззвордів, це все я читав як на міда девопса роботу шукав ще 10 років тому.

Ви мене не розумієте, що

Тобто на одну задачу може створюватись будь яка кількість МРів, відповідно будь яка кількість деплоїв.

Це не ок.
Навіть якщо гарна статистика чи стаття)

Бо от є фіча, і вона розбита на 10 MR, задеплоєна в різний час.
Як поревювати імплементацію?
А ніяк.

Бо от є фіча, і вона розбита на 10 MR, задеплоєна в різний час.
Як поревювати імплементацію?

Тут варто відзначити, що ви намагаєтеся приміняти поточні знання та архітектурні рішення до абсолютно інших підходів в розробці. Але спочатку я б порадив дізнатися, що саме деплоять на прод ці панове, бо є архітектури де це можна робити взагалі без проблем.

Наприклад, при декларативному стилі сенсу в ревʼю особливо немає, бо там код не змінюється. Також в системах, де водночас можуть існувати багато версій одного й того самого компоненту, які «відмирають» в режимі лагідної термінації, тобто спочатку треба закінчити всі завдання, повʼязані із старою функціональністю, а потім вже завершувати життєвий цикл, деякі з традиційних підходів втрачають актуальність. В системах, де між компонентами завжди є черга завдань, деплой можна робити безперервно, головне дотримуватися певних правил.

Це те, до чого йшли десятки років:

Ні, саме сюди ніхто спеціально не йшов. Не треба натягувати одну й ту саму сову на всі глобуси.

І якщо ви працюєте по Continuous Deployment це говорить багато про вашу експертизу і якість софту,

Може бути. Особливо, якщо ваша архітектура доведена до стану, коли ви пишете мінімум коду. Є системи, в яких теплоймент взагалі перестає бути потрібним. Але то вже вищий пілотаж, вони всі будуються за одним принципом майже.

Також, про 40 задач в день. Ні, не 40 задач. Бо робити один МР на одну задачу не вийде, якщо ви працюєте по Continuous Integration (за винятком якщо задачі дуже маленькі). Суть як раз в тому, щоб інтегруватись дуже маленькими ітераціями. Тобто на одну задачу може створюватись будь яка кількість МРів, відповідно будь яка кількість деплоїв.

І такий підхід дає дуже багато профіту, про це нам і говорить Lean manufacturing, XP, CI

Дуже дякую за статтю. Інформативненько.

Цікавить одна річ — у вас різко зростає продукт, з ним, скоріше за все, к-ть розробників.
Якщо у вас багато мікросервісів, як у вас розподіляється технічна експертиза по них?
Умовно, є якась команда, там сервісів 30. Ви розділяєте це по розробниках чи по іншому менеджите розробку? Просто якщо так, то найбільшу експертизу мають техліди або дуже сіньорні хлопці, які зайняті. Тому процес рев’ю МР, якщо зміни критичні, може затягуватись. Як ви розрулюєте такий момент? (цікавить як у вас зберігається швидкість розробки/деплою/etc)

Был опыт специально обновляться в пятницу, чтобы в субботу под меньшей нагрузкой допроверить на проде и исправить все косяки ))). У нас суббота была рабочая/дежурная, а клиентов и заказов на сайте раза в 2 меньше чем в будни.

Я шота думав шо канари релиз — це деплой на 10% кластера и потом мониторинг шо на канари не появляется фаталов. Если на канари все ок, то через 1 час релиз деплойться на остальни 90% серверов. Если на канари появились фаталы, то релиз блокируется и канари делает авто ролл бек. Плюс не вижу нагрузочных тестов на стейж, они часто идут вместе — льем на стейж реквесты записанные в течении последей недели и смотрим сколько реквестов они осилят, если раньше осиливали 60 реквестов в минуту а теперь только 30, то явно гдето накосячили. Потом когда достигнут потолок и стейж перестает отвечать, начинаем уменьшать количество реквестов и смотрим что стейж опять может их все обслуживать, если стейж не приходит в себя — то тоже косяк, или не стоят таймауты на пулах, или кеши забиты, или еще что то что не дает обслуживать реквесты. Потом — никто не смотрит на дешборды все время, для этого есть автомониторинг, автоскейлинг и т.д. В конце концов дешборд пошлет смс если метрики вышли за нормальные пределы. И последнее, отам в конце пайплайнов на шаге деплоймента должен быть конфиг в котором можна сказать — не деплоить по празникам, не деплоить по пятницам, субботам и воскресеньям, деплоить на 20% серверов единовременно, авто роллбек если появилось фаталов больше 1го процента и т.д. Ну это в серьйозных пайплайнах, если у вас микросервис от которого ничего не зависить то можете деплоить как хотите.

та даже 1 часа мало, в одном сервисе текла память и он регулярно прибивался OOM по нескольку раз в сутки, это как раз для любителей деплоя в пятницу в 6 вечера как в этой конторке будет развлечение на выходных пооткатывать версии или хотфиксы доливать по воскресеньям

1. Скільки часу у вас триває стадія функціональних/інтеграційних тестів? На одному з проектів у нас реліз авто-тестувався біля години часу. Тести всього кластеру запускались.
2. У вас стейджі он-деманд підіймались? Бо ж якщо один стейдж, і хтось ганяє свою гілку, то інші чекають🤔 дивуюсь як забезпечити аж такий рейт деплоїв у день.
3. Як відкотити свою версію, якщо по верх твоєї вже накинули одну-дві нових? Типу реверт-коміт робите в IAC репозиторії?
4. Як працювати з blue/green deployment, якщо сервіс опрацьовує не тільки http трафік? Тут зрозуміло як трафік перенаправити через лб. Як хендлити переключення хендлерів меседж-брокерів чи скедулерів?

1. Згідно піраміди тестування в нас їх не супер багато. В середньому десь хвилин 10 і ще 10 е2е тести. Тестові сьюти в нас окремі для кожного сервісу, тобто ми не проганяємо кожен раз абсолютно всі тести
2. 1 стейж-ес-прод. Невеликі сервіси+невелика команда, яка працює з цим сервісом+ доволі швидкі пайплайни приводить до того що прямо одночасно ніхто не деплоїться. Звісно виключення бувають, але дуже рідко
3. Якщо пече, можна просто повернути все на кілька версій назад, а вже потім реверт коміта, але прям таке буває теж доволі рідко. Якщо вже щось вийшло і настільки все не розвалило, що встигли вийти ще кілька версій, то можливо, це щось легше не відкатувати, а огорнути фіча флагом або відразу зафіксити
4. Ми не робимо брекін ченжес в один момент. Тобто всі зміни розраховані на одночасну роботу обох версій. Проблема з чергами в нас є лише при прогонці тестів, щоб гарантувати, що тести пройдуть лише на новій версії. І ось тут ми ще копаємо і шукаємо хороше рішення. Поки що тестуємо лише через хттп

видать в генезисе практикуется методы потогонки, если вы льете все подряд в пятницу вечерком, значит руководство пушит на разрабов. Я работал в похожих гиганстких проектах, в пятницу заливали максимум критичные фиксы или мелкие фичи, гарантировано не приведущие прод в ступор. А на другом проекте с огромным количеством жирных кастомеров с мировыми именами на прод было запрещено что-то выливать либо фриз на деплой вешали за неделю до праздников. Что вы льете по 50 фич в день означает какой-то бардак и вечно горящие таски на вчера

Ну нет. Вообще не так. Это означает, что процесс налажен так, что это для нас рутинная работа. Не бардак, а наоборот четкая слаженность. Почитайте про DORA. Мы минимизировали риски на всех этапах и теперь не отвлекаемся на всю эту фигню с релизами. В какой-то момент при очередном деплое поймал себя на мысли, что сейчас пятница 6 вечера. Просто уже не думаем об этом. Разницы в днях нет. Плохой релиз может выстрелить когда угодно. Пропуская пятницу, все равно не спастись от падения ночью или через пару дней в субботу.
Суть статьи именно в этом

Якщо деплоїтись в п’ятницю, та бізнес не працює на вихидні, то це найнебезпечніше, бо так, є вихідні щоб виправити, і це добре.
Але правильне питання не коли деплоїтись, а скільки було овертаймів за останній рік.

Наші клієнти працюють цілодобово. У деяких трафіка у вихідні найбільше. Ціль наших робіт в цій статті — це DORA. Тобто мінімізувати фейл деплої та мінімізувати час відновлення після такого деплою. Тобто зробити всі підготовчі процедури, щоб овертаймів не було.
Я пам’ятаю часи зборки версії, де сидимо до перемоги, поки не викатимо масу змін щоб встигнути до п’ятниці. Щось йде не так і швидко фіксимо. Потім куримо поки тестувальники перевіряють, потім знов фіксимо, а тестувальники курять....
Ось де овертайми

in 20-21 I worked in Seattle in the Google.cloud team as a build engineer. Everything you talk about here is complete nonsense. The frontend was rolled out to production once every three days. No one there had heard of DORA :)))

Ну то я про те і кажу, що неважливо в який день деплоїти, це залежить від проекту та бізнесу.
Важливо, щоб овертаймів не було.
Це можно зробити чи якісною підготовкою, чи штатною працею у «змінах», і наймають людей, які можуть так працювати.
Щоб о це «до победи» не було зненацька та регулярно.

прочитав статтю, все це дуже красиво, деплоїти в пʼятницю все одно не буду

До речі, прочитати про це більше ви можете у статті Head of Engineering Solidgate Макса Багінського, в якій він розповідає про втрату $10,000 за хвилину даунтайму нашої системи.

Це 432 мільйона на місяць. Немає у вас таких грошей, хлопці.

Не можна рахувати об’єм транзакцій за втрати. Бо:
1. Ви берете собі лише 3% і ой! Це вже не 10К а 300$. А ще, то напевне є найгірший випадок..
2. Насправді ніхто нічого не втрачає, якщо воно не впало менш ніж на 2-3 години. Бо люди це такі істоти які вміють в retry із exponential backoff. Якщо у людини не пройшла транзакція, вона спробує повторити пізніше.

Ви хочете купити пропелери для FPV на одному сайті, там не пройшла оплата — ви ідете на інший сайт і купуєте там пропелери. Далі вам будуть приходити листи від сайту з іншими товарами, або навіть з тими самими пропелерами і ви знову їх купите на тому сайті де пройшла оплата раніше.
Або користувач робить імпульсивну покупку підписочного продукту, він не впевненний на 100% що воно йому треба — але він наважився, зайшов на сайт і робить оплату — оплата не пройшла — він подумав: «ну і ладно» і не повернувся до цієї покупки. Ось ви втратили користувача який ще приніс би непогано коштів в майбутньому.

Якщо оцінювати втрати виключно за свою комісію — вам не будуть довіряти клієнти, та будуть шукати собі більш стабільніше рішення.

Нє, пропелери будуть купуватися на все тому ж сайті, де можна купити 10 якісних пар за 9.99$, а не оце от все. Навіть, якщо там не пройде оплата одразу =)

Добре мати невеликі пайплайни, де кожен крок може бути автоматизованим. Я от бачив пайплайни разів в 5 більші, де були такі кроки як:
— Ручне підтвердження релізу на прод віцепрезидентом компанії
— СМС техніку натиснути кнопку на одній залізяці, бо вона, падлюка, не має жодного програмного інтерфейсу керування нею + очікування зміни стану цієї залізяки
— Лист державному регулятору з запитом на дозвіл релізу + очікування цього дозволу.

От і спробуйте таке автоматизувати, релізнути в п’ятницю ввечері чи автоматично відкотити.

Дійсно іноді це може залежати від регуляцій, навіть зовнішніх. В такому випадку ТОП менеджменту треба працювати в сторону перегляду цих аспектів, якщо їм звісно доцільне пришвидшення доставки змін. Доволі часто може допомогти не автоматизація, а перегляд процесів.

Ты как лид на себя забрал работу на выходных, что бы команда лупила пятничные релизы, ну молодец 🫂

Не зовсім. Мені подобається чергувати по суботах (таке випадає десь раз на кілька місяців), але з моєї практики це найспокійніший день, коли нічого не трапляється. Просто тримаю ноут поруч )
Ось по неділях вже щось дивне відбувається часто, ну а в будні церез активну розробку природньо роботи у чергового багато

Solidgate:

Наші розробники щодня роблять 40-50 деплоїв і випускають оновлення навіть у п’ятницю.

Genesis:

Наши специалисты много работают — в среднем это 10-11 часов. Они это делают не потому, что их кто-то заставляет. Они просто любят то, чем занимаются и хотят видеть результат своей работы.

Безоплатні перепрацювання шкодять здоров’ю, деплої в п’ятницю — нервам. Бережіть себе, працівники Solidgate та Genesis.

Якщо після п’ятничного деплою трапився rollback — то він має трапитись спершу з перевіркою наслідків, на репліці... а для того треба в Immutable Infra, й девупси мають бути там з AWS SRA/PRA й infra drift’ом ...

Якщо й навіть трапляється феєрія — люди принаймні перевіряють можливість відкату, щоб продовжити після вихідних. Це, я вважаю, — нормальна практика. Коли не можна ролбекнутись без наслідків — нема сенсу деплоїти...

кращі деплої — вечір неділі, автоматично, якщо що, у понеділок з ранку все фікситься

Існує закон природи: Все що працює в п’ятницю, не вважається працездатним в понеділок. І цей закон дуже добре працює, я перевіряв.

😆 дякую. Треба запам’ятати

Деплоймент навіть у понеділок не гарантує відсутності дефекту наступної суботи, або навіть через тиждень. В принципі зміни — це завжди ризик, але часто ваші зміни можуть мати відтермінований ефект, але ж це не означає що треба припинити розробку продукту.
Хоча звісно треба оцінювати масштаб ваших змін та як ви забезпечуєте їх працездатність, а це дійсно може сильно варіюватися від величезної купи факторів.

В одній, там, великій, дуже великій компанії, яку ВСІ знають, і на яку ви посилаєтеся в статті, тотальний бан був не то шо на п’ятничні деплойменти — він з другої половнини четверу починався.

З автоматизацією, тестами, CI/CD, тощо, тощо

І це, в принципі, правильно.
А об’єм практики в них все ж гігантський, варто дослухатися.

Якщо я вас правильно зрозумів, то це та компанія, де після жовтня оголошується код фріз аж до середини січня.

Але ці практики і підходи вже застарілі. Прогрес не стоїть на місці

після жовтня оголошується код фріз аж до середини січня.

це легенди
ні, то була друга половина грудня

давайте вже після свят ©, так би мовити

Довгий кодфріз призводить до накопичення змін, що сприяє інтенсифікації релізів в короткий проміжок часу після нього і відповідно підвищенню ризиків. Кодфріз норм штука під конкретні періоди, але з ним також треба бути дуже обережним.

Довгий кодфріз

Ви, головне, не переживайте так.

це все дуже красіво, все по бест практісес, броня

особливо круто це слова типу «гарантує» і згадки про 24годинні зміни одного інженера.

Моя порада — зробіть ротацію по 8годин на три зміни з оверлапом в годину шолє, люди ж не собаки. І в критичні періоди має бути двоє осіб на зміну

коли ця вся автоматична піраміда феєрічно одного дня положить прод на вихідні — напишіть про це статтю теж. Питання часу

Правило пятниці не просто так правило пятниці

Стаття сподобалась, але реліз в пятницю почекає і до понеділка

на блекфрайдей ви настільки само впевнені? :) Цікаво послухати

Моя порада — зробіть ротацію по 8годин на три зміни з оверлапом

Бувають періоди, коли за зміну не трапляється жодного не те що інцидента, а навіть алєрта. От прям живимо тиждень, чергові міняються і все працює як годинник. Але буває таке, що на одній зміні стріляють алєрти без перерви ще і кілька інцидентів трапляється. Тут складно спрогнозувати як краще. Поки що доба.

напишіть про це статтю теж

Так таке було вже. Я в суботу вранці в самих трусах в коридорі (бо до укриття не добіг) ескалював інцидент. І от на дзвінку вже необхідні спеціалісти, за вікном майже без перерви все вибухає аж будинок трясеться, а ми фіксаємо базу карткових бінів тому що в цей день мастеркард прислав нам криві дані про картки ))

блекфрайдей

Тут піймали)
Дійсно, в нас тоді на три дні був код фріз. І це призвело до неприємних наслідків. Тому що наш конвеєр зупинити складно, а запустити знов ще складніше. Коли накопичується велика черга змін

Якщо запустити ще складніше — то щось тут не так )
не вистачає покриття тестами?

Під блекфрайдей дійсно робимо кодфріз, але це більше під навантажувальне тестування, щоб в продукті не було змін які не потрапили в період проведення навантажувального тестування, та потім вилізли якісь unexpected речі.

Щойно деплоїв хотфікс, баг якому 4 роки, його не помічав ніхто.
Маємо більшість із описаного вище.
Деплоїв без страху, бо високе покриття автотестами й маю миттєвий ролбек.

Але маю й інший досвід, коли задеплоїли в пт, в обід, а після роботи 5 тимлідів пішли на день народження до QA-ліда, вже встигли відчути вплив алкоголю. О 23:00 падає сервіс, за собою каскадно валить основний сервіс. Кожну хвилину втрачаємо досить багато грошей. Не той, який релізили, але відчуття пов’язаності не покидає. 5 п’яних тимлідів сидять довкола одного ноутбука на березі Дніпра, через мобільний інтернет, шукають причину й спілкуються з тверезими DBA, по телефону. DBA навішує індекс на таблицю з 5 млн записів, і починається стабілізація та підйом сервісу. Пошук звідки в новій таблиці 5 млн записів, коли очікувалося максимум 1 тис. Згадуємо обідній реліз сервісу, який заливає дані в БД. А впав сервіс, який їх читає. Зупиняємо новий крон, який щогодини в геометричній прогресії розмножує кількість записів у новій таблиці. Фіксимо в суботу. У понеділок робимо висновки.

Ще маю купу досвіду, коли в пт релізити не варто, бо зазвичай ті, хто можуть це помітити в продакшені, відпочивають на вихідних. І в понеділок потім випливає купа інцидентів... Задача виконана відповідно до вимог бізнесу, але бізнес не передбачив усіх можливих ефектів на інші бізнес-процеси. В понеділок КЦ видає список.

І я провів не одні вихідні з ноутбуком, бо: «А-а-а, виключіть те, що ви робили, бо воно щось там зламало в іншому місці». Це коли сервіс має широку зону впливу і під десяток замовників, які не слідкують за тим, що відбувається в інших бізнес-процесах.

Я майже завжди їду у відпустку з ноутбуком, і часто навіть вечірня прогулянка з ноутбуком у машині. Саме тому релізимо в пт тільки тоді, коли хтось свідомо погоджується сапортити сервіс усі вихідні. Бо черговий девопс може відкотити задачу, але не завжди цього достатньо, доволі часто треба робити щось додатково, щоб припинилась стадія самопошкодження.

Крута історія! ))

Але чи могло бути святкування ДР в середу? А якби так сталося і це була середа вечір? Або навіть ніч

Святкування по середах тоді були з піцою, прямо в офісі. А щоб зібрати хорошу компанію на алкоголь — то тільки п’ятниця, навіть якщо ДН, в середу. Бо в кожного свої плани на вихідні. В когось спортзал, а в когось — похмілля. Зараз такий сценарій мало ймовірний: хтось виїхав, більшість не п’є як раніше, я — в тому числі. То було ще до ковіду.

Я пам’ятаю як випустили версію з кривою міграцією в п’ятницю, але помітили, що видалили пів бази вже лише в суботу і довелося відновлювати вручну частинками дані з останнього бекапу ))

Я памʼятаю це. Це було 🤯🤯🎉🎉🎉 святково)

Я б додав, що деплой на прод це не реліз. Ви можете задеплоїтист на прод скільки завгодно разів на день, в будь який час, і жоден з цих деплоїв не матиме ніякого імпакту на користувачів (за винятком фіксів чи маленьких імпрувментів), оскільки ми використовуємо feature toggles та parallel change техніки. А от для релізу вам варто враховувати день і час. Оскільки для релізу деплой на прод може бути навіть не потрібен — реліз це просто включення фіче флагу на прод енві. І тут важливий не лише час, а й порядок. Бо якщо хтось ввімкне фіче флаг на клієнті, а ця фіча має залежності на інші сервіси, перед тим як ввімкне цю фічу на тих сервісах, то все це зламається навіть якщо тисячі тестів зелені.

Тому я б хотів звернути увагу, що деплой на прод — це не реліз. Деплоїтись в пʼятницю ввечері це звична справа. Релізитись в пʼятницю ввечері — я не впевнений що воно того варте і не почекає до понеділка ))

Ммм. Добре, хай буде так. Але не варто забувати про тести також. Тести на проді перевірять все і з виключеним і з виключеним флагом. Тобто деплой не побачать юзери, але побачать тести, тож це реліз, хоч і не для всіх.
А про ввімкнення це дійсно окрема історія. Я навіть іноді забуваю вже про якусь задачу яку робив, а потім згодом вже дізнаюсь, що її пару тижнів крутили частково лише на одному мерчанті, а потім розкатили на всіх і до мене прилітає задача по клінапу флагів

Перевіряти все повинні на тест енв (і з включенним і з виключенним тогглом) це в ідеалі і тільки якщо це по якимось причинам неможливо тоді на проді

Дякую за супер корисну інформацію, та повага, що налаштували в себе такий процес.

Скільки тестів — достатньо? Як виміряти «достатність»?

Мутаційним.

Найпростіше рішення — rollback

Є момент з healthcheck’ом, бо типові Liveness, Readiness, Startup проби не відпрацьовують для сервісів з деградованою доступністю — треба агрегувати затримки по викликах за останні 5-10хв та від того гарантувати вимоги р95 р99 до доступності. Зазвичай то зручно робити через k6 та пром.

Згоден, це круто в автоматизованих процесах. В нас є складні алєрти, які за допомогою Prophet очикують прогнозовані значення на які система також реагує. Але в цьому розділі більше було за ті кейси, де вся автоматика провалилася, але людина бачить проблему. Тобто має бути ручка

за допомогою Prophet

Ви ж в курсі що профет то звичайний stan обгорнутий отак пістоном ? Й в нормальні demand forecasting й anomaly detection завозять TFT / N-Beats / N-Hits на торчі.

де вся автоматика провалилася, але людина бачить проблем

Ну... весь AIOps зараз будується на LLM-агентах з відповідними MCP серверами в Observability, то зараз авторегресивна й автокорелятивна «автоматика» на типових статичних методах є лише першою ланкою автоматизації.

Так, авжеж. Ми його використали ще дуже давно тому хай буде ще перша ланка )

Ок, спробую підсумувати, хоча прозвучить банально. Є різні рівні надійности сервісу. Підвищення надійности це завжди додаткові інвестиції. Більше інвестицій — вища надійність. Тому це не завжди себе окуповує, треба дивитися на бізнес.

На верхньому рівні надійності, ІМХО, формальна верифікація коду: математичне доведення, що програма працює коректно. У цьому разі, теоретично, не потрібні ні тести, ні тестери. Але це вже зовсім інший підход.

Якщо власник готовий інвестувати в надійність, то зазвичай здорового глузду достатньо, щоб придумати, що саме варто зробити, щоб підвищити надійність: unit-тести, інтеграційне тестування, моніторинг, алерти й так далі, читайте статтю з банальними прикладами. Я би окремо звернув увагу на паралельний запуск продакшену і бети, дублювання запитів, порівняння швидкодії та результатів.

Щодо п’ятничного деплою, то усе описано це зменшення ризиків, а не виключення їх. Так, є rollback-кнопка, головне, але на вихідних банально менше людей і менше очей. Так, це може бути перевірка нової версії на меншому трафіку з менш критичними наслідками. Але в вакуумі це просто легке підвищення ризику, що має певні спільні риси з бахвальством, еквілибристикою на балконі. Так, у більшості випадків без наслідків.

Плюсую про все написане. Тому і написав, що не для всіх це підходить. Але якщо система така, де можна втратити 50, 100 або 200к на рівному місці (в мене на одній з робіт таке було), то задумуєшся, що якщо б вкинув ці 100к в розробку інструментів надійності, міг би ці 200к не втратити. А також вберегти себе і від майбутніх факапів.
А от про п’ятницю: посил цієї статті був не скільки в тому, що «ось які ми безстрашні та любимо ризикувати», а про те, що в нас розробка наблизилась до потоку в якому немає різниці який день тижня. Ми коли деплоїмо, не задумуємось який сьогодні день через те, що ця практика (деплой) стала пересічною

Ще про

дублювання запитів, порівняння швидкодії та результатів

В нас це зроблено спеціальними тестами на стейжі. Через те, що стейж-ес-прод, ми відразу на стейжі бачимо, що десь просіли по швидкості

Все вірно, надійність це доволі коштовний аспект і він має бути доречним.

Підписатись на коментарі