CI/CD für PHP-Projekte: GitHub Actions
Moderne Webentwicklung ist ohne Automatisierung undenkbar. Manuelles Ausführen von Tests, Überprüfen des Codestils und Deployment auf den Server kosten Zeit und sind fehleranfällig. Die Lösung ist CI/CD (Continuous Integration / Continuous Deployment). In diesem Artikel werden wir uns ansehen, wie man eine vollwertige Pipeline für PHP-Projekte mit GitHub Actions einrichtet. Sie erfahren, wie Sie Code automatisch testen, seine Qualität prüfen und bei jedem Push in das Repository auf dem Produktionsserver bereitstellen.
Was ist CI/CD und warum braucht ein PHP-Entwickler es?
Continuous Integration (CI) ist eine Praxis, bei der jeder Commit automatisch überprüft wird: Unit-Tests, Linter, Sicherheitschecks werden ausgeführt. Continuous Deployment (CD) ist der nächste Schritt, bei dem erfolgreich getesteter CI-Code automatisch auf dem Server (Staging oder Production) bereitgestellt wird.
Für PHP ist dies besonders relevant: Die Sprache ist dynamisch, Typisierungs- und Syntaxfehler werden oft erst zur Laufzeit erkannt. GitHub Actions ermöglicht die Einrichtung einer Pipeline, die:
- PHPUnit-Tests in verschiedenen PHP-Versionen (7.4, 8.0, 8.1, 8.2) ausführt.
- Code mit PHP_CodeSniffer oder PHPStan überprüft.
- Das Deployment auf den Server per SSH oder Docker durchführt.
Erstellen eines Workflows in GitHub Actions
Erstellen Sie zunächst im Stammverzeichnis Ihres PHP-Projekts ein Verzeichnis .github/workflows. Erstellen Sie darin eine Datei, z.B. ci.yml. Dies wird Ihre Pipeline sein.
Betrachten wir ein einfaches Beispiel für CI. Es wird bei jedem Push in den Branch main oder bei der Erstellung eines Pull Requests ausgeführt.
name: PHP CI
on: push: branches: [ "main" ] pull_request: branches: [ "main" ]
jobs: build: runs-on: ubuntu-latest
strategy: matrix: php-versions: ['7.4', '8.0', '8.1', '8.2']
steps: - uses: actions/checkout@v3
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} tools: composer, phpunit
- name: Validate composer.json and composer.lock run: composer validate --strict
- name: Cache Composer packages id: composer-cache uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php-
- name: Install dependencies run: composer install --prefer-dist --no-progress
- name: Run PHPUnit tests run: phpunit --configuration phpunit.xmlErläuterung der wichtigsten Punkte:
- Matrix strategy — ermöglicht das gleichzeitige Ausführen von Tests in mehreren PHP-Versionen. Dies gewährleistet die Code-Kompatibilität.
- shivammathur/setup-php — eine beliebte Action zum Einrichten der PHP-Umgebung. Sie installiert die benötigte Version, Composer und PHPUnit.
- Vendor-Caching — beschleunigt nachfolgende Ausführungen, indem Abhängigkeiten nicht erneut heruntergeladen werden.
- composer validate — überprüft die Korrektheit der composer.json.
Statische Analyse und Linting hinzufügen
Tests sind gut, aber ohne Code-Qualitätskontrolle geht es nicht. Fügen wir demselben Workflow (oder erstellen einen separaten Job) eine Überprüfung mit PHPStan und PHP_CodeSniffer hinzu.
- name: Run PHPStan run: vendor/bin/phpstan analyse src tests --level=max
- name: Run PHP_CodeSniffer run: vendor/bin/phpcs --standard=PSR2 src testsDiese Schritte können nach der Installation der Abhängigkeiten hinzugefügt werden. PHPStan mit Level max findet potenzielle Typfehler, und PHP_CodeSniffer mit dem Standard PSR-2 (oder PSR-12) sorgt für einen einheitlichen Codestil. Wenn auch nur ein Schritt fehlschlägt, wird der