Kvalitu LydiaCMS drží statická analýza, testy a release pipeline. Co jde automatizovat, automatizuji: od kontroly kódu po nasazení.
Statická analýza PHP: PHPStan a Rector
PHPStan běží na nejvyšší úrovni (max) s 8 vlastními pravidly, která hlídají konvence projektu, a 14 vlastních pravidel Rector umí odchylky opravit hromadně napříč všemi balíčky. Výsledkem je vyšší kvalita kódu: chyby v architektuře se zachytí při analýze, a ne až za běhu. Kód: PHPStan, Rector.
Testy: Nette Tester a E2E v Playwrightu
- Jádro má přes 600 unit a integračních testů v Nette Testeru. Spouštějí se paralelně a každé vlákno pracuje s vlastním prefixem databázových tabulek.
- Ukázková aplikace má sadu E2E testů v Playwrightu (přes 30 souborů), která prochází veřejnou část webu i administraci.
- Testy balíčků PHPStan a Rector běží v CI pipeline, testy jádra spouštím lokálně v Dockeru.
CI/CD pipeline v GitLabu: automatické verze a publikace balíčků
Balíčky se instalují z privátního Composer registru, takže každé vydání musí být jednotné a bez ručního kroku. Všechny balíčky proto používají jednu sdílenou pipeline v GitLabu a změna procesu se dělá na jediném místě. Má tři fáze:
- Check.
composer validate --stricta kontrola syntaxe PHP ve všech zdrojích. Když selže, balíček se nevydá. - Tag. Na hlavní větvi se vypočítá a odešle další verze.
- Build. Odeslaný tag publikuje balíček do Composer registru a aplikace si novou verzi stáhne pomocí
composer update.
Nasazení bez výpadku (zero-downtime deployment)
Nová verze webu se nenasazuje přímo do běžící aplikace. Jeden skript připraví vedle ní kompletní nový release a přepne se na něj, až když je ověřený:
- sestaví release z větve a nainstaluje závislosti bez vývojářských balíčků,
- připojí sdílená data (
.env, logy, nahrané soubory), - aplikaci zkušebně nastartuje, takže rozbitý build se k přepnutí nikdy nedostane,
- zazálohuje databázi a spustí migrace (
lydiacms:upgrade), - ověří web health checkem a při selhání se sám vrátí na předchozí release.
Záloha a rollback
Před migracemi se zálohuje databáze. Při problému lze vrátit předchozí release (soubory) i databázi ze zálohy.