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
run: docker build --tag zyrarbot-panel:ci .
# nginx musi oddać stronę i obsłużyć fallback aplikacji jednostronicowej.
# Backendu tu nie ma, więc /api ma zwrócić błąd bramy, a nie 404 - to
# dowodzi, że reguła proxy istnieje i celuje w usługę discord-bot.
- name: Kontener serwuje panel
# Zamiast opierać się na tym, że proxy zawiedzie, stawiamy atrapę backendu
# pod nazwą, której szuka nginx. Sprawdzamy wtedy realne przekazanie
# żądania, a nie zachowanie nginxa przy nieudanym DNS.
- name: Kontener serwuje panel i przekazuje API
working-directory: .
run: |
docker run -d --name panel-ci -p 8080:80 zyrarbot-panel:ci
for i in $(seq 1 20); do
docker exec panel-ci wget -qO- http://127.0.0.1/ >/dev/null 2>&1 && break
set -u
net=zyrarbot-ci-net
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
done
probe() { docker exec panel-ci wget -S -q -T 5 -O- "$1" 2>&1 || true; }
echo "-- strona główna --"
docker exec panel-ci wget -qO- http://127.0.0.1/ | grep -q "<div id=\"app\">" \
&& echo " panel serwowany"
probe http://127.0.0.1/ | grep -q '<div id="app">' || fail "nginx nie oddaje panelu"
echo " panel serwowany"
echo "-- fallback SPA --"
code=$(docker exec panel-ci wget -S -qO- http://127.0.0.1/dowolna/sciezka 2>&1 | grep -c "200 OK")
test "$code" -ge 1 && echo " nieznana ścieżka zwraca index.html"
probe http://127.0.0.1/dowolna/sciezka | grep -q '<div id="app">' \
|| fail "nieznana ścieżka nie wraca jako index.html"
echo " nieznana ścieżka zwraca index.html"
echo "-- reguła proxy --"
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)
echo " /api/status -> ${http_code:-brak odpowiedzi} (bez backendu spodziewane 502)"
case "$http_code" in
*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
echo "-- przekazywanie /api --"
probe http://127.0.0.1/api/status | grep -q '"stub"' \
|| fail "/api nie trafia do usługi discord-bot"
echo " /api przekazane do backendu"
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"