CI - compilation đâïž
1. Concepts et dĂ©finitionâïž
đ LâintĂ©gration continue : un atout essentiel pour les dĂ©veloppeurs
LâintĂ©gration continue (CI) est une pratique qui automatise les Ă©tapes de vĂ©rification, test et analyse du code Ă chaque modification du projet, dans lâoptique de dĂ©tecter les erreurs et de rĂ©duire les temps de dĂ©ploiement.
đĄ Pourquoi la mettre en place ?
â QualitĂ© du code garantie Chaque commit dĂ©clenche automatiquement des contrĂŽles : tests unitaires, analyse statique et vĂ©rification du style (Lint). Cela permet de repĂ©rer les erreurs avant quâelles ne soient dĂ©ployĂ©es.
đ€ Travail dâĂ©quipe facilitĂ© Plusieurs dĂ©veloppeurs peuvent travailler sur le mĂȘme projet. La CI vĂ©rifie que le code de chacun sâintĂšgre sans casser les fonctionnalitĂ©s existantes.
⥠Détection rapide des problÚmes Les bugs ou incohérences sont détectés dÚs leur apparition, ce qui réduit le temps de correction et évite les mauvaises surprises en production.
đ§© Gain de temps et professionnalisation Moins de tests manuels, plus de rigueur automatisĂ©e. Les Ă©tudiants dĂ©couvrent les mĂȘmes outils et processus utilisĂ©s dans les entreprises (GitHub Actions, GitLab CI, JenkinsâŠ).
đ§ Des outils intĂ©grĂ©s aux processus
On dĂ©fini des pipelines qui sont des enchaĂźnements dâactions rĂ©alisĂ©es sur le projet de façon scriptĂ©e et automatique.
Chaque exécution du pipeline est appelée build.

