ci: pipeline panelu dla Gitea Actions
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:
1 parent
1b424eaa7d
commit
c5e016605b
1 file changed
+99
@@ -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
|
||||
Reference in new issue
Block a user