Przejdź do treściARIKU://CV (PDF)

← Wszystkie projekty

cat ~/projects/playwright-pipeline/README

Pipeline testów E2E ariku.pl

QA i automatyzacja testów2026działa produkcyjnie

Pełny pakiet testów Playwright tej strony na osobnym kontenerze, z wynikami przesyłanymi na żywo do widgetu na stronie głównej i z pełną historią przebiegów w PostgreSQL.

Cel

Każda zmiana w aplikacji ma przejść regresję end-to-end, zanim trafi na produkcję. Testy nie mogą obciążać serwera produkcyjnego, który w chwili startu projektu miał 93% zajętego dysku. Stan testów ma być widoczny publicznie, a nie tylko w terminalu.

Rozwiązanie

Testy działają na dedykowanym kontenerze LXC i uderzają w aplikację po sieci lokalnej. Własny reporter Playwright wysyła postęp przebiegu do aplikacji, która trzyma stan bieżący w Redis, a każdy zakończony przebieg archiwizuje w PostgreSQL. Widget na stronie głównej pokazuje wynik ostatniego przebiegu, historię i trend.

Architektura

  1. Repozytorium jest źródłem prawdy dla speców; systemd (jednostka .path na inotify plus timer awaryjny) synchronizuje je rsync-iem na kontener testowy kilka sekund po zmianie.
  2. Kontener testowy z Playwright i Chromium uruchamia cały pakiet na żądanie.
  3. Reporter wysyła zdarzenia begin, test-begin, test-end i end do wewnętrznego endpointu aplikacji chronionego sekretem.
  4. Redis trzyma bieżący przebieg i 50 ostatnich wyników (pasek historii), PostgreSQL pełną, nieograniczoną historię (trendy 1, 3, 6 i 12 miesięcy).
  5. Publiczny endpoint statystyk zasila widget „Testy tej strony” na stronie głównej.

Decyzje techniczne

Osobny kontener zamiast testów na produkcji
Przeglądarki Playwrighta i artefakty to od pół do jednego gigabajta. Wydzielony kontener chroni dysk produkcji, a testy i tak uderzają w ten sam proces, który obsługuje ariku.pl.
Raportowanie fire-and-forget
Błąd sieci między reporterem a aplikacją nie zmienia wyniku testów i ich nie spowalnia. Widget może chwilę nie mieć danych, pakiet zawsze dochodzi do końca.
Redis i PostgreSQL razem
Redis odpowiada za szybki odczyt stanu w trakcie przebiegu, PostgreSQL za długą historię bez limitu wierszy. Zapis do bazy jest best-effort: jego awaria nie psuje widoku na żywo.
Zawsze cały pakiet
Po każdej zmianie uruchamiam wszystkie spece, nie tylko nowy. Pełny przebieg to kilkanaście sekund pracy maszyny, a łapie regresje w miejscach, których zmiana pozornie nie dotyczyła.

Problemy i rozwiązania

Podwójne liczenie testów przy ponowieniach
Playwright wywołuje onTestEnd przy każdej próbie, więc ponowiony test zawyżał wynik. Reporter liczy teraz tylko ostatnią próbę.
Live reporter wyłączał się po cichu
Flaga --reporter w wierszu poleceń zastępuje listę reporterów z konfiguracji, zamiast ją uzupełniać. Domyślne polecenie dostało zwięzły reporter w konfiguracji obok reportera na żywo, a dokumentacja ostrzega przed flagą.
Test resetował współdzielony stan, który sam mierzył
Spec widgetu czyścił stan przebiegu w Redis w trakcie tego samego przebiegu. Testy nie mogą destrukcyjnie resetować współdzielonych singletonów produkcji; sprawdzają odczyt, nie przebudowują stanu.