Praktický návod
Jak nastavit CI kontrolu PHP projektu
Spouštěj stejné kontroly na každém pull requestu v čistém, reprodukovatelném a bezpečném prostředí.
Nejdřív stručně
CI je automatická podmínka pro merge
Připrav si
Sjednoť lokální a CI příkazy
Každou kontrolu nejdřív zpřístupni jako Composer nebo Make target, který funguje i vývojáři.
- Commitnuté composer.json, composer.lock a konfigurační soubory PHPUnit, PHPStan a CodeSnifferu.
- Jednoznačnou podporovanou verzi PHP a seznam potřebných extensions.
- Izolovanou testovací databázi nebo jiné service containers s verzemi blízkými produkci.
- Pravidla protected branch, nejmenší oprávnění CI tokenu a vlastníka selhávajících kontrol.
Kroky 1 až 3
Skládej pipeline z malých kontrol
Rychlé chyby vrať jako první a dražší testy spouštěj paralelně, pokud jsou nezávislé.
1. Nainstaluj přesně zamčené dependencies
- Workflow spouštěj na pull_request a push do hlavní větve. Starší běh stejné větve zruš přes concurrency group.
- Checkoutuj konkrétní commit, nastav podporovanou PHP verzi a extensions a spusť composer validate --strict.
- Dependencies instaluj přes composer install, nikdy update. Cacheuj Composer download cache podle OS, PHP a hashe composer.lock, ne neověřený vendor.
- První job proveď i PHP syntax check nebo project validate, aby triviální chyby zastavily pipeline rychle.
composer validate --strict && composer install --no-interaction --prefer-dist Oficiální Composer dokumentace k validate 2. Spusť styl, analýzu a testy odděleně
- CodeSniffer ověří commitnutý standard bez automatické opravy; PHPStan spustí stejné paths, level a baseline jako lokálně.
- PHPUnit rozděl na rychlou unit suite a integrační suite se service databází. Před testy spusť skutečné migrace na prázdném schématu.
- Nezávislé jobs běží paralelně a mají vlastní timeout. Fail-fast použij vědomě, aby důležité diagnostiky nezmizely při prvním selhání.
- Udrž jednu souhrnnou required check nebo stabilní názvy jobs; merge nesmí obejít červenou kontrolu pouhým přejmenováním workflow.
vendor/bin/phpcs && vendor/bin/phpstan analyse && vendor/bin/phpunit Oficiální GitHub Actions workflow syntax 3. Publikuj diagnostiku a omez oprávnění
- JUnit report, coverage a relevantní logy ulož jako artifacts i při selhání, ale bez hesel a osobních dat.
- Výchozí permissions nastav contents: read. Secrets neposkytuj nedůvěryhodnému kódu z fork pull requestu a nevkládej jeho hodnoty přímo do shell skriptu.
- Third-party actions připínej na prověřenou verzi nebo commit SHA a pravidelně je aktualizuj. Cache považuj za nedůvěryhodný vstup.
- Měř dobu čekání i běhu. Pomalou suite optimalizuj nebo rozděl, ale stejnou povinnou kvalitu zachovej pro všechny změny.
permissions: { contents: read } Oficiální GitHub Actions security reference Krok 4
Ověř pipeline úmyslnou chybou
Každý požadovaný gate musí umět pull request opravdu zastavit a ukázat příčinu.
-
Rozbij formát, typ a test
Příslušné jobs selžou samostatně s čitelným logem. Po vrácení změn je celý commit zelený.
composer ci -
Spusť čistou databázi
Migrace a integrační testy nevyžadují ručně připravené lokální tabulky ani data z minulého běhu.
-
Zkontroluj pravidla merge
Pull request bez všech required checks nelze sloučit a workflow z forku nemá produkční secrets ani write token.
Když to zlobí
Nejčastější chyby
CI a lokál hlásí jiné chyby
Sjednoť PHP verzi, extensions, locale, time zone, composer.lock a příkazy v jednom Composer/Make targetu.
php -v && composer check-platform-reqs Pipeline je po změně dependencies nekonzistentní
Klíč cache musí obsahovat hash composer.lock. Obnova cache nesmí nahradit composer install ani validaci.
Integrační testy jsou flaky
Každý job potřebuje izolovanou databázi, deterministické fixture, health check služby a žádnou závislost na pořadí.
Fork pull request vidí tajný token
Omez permissions, secrets nepřiděluj nedůvěryhodným triggerům a nepouštěj cizí kód v privilegovaném pull_request_target.
Hotovo
Každý commit prochází stejnou kvalitativní branou.
Composer, CodeSniffer, PHPStan a PHPUnit běží reprodukovatelně, výsledky jsou povinné pro merge a workflow pracuje s minimálními oprávněními.