CI/CD pour projets PHP : GitHub Actions de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi CI/CD est le nouveau standard du développement PHP

\n

Le développement PHP moderne est impensable sans automatisation. Le déploiement manuel, l'exécution de tests « à l'œil » et la vérification du code à la dernière minute sont un chemin direct vers les bugs en production. CI/CD (Continuous Integration / Continuous Deployment) résout ces problèmes en intégrant les vérifications et le déploiement du code directement dans votre flux de travail.

\n

GitHub Actions est un outil puissant et gratuit pour intégrer CI/CD directement dans votre dépôt. Dans cet article, nous allons voir comment configurer un pipeline complet pour un projet PHP sous Laravel ou Symfony : de l'installation des dépendances au déploiement sur le serveur. Vous obtiendrez des configurations prêtes à l'emploi et la compréhension de chaque étape.

\n\n

1. Bases de GitHub Actions : structure d'un Workflow pour PHP

\n

Un Workflow dans GitHub Actions est un processus automatisé défini dans un fichier YAML dans le dossier .github/workflows/. Pour un projet PHP, un workflow typique comprend :

\n
    \n
  • Déclencheurs : push sur la branche main, pull request.
  • \n
  • Runner : Ubuntu latest (support PHP).
  • \n
  • Étapes : Checkout, installation de PHP, Composer, tests, linters.
  • \n
\n

Examinons un fichier minimal 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

Ce workflow s'exécute à chaque push. Il vérifie que le code se compile et que les tests passent. Notez l'action shivammathur/setup-php — c'est de facto la norme pour PHP.

\n\n

2. Configuration avancée : analyse statique, linters et mise en cache

\n

Le CI ne se limite pas aux tests. Pour maintenir la qualité du code, ajoutez l'analyse statique (PHPStan, Psalm) et la vérification du style (PHP CS Fixer).

\n

2.1. Ajout de PHPStan et PHP CS Fixer

\n

Installez-les comme dépendances de développement :

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

Complétez les étapes dans le 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

Conseil : utilisez --dry-run pour ne pas modifier les fichiers, mais seulement les vérifier. Si le style n'est pas respecté, le CI échouera et le développeur corrigera.

\n

2.2. Mise en cache des dépendances Composer

\n

Chaque exécution du CI télécharge à nouveau les paquets — c'est long. Activons la mise en cache :

\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

Désormais, les exécutions répétées seront 2 à 3 fois plus rapides.

\n\n

3. Tests avec base de données et services Docker

\n

De nombreuses applications PHP nécessitent MySQL, PostgreSQL ou Redis pour les tests. GitHub Actions permet d'exécuter des conteneurs de services (Service Containers).

\n

3.1. Exemple avec MySQL et Laravel

\n

Supposons que votre projet utilise Laravel avec MySQL. Ajoutez le service et configurez le .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

Book Recommendations