Il existe plusieurs outils sur le marché pour gérer l'intégration continue
- Jenkins : un outil open-source d'intégration et de livraison continues, qui automatise tests et déploiements, détecte rapidement les bugs, et s'intÚgre facilement à divers outils grùce à son systÚme de plugins. Coder en Java et Gratuit.
- Github Actions
- GitLab CI
đ Nous utiliserons Github Actions.
GitHub Actions est une plateforme dâintĂ©gration continue et livraison continue (CI/CD) qui vous permet dâautomatiser votre pipeline de gĂ©nĂ©ration, de test et de dĂ©ploiement. Vous pouvez crĂ©er des workflows qui crĂ©ent et testent chaque demande de pull request.
Vous pouvez configurer un workflow GitHub Actions Ă dĂ©clencher quand un Ă©vĂ©nement se produit dans votre dĂ©pĂŽt, par exemple l'ouverture d'une pull request ou la crĂ©ation d'un problĂšme. Un workflow est un processus automatisĂ© configurable qui exĂ©cutera un ou plusieurs travaux. Les workflows sont dĂ©finis par un fichier YAML archivĂ© dans votre dĂ©pĂŽt et sâexĂ©cutent lorsquâils sont dĂ©clenchĂ©s par un Ă©vĂ©nement dans votre dĂ©pĂŽt, ou ils peuvent ĂȘtre dĂ©clenchĂ©s manuellement ou selon une planification dĂ©finie. documentation Github LâintĂ©gration continue, câest un garde-fou automatique qui assure la qualitĂ©, la fiabilitĂ© et la cohĂ©rence du code tout au long du dĂ©veloppement.
En rĂ©sumĂ© đŻ
LâintĂ©gration continue, câest un garde-fou automatique qui assure la qualitĂ©, la fiabilitĂ© et la cohĂ©rence du code tout au long du dĂ©veloppement.
2. CrĂ©ation du repositorie Githubâïž
PremiÚre étape : initialiser un dépÎt git en local et le lier à un repositorie sur Github.
2.1 En localâïž
Se postionner dans le bon répertoire local C:\wamp64\www> cd todo2026
git init
git branch -M main
echo "/vendor
/node_modules
/public/build
/storage/*.key
/storage/app/*
/storage/framework/*
/storage/logs/*
.env
database/*.sqlite
" >> .gitignore
git add .
git commit -m "Initial commit: Laravel ToDo"
2.2 Sur Githubâïž
Sur GitHub, créer un New repository avec pour nom laravel-todo.
RĂ©cupĂšre lâURL HTTPS du dĂ©pĂŽt, puis:
git remote add origin https://github.com/<ton-compte>/laravel-todo.git
git push -u origin main
2.3 GĂ©rer lâenvironnementâïž
Met Ă jour .env.example pour reflĂ©ter ta config locale minimale. đĄ enlever le APP_KEY et les infos DB
Génére ta clé et vérifie en local:
cp .env.example .env
php artisan key:generate
php artisan serve
2.4 Fichier dâenvironnement CI MySQLâïž
Ajoute .env.ci (spécifique aux jobs GitHub Actions) :
APP_ENV=testing
APP_DEBUG=false
# clef générée en CI, pas besoin ici
CACHE_DRIVER=array
SESSION_DRIVER=array
QUEUE_CONNECTION=sync
# MySQL fourni par le job CI
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app_test
DB_USERNAME=laravel
DB_PASSWORD=laravel
git add .env.ci
git commit -m "Add CI env for MySQL"
git push origin main
2.5 Workflow GitHub Actions (CI)âïž
Créer un nouveau fichier .github/workflows/ci.yml :
name: CI
on:
push:
pull_request:
jobs:
build-test:
runs-on: ubuntu-latest
timeout-minutes: 20
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: todo2025
MYSQL_USER: todo
MYSQL_PASSWORD: todo
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping -h 127.0.0.1 -proot"
--health-interval=10s
--health-timeout=5s
--health-retries=10
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, xml, ctype, curl, dom, fileinfo, gd, pdo_mysql
coverage: xdebug
- name: Cache Composer
uses: actions/cache@v4
with:
path: ~/.composer/cache/files
key: composer-${{ hashFiles('**/composer.lock') }}
- name: Install Composer deps
run: composer install --no-interaction --no-progress --prefer-dist
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install Node deps
run: npm ci
- name: Build front
run: npm run build --if-present
- name: Prepare CI .env and key
run: cp .env.ci .env && php artisan key:generate
- name: Wait for MySQL
run: |
for i in {1..30}; do
(echo > /dev/tcp/127.0.0.1/3306) >/dev/null 2>&1 && break
sleep 2
done
- name: Migrate database
env:
DB_CONNECTION: mysql
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_DATABASE: todo2025
DB_USERNAME: todo
DB_PASSWORD: todo
run: php artisan migrate --no-interaction --force
- name: Lint PHP (Pint)
run: |
if [ ! -f vendor/bin/pint ]; then composer require --dev laravel/pint; fi
vendor/bin/pint --test
- name: Static analysis (Larastan)
run: |
if [ ! -f vendor/bin/phpstan ]; then composer require --dev phpstan/phpstan nunomaduro/larastan; fi
vendor/bin/phpstan analyse --memory-limit=1G --no-progress
continue-on-error: true
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-${{ github.sha }}
path: public/build
if-no-files-found: ignore
git add .github/workflows/ci.yml
git commit -m "CI MySQL: build + migrate + lint + analyse + tests"
git push origin main
3. VĂ©rifier la CIâïž
3.1 Github actionsâïž
GitHub â Actions â âCIâ. Ouvrer les logs en cas d'Ă©chec.

Les causes usuelles :
- Migrations dĂ©pendant de donnĂ©es seed manquantes â ajoute --seed si utile.
- Tests qui supposent un stockage non configurĂ© â ajuste drivers en .env.ci.
- Erreurs de schĂ©ma â vĂ©rifie tes derniĂšres migrations.
La CI ne passe pas car ...
- name: Lint PHP (Pint)
run: |
if [ ! -f vendor/bin/pint ]; then composer require --dev laravel/pint; fi
vendor/bin/pint --test
3.2 Installer pintâïž
đ But de pint :
- Imposer un style de code homogĂšne dans toute la base Laravel.
- EmpĂȘcher un merge si le code est mal indentĂ© ou sâil y a des violations de style.
- Garantir la lisibilité et éviter que chaque développeur formate le code à sa maniÚre.
Les Ătapes pour installer le module pint :
- Installer Pint en local (dev dependency) :
composer require --dev laravel/pint - Analyser ton code sans corriger (équivalent du --test en CI) :
vendor/bin/pint --test#VĂ©rifie et corrige le code â ça liste les fichiers non conformes.

