Zum Inhalt springen

CI/CD-Pipelines für PHP-Projekte mit GitHub Actions

Veröffentlicht am 5. Feb. 2026 | ca. 2 Min. Lesezeit |

Continuous Integration und Continuous Deployment sind keine Buzzwords – sie sind essenzielle Werkzeuge für professionelle Softwareentwicklung. Mit GitHub Actions lässt sich eine Pipeline schnell und kostenlos aufsetzen.

Die Basis-Pipeline

Eine minimale CI-Pipeline für ein Symfony-Projekt:

name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      mysql:
        image: mariadb:10.11
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: app_test
        ports:
          - 3306:3306

    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          extensions: intl, pdo_mysql
          coverage: xdebug

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress

      - name: Run PHPStan
        run: vendor/bin/phpstan analyse

      - name: Run tests
        run: vendor/bin/phpunit --coverage-text
        env:
          DATABASE_URL: mysql://root:root@127.0.0.1:3306/app_test

Code-Quality-Checks

Neben Tests sollte die Pipeline auch die Codequalität prüfen:

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress

      - name: PHP CS Fixer
        run: vendor/bin/php-cs-fixer fix --dry-run --diff

      - name: Twig Lint
        run: php bin/console lint:twig templates/

      - name: YAML Lint
        run: php bin/console lint:yaml config/ translations/

Deployment-Job

Nach erfolgreichem Test kann automatisch deployed werden:

  deploy:
    needs: [test, lint]
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_KEY }}
          script: |
            cd /var/www/projekt
            git pull origin main
            composer install --no-dev --optimize-autoloader
            php bin/console cache:clear --env=prod
            php bin/console doctrine:migrations:migrate --no-interaction

Caching für schnellere Builds

Composer-Abhängigkeiten sollten gecacht werden, um Build-Zeiten zu reduzieren:

      - name: Cache Composer packages
        uses: actions/cache@v4
        with:
          path: vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

Sicherheits-Audits

Ein separater Job für Sicherheitsprüfungen rundet die Pipeline ab:

# In der Pipeline
composer audit

# Oder mit dem Symfony CLI
symfony security:check

Eine gut konfigurierte CI/CD-Pipeline fängt Fehler früh ab und ermöglicht schnelle, sichere Deployments. Der initiale Aufwand amortisiert sich bereits nach wenigen Wochen.

Thomas Wunner

Thomas Wunner

Fachinformatiker für Anwendungsentwicklung mit Ausbildereignungsprüfung und über 14 Jahre Erfahrung im Aufbau skalierbarer Webanwendungen mit Symfony und Shopware. Abseits der Tastatur ist Thomas als Rettungsschwimmer in der Wasserwacht aktiv, legt als DJ auf und erkundet die Umgebung auf dem Motorrad.

Kommentare

Kommentare werden von Remark42 bereitgestellt. Beim Laden werden Daten an unseren Kommentar-Server übertragen.