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í.

25 minut · CI/CD

Nejdřív stručně

CI je automatická podmínka pro merge

CI má rychle odpovědět, zda lze přesně tento commit nainstalovat, analyzovat a otestovat. Úspěch lokálního počítače nestačí.

Kontroly jsou uložené v Gitu, používají composer.lock a na chráněné větvi jsou povinné. Deploy je až další samostatná fáze s jinými oprávněními.

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

  1. Workflow spouštěj na pull_request a push do hlavní větve. Starší běh stejné větve zruš přes concurrency group.
  2. Checkoutuj konkrétní commit, nastav podporovanou PHP verzi a extensions a spusť composer validate --strict.
  3. Dependencies instaluj přes composer install, nikdy update. Cacheuj Composer download cache podle OS, PHP a hashe composer.lock, ne neověřený vendor.
  4. 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ě

  1. CodeSniffer ověří commitnutý standard bez automatické opravy; PHPStan spustí stejné paths, level a baseline jako lokálně.
  2. 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.
  3. 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í.
  4. 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í

  1. JUnit report, coverage a relevantní logy ulož jako artifacts i při selhání, ale bez hesel a osobních dat.
  2. 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.
  3. 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.
  4. 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.

  1. 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
  2. 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.

  3. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.