Dans cet article, nous allons voir comment mettre en place un pipeline CI/CD complet pour une application Laravel utilisant Docker, GitHub Actions et un registre d'images Docker (GHCR – GitHub Container Registry).
L'objectif est de pouvoir automatiquement :
- Construire une image Docker de l'application
- Lancer les tests automatiquement
- Pousser l'image sur un registre Docker
- Déployer automatiquement sur un serveur VPS
À la fin de ce tutoriel, chaque push sur la branche main déclenchera automatiquement le pipeline complet.
1. Architecture du pipeline
Le pipeline CI/CD sera composé de trois étapes :
- Build : construction de l'image Docker
- Tests : lancement des tests Laravel
- Deploy : déploiement automatique sur le serveur
Schéma simplifié :
Push GitHub
│
▼
GitHub Actions
│
├── Build image Docker
│
├── Run tests Laravel
│
├── Push image vers GHCR
│
▼
Serveur VPS
│
docker compose pull
docker compose up -d
2. Création du fichier de workflow GitHub Actions
Dans votre projet, créez le fichier :
.github/workflows/deploy.yml
Contenu du workflow :
name: Build, Test & Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to GHCR
run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- name: Build Docker image
run: |
docker build \
-t ghcr.io/USERNAME/APPNAME:latest \
-f docker/laravel/Dockerfile.prod .
- name: Push Docker image
run: |
docker push ghcr.io/USERNAME/APPNAME:latest
Cette étape construit l'image Docker et la pousse vers le registre GitHub.
3. Ajouter une base de données pour les tests
Pour exécuter les tests Laravel, nous allons utiliser un service MySQL dans GitHub Actions.
tests:
needs: build
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myhomehub_test
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping --silent"
--health-interval=10s
--health-timeout=5s
--health-retries=5
Ce service démarre un conteneur MySQL directement dans le runner GitHub.
4. Construire une image Docker dédiée aux tests
Nous allons créer une image Docker dédiée pour exécuter les tests.
Fichier :
docker/laravel/Dockerfile.ci
FROM ghcr.io/USERNAME/APPNAME:latest
USER root
WORKDIR /var/www
RUN composer install --no-interaction
COPY .env.testing .env
RUN chown -R www-data:www-data /var/www \
&& chmod -R 775 storage bootstrap/cache
USER www-data
Cette image utilise l'image de production et ajoute simplement les dépendances de développement nécessaires pour les tests.
5. Configuration de l'environnement de test
Créez un fichier :
.env.testing
APP_ENV=testing
APP_KEY=base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
APP_DEBUG=true
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myhomehub_test
DB_USERNAME=root
DB_PASSWORD=root
CACHE_DRIVER=array
QUEUE_CONNECTION=sync
SESSION_DRIVER=array
MAIL_MAILER=array
Ce fichier configure Laravel pour l'environnement de test.
6. Lancer les tests Laravel dans le pipeline
Ajoutons l'étape de tests dans le workflow :
- name: Build CI image
run: |
docker build \
-t myhomehub-ci \
-f docker/laravel/Dockerfile.ci .
- name: Run tests
run: |
docker run --rm \
--network host \
-w /var/www \
-e DB_HOST=127.0.0.1 \
myhomehub-ci \
sh -c "php artisan config:clear && php artisan migrate && php artisan test"
Les tests Laravel sont exécutés directement dans le conteneur Docker.
7. Déploiement automatique sur le serveur
Une fois les tests validés, nous pouvons déployer l'application sur notre serveur.
deploy:
needs: tests
runs-on: ubuntu-latest
steps:
- name: Deploy on VPS
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myhomehub
docker compose pull
docker compose up -d
docker system prune -f
Le serveur va simplement récupérer la dernière image Docker et redémarrer les conteneurs.
8. Secrets GitHub nécessaires
Dans votre dépôt GitHub, ajoutez les secrets suivants :
- SERVER_IP
- SERVER_USER
- SSH_PRIVATE_KEY
Ces secrets permettent à GitHub Actions de se connecter au serveur pour effectuer le déploiement.
9. Résultat final
À chaque push sur la branche main :
- Une image Docker est construite
- Les tests Laravel sont exécutés
- L'image est poussée vers GHCR
- Le serveur déploie automatiquement la nouvelle version
git push origin main
│
▼
GitHub Actions
│
Build image
│
Run tests
│
Push image
│
▼
Déploiement VPS
Conclusion
Grâce à cette approche, votre application Laravel bénéficie d'un déploiement automatique fiable et reproductible.
L'utilisation de Docker permet de garantir que l'application testée est exactement la même que celle déployée en production.
Cette méthode est aujourd'hui largement utilisée dans les projets modernes afin d'assurer des déploiements rapides, sécurisés et automatisés.