ci: pipeline panelu dla Gitea Actions
Panel / Lint, typy i build (pull_request) Successful in 4m55s
Panel / Testowy build obrazu (pull_request) Failing after 49s

Workflow .gitea/workflows/frontend.yaml z dwoma jobami:

- verify  npm ci, ESLint, kontrola typów, build produkcyjny i test dymny
- image   walidacja compose.yaml, build obrazu panelu i sprawdzenie
          działającego kontenera; job czeka na verify

Test dymny działa na zbudowanym artefakcie, a nie na źródłach, więc
sprawdza dokładnie to, co trafia do obrazu.

Job image weryfikuje trzy rzeczy w uruchomionym kontenerze: czy nginx
oddaje panel, czy nieznana ścieżka wraca jako index.html (fallback SPA)
oraz czy /api jest przekazywane do backendu. Backendu w tym kroku nie ma,
więc oczekiwaną odpowiedzią jest błąd bramy - 502 dowodzi, że reguła proxy
istnieje i celuje w usługę discord-bot, podczas gdy 404 oznaczałoby, że
nginx potraktował /api jak ścieżkę aplikacji.

Filtry paths ograniczają uruchomienia do zmian w katalogu frontend,
compose.yaml i samym workflow.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
lgooseandClaude Bot committed 2026-08-21 01:34:55 +02:00
1 parent 1b424eaa7d
commit c5e016605b
1 file changed
+99
+99
View File
@@ -0,0 +1,99 @@
name: Panel
on:
push:
branches: [main]
paths:
- "frontend/**"
- "compose.yaml"
- ".gitea/workflows/frontend.yaml"
pull_request:
paths:
- "frontend/**"
- "compose.yaml"
- ".gitea/workflows/frontend.yaml"
workflow_dispatch:
defaults:
run:
working-directory: frontend
env:
NODE_VERSION: "22"
jobs:
verify:
name: Lint, typy i build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
cache-dependency-path: frontend/package-lock.json
# npm ci wymusza zgodność z package-lock.json, więc CI buduje
# dokładnie te wersje, które sprawdzono lokalnie.
- name: Instalacja zależności
run: npm ci
- name: ESLint
run: npm run lint
- name: Kontrola typów
run: npm run typecheck
- name: Build produkcyjny
run: npm run build
# Test dymny działa na zbudowanym artefakcie, nie na źródłach - sprawdza
# to, co faktycznie trafi do obrazu: renderowanie danych z serwera oraz
# trafianie przycisków we właściwe endpointy API.
- name: Test dymny panelu
run: npm run smoke
image:
name: Testowy build obrazu
runs-on: ubuntu-latest
needs: [verify]
steps:
- uses: actions/checkout@v4
- name: Walidacja compose.yaml
working-directory: .
run: docker compose config --quiet
- 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
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
sleep 1
done
echo "-- strona główna --"
docker exec panel-ci wget -qO- http://127.0.0.1/ | grep -q "<div id=\"app\">" \
&& 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"
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
docker rm -f panel-ci