Aller au contenu

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.

illustration

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

📋 Texte
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:

📋 Texte
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:

📋 Texte
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) :

📋 Texte
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
Puis pousser le fichier sur github

📋 Texte
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 :

📋 Texte
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
Pousser vos modifications.
📋 Texte
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.

illustration

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 ...

📋 Texte
- 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.

illustration

  • 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 :

    📋 Texte
    git 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.

📋 Texte
{
    "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 🎉🎉🎉

illustation

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.

JSON
"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

  1. Ouvre ton dĂ©pĂŽt → Settings → Branches.
  2. Ajoute une Branch protection rule pour main.
  3. Active :

  4. ✅ Require a pull request before merging (oblige à passer par une PR).

  5. ✅ Require status checks to pass before merging et sĂ©lectionne ton workflow CI (ex. CI / build-test).
  6. 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.