W08

CI/CD & Automatisation

GitHub Actions, pipelines lint→test→build→deploy, conditions, matrix et cache npm.

⚡ 1. Qu'est-ce que le CI/CD ?

  • CI (Continuous Integration) — vĂ©rifier automatiquement que le code compile, passe les tests et respecte les rĂšgles de qualitĂ© Ă  chaque push
  • CD (Continuous Deployment) — dĂ©ployer automatiquement en production quand le CI passe sur la branche principale

Bénéfices

  • DĂ©tection prĂ©coce des rĂ©gressions (pas besoin d'attendre le dev lead)
  • DĂ©ploiements cohĂ©rents et reproductibles
  • RĂ©duction des erreurs humaines
  • Feedback rapide sur les pull requests
Un pipeline CI/CD simple : git push → lint → tests → build → deploy. Si une Ă©tape Ă©choue, le pipeline s'arrĂȘte et vous recevez une notification.

🐙 2. GitHub Actions

GitHub Actions est le systÚme CI/CD intégré à GitHub. Gratuit pour les dépÎts publics et généreux pour les privés (2000 minutes/mois).

Concepts clés

ConceptDescription
workflowFichier YAML dans .github/workflows/
on:ÉvĂ©nements dĂ©clencheurs (push, PR, schedule...)
jobs:Groupes de steps qui s'exécutent sur une machine virtuelle
steps:Commandes individuelles dans un job
uses:Action réutilisable (ex: actions/checkout@v4)
run:Commande shell à exécuter
secrets:Variables sensibles (tokens, clés API)

🔄 3. Pipeline complet

name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
      - run: npm ci
      - run: npm run lint
      - run: npm test
      - run: npm run build

  deploy-vercel:
    needs: ci
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
      - run: npm ci && npm run build
      - run: npx vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
        env:
          VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
          VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

🔀 4. Conditions & Secrets

Conditions

# Exécuter seulement sur main
if: github.ref == 'refs/heads/main'

# Exécuter si le job précédent a réussi
if: success()

# ExĂ©cuter mĂȘme en cas d'Ă©chec (pour cleanup)
if: always()

# Combiner des conditions
if: github.ref == 'refs/heads/main' && success()

Secrets

# Utiliser un secret dans un step
- run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}

# Passer comme variable d'environnement
- run: npm run deploy
  env:
    NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
    NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
Ajoutez les secrets dans GitHub : Settings → Secrets and Variables → Actions → New repository secret. Ils sont masquĂ©s dans les logs et accessibles via ${{ secrets.NOM }}.

đŸ”Č 5. Matrix builds

Testez sur plusieurs versions de Node.js ou plusieurs OS en parallĂšle.

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: npm
      - run: npm ci && npm test
cache: npm dans actions/setup-node met en cache ~/.npm automatiquement. Peut réduire le temps d'installation de 30-60 secondes.

📋 6. Exemples de dĂ©ploiement

Déploiement Netlify via CI

  deploy-netlify:
    needs: ci
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
      - run: npm ci && npm run build
      - run: npx netlify-cli deploy --dir=dist --prod
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

Déploiement VPS via SSH

  deploy-vps:
    needs: ci
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ubuntu
          key: ${{ secrets.VPS_SSH_KEY }}
          script: |
            cd /var/www/mon-app
            git pull origin main
            npm ci
            npm run build
            pm2 restart mon-api
→ Exercices W08 🔧 Mini-projet đŸ–„ Projet Final →