← Tous les articles
March 16, 2026

Mettre en place un déploiement CI/CD Docker pour Laravel avec GitHub Actions

Développement Web PHP Laravel #Git #Docker #docker-compose #Devops

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 :

  1. Build : construction de l'image Docker
  2. Tests : lancement des tests Laravel
  3. 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 :

  1. Une image Docker est construite
  2. Les tests Laravel sont exécutés
  3. L'image est poussée vers GHCR
  4. 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.

Thiébault Michaël ©