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
|
- 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"
|
||||||
Reference in new issue
Block a user