cat ~/projects/playwright-pipeline/README
Pipeline testów E2E ariku.pl
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
- 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.
- Kontener testowy z Playwright i Chromium uruchamia cały pakiet na żądanie.
- Reporter wysyła zdarzenia begin, test-begin, test-end i end do wewnętrznego endpointu aplikacji chronionego sekretem.
- 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).
- 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.