Przejdź do treści

Pułapki przy zmianie sesji wdrożeniowej i pętli auto-update

Strona dla osoby edytującej scripts/deploy-with-warning.sh, scripts/site-down-warning.sh, scripts/autoupdate.sh i cele w mk/deployment.mk. Instrukcje operatorskie są osobno: Przerwa techniczna i Aktualizacje.

Wspólna cecha wszystkich opisanych tu błędów: awaria jest cicha. Serwis zostaje zablokowany albo pętla umiera, a jedynym śladem jest brak śladu.

Przerwa techniczna

To repozytorium nie zawiera logiki odliczania

Baner, strona 503 i każda zmiana stanu należą do django-countdown (>= 0.3.0) w obrazie BPP. My wyłącznie wołamy manage.py.

Nie przywracaj ścieżki przez manage.py shell

Wcześniejsza implementacja pisała wprost do modelu SiteCountdown. To obchodzi walidację i logikę aplikacji, a przy zmianie schematu w obrazie psuje się bez ostrzeżenia. Jeśli brakuje operacji — należy ona do django-countdown, nie tutaj.

Domyślny zakres różni się między komendami

To nie jest niekonsekwencja do „posprzątania" — to kontrakt aplikacji nadrzędnej, a jego zignorowanie zostawia otwarte domeny w trakcie przerwy.

Komenda Domyślny cel Ma --all?
stop_countdown, show_countdown wszystkie witryny
extend_countdown, shorten_countdown tylko bieżąca tak
start_countdown tylko bieżąca nie

Ostatni wiersz jest powodem, dla którego istnieje pętla po SITE_IDS. Przy multi-hoście jedna instalacja obsługuje wiele domen (DJANGO_BPP_HOSTNAMES → wiele wierszy Site, rozwiązywanych per żądanie przez SiteResolutionMiddleware) — bez tej pętli zablokujesz jedną, a resztę zostawisz otwartą.

Nigdy nie ucisz heartbeatu przez || true

Podtrzymanie terminu to extend_countdown --at-least, dla którego pusty cel jest celowo sukcesem. Skoro tak, to niezerowy kod wyjścia niesie konkretną informację: podłoga dead-man's switcha wygasła.

Sesja ma to głośno zalogować i pracować dalej (nieudany exec w środku recreate'u jest spodziewany). Zamiana na || true zamienia jedyny sygnał o wygasłej blokadzie w ciszę.

maintenance_until służy tu dwóm panom naraz — jest ETA pokazywanym użytkownikom i dead-man's switchem. Godzi je max(ETA operatora, teraz + FLOOR), czyli dokładnie to, co --at-least liczy po stronie bazy.

Sonda obecności nie może wchodzić w grep -q

# ŹLE — losowa cicha degradacja
manage.py help | grep -q start_countdown

Pod set -o pipefail: grep -q zamyka potok na pierwszym dopasowaniu, producent ginie od SIGPIPE (141), a udane dopasowanie zwraca porażkę. Efekt: wdrożenie schodzi do trybu „bez ostrzeżenia", losowo i bez komunikatu.

Poprawnie: wczytaj całe wyjście do zmiennej, dopasuj w bashu. Pilnuje tego test_site_down_warning_contract w tests/test_makefile.sh.

Bramka zdrowia musi być wyłączona, a post-deploy-check karmiony `