fix(ci): stabilne sprawdzenie proxy w jobie image panelu
Panel / Lint, typy i build (pull_request) Successful in 4m56s
Panel / Testowy build obrazu (pull_request) Successful in 18s

Krok padał na runnerze bez żadnego komunikatu. Powód był podwójny:

- asercja zakładała, że bez backendu nginx odpowie 502, a to zależy od
  tego, jak szybko zawiedzie DNS. Na runnerze zapytanie wisiało 30 sekund,
  aż do domyślnego resolver_timeout.
- grep bez dopasowania kończy się kodem 1, a Gitea uruchamia kroki w
  bash -e -o pipefail, więc podstawienie zmiennej przerywało cały krok,
  zanim zdążył wypisać powód. Lokalnie tego nie było widać, bo zsh nie
  ustawia tych flag.

Zamiast opierać się na tym, że proxy zawiedzie, job stawia teraz atrapę
backendu pod nazwą discord-bot - dokładnie tą, którą wskazuje nginx.conf
i compose.yaml - i sprawdza, że przez proxy wraca treść z atrapy. Test
przechodzi więc wtedy, gdy przekazywanie faktycznie działa, a nie wtedy,
gdy zawodzi w oczekiwany sposób. Sprawdzane jest też /ws.

Pozostałe usztywnienia: limit czasu na każde zapytanie, || true tam, gdzie
brak dopasowania jest poprawnym wynikiem, jawne komunikaty błędów z logiem
kontenera oraz sprzątanie kontenerów i sieci przez trap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
lgooseandClaude Bot committed 2026-08-21 01:44:07 +02:00
1 parent c5e016605b
commit 1f0a92b6f6
1 file changed
+43 -19
+43 -19
View File
@@ -68,32 +68,56 @@ jobs:
- name: Budowa obrazu panelu - name: Budowa obrazu panelu
run: docker build --tag zyrarbot-panel:ci . run: docker build --tag zyrarbot-panel:ci .
# nginx musi oddać stronę i obsłużyć fallback aplikacji jednostronicowej. # Zamiast opierać się na tym, że proxy zawiedzie, stawiamy atrapę backendu
# Backendu tu nie ma, więc /api ma zwrócić błąd bramy, a nie 404 - to # pod nazwą, której szuka nginx. Sprawdzamy wtedy realne przekazanie
# dowodzi, że reguła proxy istnieje i celuje w usługę discord-bot. # żądania, a nie zachowanie nginxa przy nieudanym DNS.
- name: Kontener serwuje panel - name: Kontener serwuje panel i przekazuje API
working-directory: . working-directory: .
run: | run: |
docker run -d --name panel-ci -p 8080:80 zyrarbot-panel:ci set -u
for i in $(seq 1 20); do net=zyrarbot-ci-net
docker exec panel-ci wget -qO- http://127.0.0.1/ >/dev/null 2>&1 && break
cleanup() {
docker rm -f panel-ci discord-bot >/dev/null 2>&1 || true
docker network rm "$net" >/dev/null 2>&1 || true
}
trap cleanup EXIT
cleanup
fail() { echo "::error::$1"; docker logs panel-ci 2>&1 | tail -20; exit 1; }
docker network create "$net" >/dev/null
# Atrapa backendu musi nazywać się discord-bot - dokładnie tak, jak
# usługa wskazana w nginx.conf i w compose.yaml.
docker run -d --name discord-bot --network "$net" -w /srv python:3.13-slim \
sh -c 'mkdir -p api && printf %s "{\"stub\":true}" > api/status && printf %s ws-stub > ws && python -m http.server 8000' >/dev/null
docker run -d --name panel-ci --network "$net" zyrarbot-panel:ci >/dev/null
for _ in $(seq 1 20); do
docker exec panel-ci wget -q -T 3 -O- http://127.0.0.1/ >/dev/null 2>&1 && break
sleep 1 sleep 1
done done
probe() { docker exec panel-ci wget -S -q -T 5 -O- "$1" 2>&1 || true; }
echo "-- strona główna --" echo "-- strona główna --"
docker exec panel-ci wget -qO- http://127.0.0.1/ | grep -q "<div id=\"app\">" \ probe http://127.0.0.1/ | grep -q '<div id="app">' || fail "nginx nie oddaje panelu"
&& echo " panel serwowany" echo " panel serwowany"
echo "-- fallback SPA --" echo "-- fallback SPA --"
code=$(docker exec panel-ci wget -S -qO- http://127.0.0.1/dowolna/sciezka 2>&1 | grep -c "200 OK") probe http://127.0.0.1/dowolna/sciezka | grep -q '<div id="app">' \
test "$code" -ge 1 && echo " nieznana ścieżka zwraca index.html" || fail "nieznana ścieżka nie wraca jako index.html"
echo " nieznana ścieżka zwraca index.html"
echo "-- reguła proxy --" echo "-- przekazywanie /api --"
http_code=$(docker exec panel-ci wget -S -qO- http://127.0.0.1/api/status 2>&1 | grep -oE "HTTP/1.1 [0-9]{3}" | head -1) probe http://127.0.0.1/api/status | grep -q '"stub"' \
echo " /api/status -> ${http_code:-brak odpowiedzi} (bez backendu spodziewane 502)" || fail "/api nie trafia do usługi discord-bot"
case "$http_code" in echo " /api przekazane do backendu"
*502*|*504*) echo " proxy skonfigurowane" ;;
*) echo "::error::/api nie jest przekazywane do backendu"; docker logs panel-ci; docker rm -f panel-ci; exit 1 ;;
esac
docker rm -f panel-ci # Treść odpowiedzi pochodzi z atrapy, więc jej rozpoznanie dowodzi,
# że żądanie faktycznie przeszło przez proxy, a nie utknęło w nginxie.
echo "-- przekazywanie /ws --"
probe http://127.0.0.1/ws | grep -q ws-stub \
|| fail "/ws nie jest przekazywane do backendu"
echo " /ws przekazane do backendu"