-
Corriger automatiquement :
vendor/bin/pintâ ça reformate tout ton projet selon les rĂšgles par dĂ©faut (style Laravel, basĂ© sur PSR-12). -
Termine la mise en place de pint en poussant les modifications vers github :
đ Textegit add . git commit -m "Fix code style with Pint" git push origin main
đ VĂ©rifier sur GitHub Actions : la CI devrait passer le job Lint PHP (Pint).
3.3 RĂšgles minimales pour le style de codeâïž
On va figer les rĂšgles de bases dans le projet dans un fichier pint.json minimal que tu peux placer Ă la racine du projet.
{
"preset": "laravel",
"rules": {
"binary_operator_spaces": {
"default": "single_space"
},
"concat_space": {
"spacing": "one"
},
"ordered_imports": {
"sort_algorithm": "alpha"
},
"single_quote": true,
"no_unused_imports": true
}
}
đ Explications :
- "preset": "laravel" â applique le style officiel Laravel (basĂ© sur PSR-12).
- "binary_operator_spaces" â garantit un espace autour des opĂ©rateurs (=, +, =>).
- "concat_space" â impose un espace avant/aprĂšs lâopĂ©rateur de concatĂ©nation ..
- "ordered_imports" â trie les use par ordre alphabĂ©tique.
- "single_quote": true â privilĂ©gie '...' sauf si les guillemets doubles sont nĂ©cessaires.
- "no_unused_imports": true â supprime les use inutiles.
lien vers la Documentation
SynthĂšse Utilisation
- Crée
pint.jsonĂ la racine du projet. - Corrige ton code avec :
vendor/bin/pint - Vérifie ensuite avec :
vendor/bin/pint --test - Commit & push.
et la CI passe đđđ

4. Standardiser les commandes avec les scripts Composer đ§©âïž
Pour faciliter lâexĂ©cution des vĂ©rifications de qualitĂ©, on centralise les commandes clĂ©s dans le fichier composer.json, section scripts.
Cela permet Ă chaque dĂ©veloppeur (ou Ă la CI) dâutiliser des commandes uniformes.
"scripts": {
"lint": "vendor/bin/pint --test",
"analyse": "vendor/bin/phpstan analyse",
"test": "php artisan test --coverage --min=80"
}
đ Explications
composer lintâ vĂ©rifie le format du code selon les rĂšgles de Laravel Pint.composer analyseâ lance lâanalyse statique avec PHPStan/Larastan pour dĂ©tecter les erreurs potentielles.composer testâ exĂ©cute la suite de tests et contrĂŽle la couverture minimale exigĂ©e (ici 80 %).
đĄ Ces scripts standardisent les pratiques : que le code soit testĂ© localement ou par la CI, les mĂȘmes commandes sont utilisĂ©es. Ainsi, tout le monde parle le mĂȘme âlangage de validationâ du projet.
5. Protection de la branche principale đâïž
Une fois la CI opĂ©rationnelle, il est important de protĂ©ger la branche main afin dâĂ©viter que du code non validĂ© soit fusionnĂ©.
â¶ïž Ătapes sur GitHub
- Ouvre ton dĂ©pĂŽt â Settings â Branches.
- Ajoute une Branch protection rule pour
main. -
Active :
-
â Require a pull request before merging (oblige Ă passer par une PR).
- â
Require status checks to pass before merging et sélectionne ton workflow CI (ex.
CI / build-test). - Enregistre.
Ainsi, aucun code ne sera intĂ©grĂ© dans main si les tests, lâanalyse et le lint ne passent pas.
đ Câest une garantie de stabilitĂ© et une excellente pratique Ă inculquer dĂšs la formation.