0% прочитано

Нотифікація про реліз повинна з’являтися після успішної перевірки застосунку, а не після git pull

Оновлений Git revision ще не означає успішний реліз. Після git pull або fetch/reset залишаються Composer, frontend build, migrations, cache, queue workers, Reverb і фінальний HTTP health check. Success-notification має з’являтися лише після проходження всього deployment gate.

4 листопада 2026 р. 9 хв читанняDevOps

У deployment pipeline дуже легко поставити notification занадто рано. Код уже завантажений на сервер, Git показує новий commit - і система повідомляє команду: реліз успішний.

Але після оновлення Git revision застосунок ще може впасти на composer install, frontend build, migrations, cache rebuild, restart queue workers або Reverb. Навіть якщо всі ці команди завершилися без помилки, реальний HTTP request ще може повертати 500.

Тому для мене release notification має означати не "код скопійований", а "нова версія пройшла фінальну перевірку працездатності".

git pull підтверджує лише один етап deployment

Команда Git відповідає лише на вузьке запитання: який revision зараз знаходиться у working tree.

Вона нічого не доводить про PHP dependencies, database schema, frontend assets, Laravel cache або background processes.

Git revision оновлено, але deployment ще не завершений
git fetch origingit reset --hard origin/main DEPLOYED_SHA="$(git rev-parse HEAD)" echo "Code updated to: $DEPLOYED_SHA"
Цей момент можна логувати як code_updated або revision_installed, але не як release_success.

Після Git ще залишається критична частина

У нашому Laravel deployment після зміни revision ідуть кроки, кожен з яких може зробити нову версію непридатною до роботи:

  • встановлення production Composer dependencies;
  • frontend build;
  • database migrations;
  • storage link та інші filesystem checks;
  • очищення і перебудова Laravel caches;
  • restart queue workers;
  • restart Reverb;
  • перевірка process state;
  • вихід із maintenance mode;
  • фінальний HTTP health check.

Maintenance mode задає правильну межу

Під час критичної частини deployment користувач не повинен бачити напівоновлений застосунок. Тому сайт переходить у maintenance mode до зміни активного application code.

Якщо критичний крок падає, deployment не має "успішно" повідомляти про реліз. Потенційно пошкоджена версія залишається прихованою за контрольованою 503 сторінкою до recovery або rollback.

Правильна точка success notification
Start deployment    |Enable maintenance    |Update code    |Install dependencies    |Build assets    |Run migrations    |Rebuild caches    |Restart workers / Reverb    |

Command success ще не дорівнює application health

Pipeline може побачити exit code 0 від Composer, migrations і cache commands. Це корисні сигнали, але вони перевіряють лише свої операції.

Фінальний application-level check повинен пройти після всіх deployment steps, коли користувацький traffic знову може потрапити в нову версію.

Фінальний HTTP health check
curl \  --fail \  --silent \  --show-error \  --max-time 10 \  https://example.com/health \  > /dev/null
Health URL у прикладі умовний. У реальному deployment використовуйте власний endpoint або контрольний HTTP request, який справді проходить через потрібний application stack.

Health check має перевіряти більше, ніж Nginx

Відповідь 200 від статичного файлу доводить, що Nginx працює, але не обов’язково доводить, що Laravel може завантажитися.

У deployment closeout корисно окремо мати сигнали про Laravel boot, database connection, frontend assets, queue workers і Reverb. Фінальний HTTP request доповнює ці перевірки як останній gate.

Success notification має бути після gate

Найпростіше правило: success notification є side effect успішного deployment outcome, а не side effect Git command.

Тобто спочатку pipeline проходить усі перевірки, фіксує deployed SHA і лише потім створює release notification.

Notification тільки після всіх перевірок
DEPLOYED_SHA="$(git rev-parse HEAD)" run_deployment_stepsverify_supervisor_processesverify_reverbdisable_maintenance_moderun_final_health_check notify_release_success "$DEPLOYED_SHA"
Функції в цьому фрагменті ілюстративні. Вони показують порядок і boundary, а не готові команди конкретного deployment script.

Failed health check не повинен створювати success notification

Якщо фінальний health check падає, у нашій deployment моделі maintenance mode активується знову, а job завершується помилкою.

У цей момент можна створити окремий deployment failed alert, але не success release notification. Це різні події з різною семантикою.

Failed і success outcomes розділені
if ! run_final_health_check; then    enable_maintenance_mode     notify_deployment_failed "$DEPLOYED_SHA"     exit 1fi notify_release_success "$DEPLOYED_SHA"

Deployed SHA варто включати в notification

Release notification стає значно кориснішою, якщо містить immutable reference на реально розгорнутий commit.

Тоді повідомлення відповідає не лише на "реліз завершився", а й на "яка саме версія зараз пройшла health check". Це спрощує rollback, incident analysis і звірку з pipeline.

Приклад мінімального release notification payload
Release successful Commit: abc1234Environment: productionHealth check: passedWorkers: runningRealtime: running

Не надсилайте notification до commit deployment state

Якщо система окремо зберігає deployment record або deployed SHA, спочатку потрібно зафіксувати успішний outcome, а потім створювати notification.

Так notification не стане єдиним доказом того, що реліз був успішним. Вона лише повідомляє про вже зафіксований deployment state.

Що тестувати

  • Git update успішний, але Composer падає - success notification відсутня;
  • migrations падають - success notification відсутня;
  • queue worker або Reverb не RUNNING - success notification відсутня;
  • final HTTP health check повертає помилку - maintenance повертається, job failed;
  • усі deployment steps і health check PASS - рівно одна success notification;
  • retry deployment не створює дубль notification для того самого successful deployment outcome;
  • notification містить deployed commit SHA, який відповідає фактичному release.

Release notification повинна повідомляти про перевірений стан застосунку, а не про завершення однієї команди всередині deployment.

Підсумок

git pull, fetch/reset або checkout нового commit - лише початок deployment, а не доказ успішного релізу.

Success boundary має бути після dependencies, assets, migrations, caches, background processes, виходу з maintenance і фінального application health check.

Лише після цього release notification чесно означає те, що читає користувач або команда: нова версія справді розгорнута і перевірена.