Zielone kółeczko, które kłamało trzy dni z rzędu
Ciao! 🇵🇱🇮🇹
Trzy zmergowane PR-y w CelneCV nie trafiały na produkcję, a panel GitHuba przez cały ten czas pokazywał zielone active: true.
Trzy dni szukałem winnego we wszystkich miejscach oprócz tego jednego, właściwego.
Lecimy z tematem 🚀
Webhook, który kłamał od trzech dni
W CelneCV trzy zmergowane PR-y nie trafiały na produkcję, mimo zielonego światła na każdym etapie po drodze. Wyglądało to na wolny deploy, może na to, że merge wymaga jeszcze ręcznego odpalenia builda. Pierwsze sprawdzenie to panel GitHuba: webhook do Jenkinsa, status active: true. Zielono, więc problem musiał siedzieć gdzie indziej.
Sprawdziłem logi Jenkinsa. Potem cache CDN. Potem to, czy w ogóle właściwy branch trafia na serwer produkcyjny. Żadna z tych ścieżek nie dała odpowiedzi, bo szukałem po niewłaściwej stronie połączenia. Status „aktywny” na webhooku w GitHubie mówi tylko, że konfiguracja istnieje, nie że ktokolwiek po drugiej stronie ją odbiera.
Prawdę pokazała dopiero historia dostaw: gh api repos/{owner}/{repo}/hooks/{id}/deliveries. Kod odpowiedzi 503 przy każdej próbie od trzech dni, bez jednego wyjątku. Trzy osobne merge’e, trzy osobne pushe, trzy identyczne odrzucenia. GitHub wysyłał sygnał posłusznie za każdym pushem. Jenkins po drugiej stronie nigdy go nie odbierał.
Adres webhooka wskazywał na https://<hash>.lhr.life/github-webhook/, darmowy, tymczasowy tunel do localhost, który ktoś kiedyś podpiął jako rozwiązanie na chwilę. Wygasł kilka dni wcześniej, po cichu, bez powiadomienia kogokolwiek. GitHub nie ma jak sprawdzić, czy adres po drugiej stronie w ogóle jeszcze istnieje. Wysyła, dostaje 503, zapisuje w logu dostaw i czeka na następną okazję, w kółko, cierpliwie, bez alarmu dla nikogo.
Drugi, niezależny dowód przyszedł z samej treści strony: fragment, który jeden z tych PR-ów miał usunąć z landing page’a, wciąż tam wisiał, trzy dni po mergu. Dwa sygnały z dwóch zupełnie różnych źródeł, jeden kierunek, żadnej wątpliwości.
active: true znaczy „skonfigurowany”, nie „działający”. Różnica między tymi dwoma słowami kosztowała trzy dni, zanim ktokolwiek spojrzał w to konkretne miejsce zamiast we wszystkie inne, bardziej oczywiste miejsca. Teraz przy każdym webhooku, który „powinien” coś robić, najpierw pytam o historię dostaw, dopiero potem o wszystko inne.
Darmowy tunel (lhr.life, ngrok.io, localhost.run, trycloudflare.com) wpięty w webhook produkcyjny to bomba z odroczonym zapłonem, która eksploduje dokładnie wtedy, gdy nikt akurat nie patrzy.
🛠️ Narzędzie
gh api repos/{owner}/{repo}/hooks/{id}/deliveries
Komenda GitHub CLI, która pokazuje pełną historię prób dostawy jednego webhooka: datę, kod odpowiedzi i to, czy retry się powiódł. Ta komenda pokazała serię 503 tam, gdzie panel GitHuba pokazywał tylko spokojne active: true. Sprawdzam ją teraz odruchowo przy każdym webhooku, którego status wygląda dobrze, a skutek nie. Zero zgadywania, twarde kody odpowiedzi zamiast samego statusu konfiguracji.
🌍 Ze świata
- GitHub Is Down: The August 17, 2026 Outage in Detail. Osiem godzin, w trakcie których GitHub sam oficjalnie przyznał degradację Webhooks i Actions - nawet dostawca tej infrastruktury nie ma stuprocentowej gwarancji, że zdarzenie, które właśnie wysłał, dotrze.
- Why Webhooks Still Fail Us in 2026 and How We Can Do Better. Dokładnie te same objawy co u mnie: zdarzenie znika mimo potwierdzenia od dostawcy, a komunikat błędu nie mówi wprost, czy to autoryzacja, infrastruktura, czy retry.
- The CI Check That Never Ran Once Gave Us a Fake Green Checkmark. Bliźniaczy problem z zupełnie innej warstwy: zielony checkmark w CI, który tak naprawdę nigdy się nie uruchomił - dostępność sygnału i jego faktyczne zadziałanie to dwa różne pytania, w CI tak samo jak w webhookach.
😄 Na koniec
Trzy dni szukałem tego buga wszędzie: w logach Jenkinsa, w cache CDN, w konfiguracji brancha.
Był dwa kliknięcia dalej, w zakładce, która od trzech dni grzecznie pokazywała zielone active: true i kłamała w żywe oczy.

Jeśli ktoś w Twoim otoczeniu powinien to przeczytać, prześlij mu ten numer. To najlepsza forma wsparcia.
A jeśli wolisz wesprzeć bezpośrednio: postaw mi kawę.
Cieszę się, że tu jesteś! Aby nie przegapić kolejnych wpisów i pomóc mi tworzyć więcej takich treści, dołącz do grona subskrybentów. To nic nie kosztuje.
Dołącz do Marini Brief →