Einleitung: Warum CI/CD der neue Standard der PHP-Entwicklung ist
\nModerne PHP-Entwicklung ist ohne Automatisierung undenkbar. Manuelles Deployment, „nach Augenmaß“ durchgeführte Tests und Code-Überprüfungen in letzter Minute sind der direkte Weg zu Bugs in der Produktion. CI/CD (Continuous Integration / Continuous Deployment) löst diese Probleme, indem es Überprüfungen und Code-Auslieferung direkt in Ihren Arbeitsablauf integriert.
\nGitHub Actions ist ein leistungsstarkes und kostenloses Tool, um CI/CD direkt in Ihr Repository einzubetten. In diesem Artikel werden wir durchgehen, wie man eine vollständige Pipeline für ein PHP-Projekt mit Laravel oder Symfony einrichtet: von der Installation der Abhängigkeiten bis zum Deployment auf den Server. Sie erhalten fertige Konfigurationen und ein Verständnis für jeden Schritt.
\n\n1. Grundlagen von GitHub Actions: Workflow-Struktur für PHP
\nEin Workflow in GitHub Actions ist ein automatisierter Prozess, der in einer YAML-Datei im Ordner .github/workflows/ definiert ist. Für ein PHP-Projekt umfasst ein typischer Workflow:
- \n
- Auslöser: Push in den Branch
main, Pull Request. \n - Runner: Ubuntu latest (PHP-Unterstützung). \n
- Schritte: Checkout, PHP-Installation, Composer, Tests, Linter. \n
Betrachten wir eine minimale Datei ci.yml:
name: PHP CI\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v3\n\n - name: Setup PHP\n uses: shivammathur/setup-php@v2\n with:\n php-version: '8.2'\n extensions: mbstring, pdo_mysql, xml\n coverage: xdebug\n\n - name: Install Composer dependencies\n run: composer install --no-progress --prefer-dist\n\n - name: Run PHPUnit\n run: vendor/bin/phpunit --testdox\nDieser Workflow wird bei jedem Push ausgeführt. Er prüft, ob der Code gebaut wird und die Tests bestanden werden. Beachten Sie die Aktion shivammathur/setup-php – sie ist de facto der Standard für PHP.
2. Fortgeschrittene Konfiguration: Statische Analyse, Linter und Caching
\nCI beschränkt sich nicht nur auf Tests. Um die Codequalität zu erhalten, fügen Sie statische Analyse (PHPStan, Psalm) und Stilprüfung (PHP CS Fixer) hinzu.
\n2.1. PHPStan und PHP CS Fixer hinzufügen
\nInstallieren Sie diese als dev-Abhängigkeiten:
\ncomposer require --dev phpstan/phpstan friendsofphp/php-cs-fixer\nErgänzen Sie die Schritte im Workflow:
\n - name: Run PHPStan\n run: vendor/bin/phpstan analyse --memory-limit=1G\n\n - name: Check code style\n run: vendor/bin/php-cs-fixer fix --dry-run --diff\nTipp: Verwenden Sie --dry-run, um Dateien nicht zu ändern, sondern nur zu prüfen. Wenn der Stil verletzt wird, schlägt CI fehl und der Entwickler korrigiert es.
2.2. Caching von Composer-Abhängigkeiten
\nJeder CI-Start lädt Pakete neu herunter – das dauert lange. Aktivieren wir Caching:
\n - name: Cache Composer packages\n id: composer-cache\n uses: actions/cache@v3\n with:\n path: vendor\n key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}\n restore-keys: |\n ${{ runner.os }}-php-\n\n - name: Install dependencies\n if: steps.composer-cache.outputs.cache-hit != 'true'\n run: composer install --no-progress --prefer-dist\nWiederholte Ausführungen werden nun 2-3 Mal schneller sein.
\n\n3. Testen mit Datenbank und Docker-Diensten
\nViele PHP-Anwendungen benötigen MySQL, PostgreSQL oder Redis für Tests. GitHub Actions ermöglicht das Ausführen von Service-Containern.
\n3.1. Beispiel mit MySQL und Laravel
\nAngenommen, Ihr Projekt verwendet Laravel mit MySQL. Fügen Sie den Dienst hinzu und konfigurieren Sie .env:
\njobs:\n test:\n runs-on: ubuntu-latest\n services:\n mysql:\n image: mysql:8.0\n env:\n MYSQL_ROOT_PASSWORD: root\n MYSQ