CI/CD für PHP-Projekte: GitHub Actions von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum CI/CD der neue Standard der PHP-Entwicklung ist

\n

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

\n

GitHub 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\n

1. Grundlagen von GitHub Actions: Workflow-Struktur für PHP

\n

Ein 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
    \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
\n

Betrachten wir eine minimale Datei ci.yml:

\n
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
\n

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

\n\n

2. Fortgeschrittene Konfiguration: Statische Analyse, Linter und Caching

\n

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

\n

2.1. PHPStan und PHP CS Fixer hinzufügen

\n

Installieren Sie diese als dev-Abhängigkeiten:

\n
composer require --dev phpstan/phpstan friendsofphp/php-cs-fixer
\n

Ergä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
\n

Tipp: 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.

\n

2.2. Caching von Composer-Abhängigkeiten

\n

Jeder 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
\n

Wiederholte Ausführungen werden nun 2-3 Mal schneller sein.

\n\n

3. Testen mit Datenbank und Docker-Diensten

\n

Viele PHP-Anwendungen benötigen MySQL, PostgreSQL oder Redis für Tests. GitHub Actions ermöglicht das Ausführen von Service-Containern.

\n

3.1. Beispiel mit MySQL und Laravel

\n

Angenommen, Ihr Projekt verwendet Laravel mit MySQL. Fügen Sie den Dienst hinzu und konfigurieren Sie .env:

\n
jobs:\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                

Blogs

Buchempfehlungen