← Notatki

Paweł · 10 września 2026

Wdrożenia bez serwera i bez twardego sleep

Serwis stoi na brzegu sieci — nie ma maszyny, systemu do łatania ani puli aplikacji. Jest kod, baza i magazyn obiektów. Wdrożenie polega na wysłaniu paczki, nie na restarcie usługi.

Cztery z pięciu repozytoriów budują się i wdrażają same po pushu na główną gałąź. Piąte nie, i powód jest pouczający.

Jedno kliknięcie, którego nie da się zautomatyzować

Podpięcie automatycznego budowania wymaga zgody na dostęp do repozytorium, udzielanej w panelu. Zgody nie da się wystawić przez API — to celowe zabezpieczenie i trudno mieć o nie pretensje. Efekt jest jednak taki, że jedna instancja przez tygodnie wdrażała się ręcznie i regularnie zostawała w tyle.

npm run build
cd .output/server
export CLOUDFLARE_API_TOKEN=... CLOUDFLARE_ACCOUNT_ID=...
rm -rf ../../.wrangler/deploy
npx wrangler@latest deploy -c wrangler.json
Wdrożenie ręczne, czyli proteza

Wniosek ogólniejszy: w każdym łańcuchu automatyzacji znajdzie się jeden krok wymagający człowieka. Warto go znać z nazwy, bo to on decyduje, ile naprawdę zaoszczędziłeś.

Czas wdrożenia jest nieprzewidywalny

Pierwsza wersja skryptu weryfikującego czekała stałe trzy i pół minuty. Działało, dopóki wdrożenie nie zaczęło raz trwać czterdzieści sekund, a raz osiem minut.

Twardy sleep jest zawsze złym rozwiązaniem: albo czekasz za długo, albo sprawdzasz stan, którego jeszcze nie ma. Zastąpiliśmy go odpytywaniem co pięć sekund z warunkiem wyjścia na zmianie identyfikatora wersji.

GET /accounts/<konto>/workers/scripts/<worker>/versions?per_page=1
  -> result.items[0].metadata.created_on

# petla co 5-10 s, ZAWSZE z timeoutem i wyraznym komunikatem.
# Petla bez timeoutu to nie cierpliwosc, tylko blad.
Warunek wyjścia zamiast zgadywania

Weryfikacja na żywo, nie z logów

Log budowania mówi, że budowanie się udało. Nie mówi, że działa to, co miało zacząć działać.

Nie da się też sprawdzić wersji silnika po adresie z metadanymi — zwraca znacznik budowania, nie numer wydania. Jedyna wiarygodna metoda to pobrać stronę i poszukać w niej znanego ciągu z nowej funkcji.

curl --compressed -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://... \
  | grep -a 'znany-ciag-z-nowej-funkcji'

# --compressed: odpowiedz workera jest skompresowana
# -A: bez User-Agenta filtr botow odsyla pusto
Dwie pułapki w jednym poleceniu

Ten drugi przełącznik kosztował mnie kiedyś pół godziny sprawdzania, dlaczego strona „nie ma treści". Miała. Po prostu nie dla mnie.