fix(ci): stabilne sprawdzenie proxy w jobie image panelu
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:
1 parent
c5e016605b
commit
1f0a92b6f6
1 file changed
+43
-19
@@ -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"
|
||||
Reference in new issue
Block a user