Skip to content

feat(deploy): bramka zdrowia po deployu (make up/run)#15

Merged
mpasternak merged 1 commit into
mainfrom
feat/post-deploy-health-gate
Jun 30, 2026
Merged

feat(deploy): bramka zdrowia po deployu (make up/run)#15
mpasternak merged 1 commit into
mainfrom
feat/post-deploy-health-gate

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Co i dlaczego

PR #13 słusznie wyrzucił side-effectful testy (mail/Rollbar) z auto-deployu, ale wpadliśmy w drugą skrajność: po make run/make up nic się nie sprawdza, jest tylko jednolinijkowy hint „uruchom make doctor". Ten PR przywraca automatyczne, ale ciche i read-only potwierdzenie zdrowia po deployu — bez szumu powiadomień.

Zachowanie

make up (a make run przez zależność) kończy się lekką bramką scripts/post-deploy-check.sh:

Sytuacja Efekt
wszystko zdrowe ✓ uslugi zdrowe + exit 0 (cicho, nie blokuje)
problem + terminal (TTY) podsumowanie + prompt [s] shell · [d] make doctor · [klawisz] wyjście, exit 1
problem + nie-TTY (CI/cron/| tee) podsumowanie + exit 1, bez pytania
błąd samej bramki (brak compose itp.) fail-open → exit 0, nigdy nie blokuje deployu

Decyzje projektowe

  • Bramkuje na stanie kontenerów (unhealthy / restarting), nie na grepie błędów w logach (za dużo benign „error"/„failed" → fałszywe alarmy).
  • exited świadomie NIE flagowane — to łapałoby on-demand backup-runner jako fałszywy problem.
  • Read-only: nie wysyła maili/pushy/Rollbara — te zostają opt-in w make doctor (zgodnie z intencją PR feat(make): doctor menu diagnostyczne + deploy bez auto-testów #13). Auto-leci tylko read-only health.
  • Po docker compose up --wait healthchecked usługi są już zdrowe (inaczej up stanąłby wcześniej) — bramka łapie więc głównie flap po --wait i usługi bez healthchecka w crash-loopie, plus daje jawne /prompt.
  • Prompt na stderr, czyta ze stdin → działa też przy make up | tee deploy.log. up-quick celowo bez bramki (lekki wariant).

Walidacja

  • Unit-testy scripts/test-post-deploy-check.sh (mock docker compose ps + make): OK/unhealthy/restarting/exited/pusty — 5/5. Cel make test-post-deploy-check.
  • Smoke-test na realnym dockerze: szablon {{.Service}}\t{{.State}}\t{{.Health}} emituje poprawnie (puste health dla usługi bez healthchecka), a kontener z padającym healthcheckiem realnie daje unhealthy i jest łapany.
  • bash -n + shellcheck (profil repo) czyste; make test-doctor 19/19 bez regresji; mkdocs build --strict czysty.

Docs

Notka w docs/eksploatacja/komendy.md (sekcja Diagnostyka) + kontrakt dla agentów w CLAUDE.md (Safety).

Uwagi

  • Jak test-doctor, nowy make test-post-deploy-check nie jest jeszcze wpięty w CI (tests/test_makefile.sh) — istniejący gap, świadomie nie ruszam w tym PR.
  • Wybór za make up i make run (nie tylko run) — zgodnie z ustaleniem.

🤖 Generated with Claude Code

`make up` (i `make run` przez zaleznosc) konczy sie lekka, read-only bramka
scripts/post-deploy-check.sh. Po `docker compose up --wait` healthchecked uslugi
sa juz zdrowe; bramka lapie to, co moglo pasc PO --wait albo czego --wait nie
pilnuje: usluge `unhealthy` lub `restarting` (crash-loop, takze bez healthchecka).

Zachowanie:
  - wszystko OK            -> "✓ Wszystkie uslugi zdrowe." + exit 0 (cicho),
  - problem + TTY          -> prompt [s] shell / [d] make doctor / [klawisz] wyjscie
                             (auto za 30s), exit 1,
  - problem + nie-TTY      -> wypis + exit 1 bez pytania (CI/cron/`| tee`),
  - blad samej bramki      -> fail-open (exit 0), nigdy nie blokuje deployu.

Bramkuje TYLKO na stanie kontenerow (NIE na grepie bledow w logach). `exited`
swiadomie NIE flagowane (lapaloby on-demand backup-runner). Read-only: NIE
wysyla maili/pushy/Rollbara — te zostaja opt-in w `make doctor` (intencja PR #13).
up-quick celowo bez bramki.

Opt-out BPP_SKIP_HEALTH_GATE=1 dla wewnetrznej automatyki wolajacej `make up` pod
`set -e` — bez tego transient flap zdrowia tuz po restarcie przerwalby sekwencje
(np. `make up` przed `make migrate` w upgrade-postgres.sh) albo prompt zawisalby
w TTY-bez-czlowieka. Ustawiaja go: scripts/upgrade-postgres.sh (krok 10, przed
migrate) i scripts/restore.sh. `read -t 30` dodatkowo chroni przed zawieszeniem
w PTY-bez-czlowieka (ssh -t / Ansible). Blad `docker compose ps` -> fail-open,
ale BEZ falszywego "zdrowe" (nie twierdzimy zdrowia, ktorego nie sprawdzilismy).

Prompt na stderr + read ze stdin -> dziala takze przy `make up | tee deploy.log`.

Testy: scripts/test-post-deploy-check.sh (mock docker compose ps + make; sciezki
OK/unhealthy/restarting/exited/pusty/blad-ps/opt-out), cel `make test-post-deploy-check`.
Zwalidowane: bash -n, shellcheck, unit-testy 7/7, smoke-test na realnym dockerze
(szablon ps + wykrycie unhealthy), test-doctor 19/19 bez regresji, mkdocs --strict.

Docs: notka w docs/eksploatacja/komendy.md + kontrakt w CLAUDE.md (Safety).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak
mpasternak force-pushed the feat/post-deploy-health-gate branch from d937ca6 to a219bd7 Compare June 30, 2026 21:41
@mpasternak
mpasternak merged commit 6da8ee9 into main Jun 30, 2026
5 checks passed
@mpasternak
mpasternak deleted the feat/post-deploy-health-gate branch June 30, 2026 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant