CI/CD pour Laravel avec GitHub Actions
Pourquoi CI/CD pour Laravel avec GitHub Actions ?
Dans un environnement de développement moderne, la continuité intégration et livraison (CI/CD) jouent un rôle crucial pour améliorer la qualité du code, accélérer le déploiement et assurer une meilleure collaboration entre les membres d'une équipe. Avec un projet Laravel, GitHub Actions offre une solution complète et flexible pour mettre en place des pipelines CI/CD.
Un cas concret : Imaginez que vous travaillez sur un gestionnaire de tâches pour une application web. Chaque fois qu'un développeur effectue des modifications dans le code source, il serait préférable d'automatiser les tests unitaires et d'intégration, ainsi que le déploiement sur un environnement de production sécurisé.
Prerequis
- Connaissance approfondie de Laravel
- Compréhension des concepts de CI/CD
- Un compte GitHub avec accès au service Actions
- Node.js (pour les tests frontaux si applicable)
- Composer (pour gérer les dépendances PHP)
Concepts fondamentaux
1. Workflow : Definition du pipeline
Un workflow est un processus automatisé qui définit comment le code source doit être traité à chaque push ou pull request sur le dépôt GitHub.
## .github/workflows/laravel.yml
name: Laravel CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
2. Job : Un groupe d'étapes à exécuter
Un job est un ensemble d'étapes qui s'exécutent dans le même environnement.
## .github/workflows/laravel.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
3. Step : Une étape spécifique
Une étape est une action spécifique qui exécute un script ou utilise une image préconstruite.
## .github/workflows/laravel.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
4. Run : Exécuter un script
Vous pouvez exécuter des scripts shell directement dans les étapes.
## .github/workflows/laravel.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
5. Cache : Optimiser les performances des builds
Le cache permet d'accélérer le processus de build en réutilisant les dépendances déjà installées.
## .github/workflows/laravel.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
- name: Cache Composer dependencies
id: composer-cache
run: echo "::set-output name=dir::vendor"
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
env:
COMPOSER_MEMORY_LIMIT: "-1"
Mise en pratique : Projet fil rouge
1. Créer un nouveau projet Laravel
composer create-project --prefer-dist laravel/laravel task-manager
cd task-manager
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin <votre-url-github>
git push -u origin main
2. Configurer le workflow GitHub Actions
Créer un fichier .github/workflows/laravel.yml avec le contenu suivant :
## .github/workflows/laravel.yml
name: Laravel CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
- name: Cache Composer dependencies
id: composer-cache
run: echo "::set-output name=dir::vendor"
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
env:
COMPOSER_MEMORY_LIMIT: "-1"
- name: Run tests
run: vendor/bin/phpunit
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
- name: Cache Composer dependencies
id: composer-cache
run: echo "::set-output name=dir::vendor"
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
env:
COMPOSER_MEMORY_LIMIT: "-1"
- name: Deploy to production
uses: appleboy/scp-action@master
with:
host: $secrets.PRODUCTION_HOST
username: $secrets.PRODUCTION_USER
password: $secrets.PRODUCTION_PASSWORD
port: 22
source: "app/**"
target: "/var/www/task-manager/public_html/app"
3. Ajouter des variables d'environnement
Aller dans les paramètres de votre dépôt GitHub et ajouter les variables suivantes :
PRODUCTION_HOSTPRODUCTION_USERPRODUCTION_PASSWORD
4. Push le code et vérifier le pipeline
Faites un commit et push sur la branche main, puis allez sur l'onglet Actions de votre dépôt GitHub pour voir le pipeline en cours d'exécution.
Erreurs frequentes et debugging
1. Erreur : Problème avec les dépendances Composer
## ❌ Mauvais
composer install --no-dev --optimize-autoloader
bash
## ✅ Correct
composer install --no-dev --prefer-dist --optimize-autoloader
2. Erreur : Tests unitaires échouent
## ❌ Mauvais
vendor/bin/phpunit
bash
## ✅ Correct
vendor/bin/phpunit --filter "TaskControllerTest"
3. Erreur : Déploiement SCP échoue
## ❌ Mauvais
- name: Deploy to production
uses: appleboy/scp-action@master
with:
host: $secrets.PRODUCTION_HOST
username: $secrets.PRODUCTION_USER
password: $secrets.PRODUCTION_PASSWORD
port: 22
source: "app/**"
target: "/var/www/task-manager/public_html/app"
yaml
## ✅ Correct
- name: Deploy to production
uses: appleboy/scp-action@master
with:
host: $secrets.PRODUCTION_HOST
username: $secrets.PRODUCTION_USER
password: $secrets.PRODUCTION_PASSWORD
port: 22
source: "app/**"
target: "/var/www/task-manager/public_html/app"
Pour aller plus loin
1. Tests frontaux avec PHPUnit
Ajoutez des tests frontaux à votre projet Laravel et configurez GitHub Actions pour les exécuter.
2. Déploiement sur Docker
Utilisez Docker pour déployer votre application sur un conteneur, ce qui facilite la mise en production et le scaling.
3. Utilisation de Laravel Forge
Forge est une plateforme pour gérer facilement les déploiements Laravel, il peut être intégré avec GitHub Actions pour un déploiement automatisé et sécurisé.
Défi pratique : Créez une application API RESTful en utilisant Laravel, ajoutez des tests unitaires et d'intégration, puis configurez GitHub Actions pour le build et le déploiement sur un environnement de production.