CI/CD — Intégration et Déploiement Continus

Pipelines d'intégration continue, tests automatisés et stratégies de déploiement : blue-green, canary et rolling updates.

Qu’est-ce que le CI/CD ?

Le CI/CD (Continuous Integration / Continuous Delivery ou Deployment) est un ensemble de pratiques qui automatisent le processus d’acheminement du code depuis le dépôt jusqu’à la production.

  • CI (Intégration Continue) : chaque modification de code est intégrée fréquemment, compilée et testée automatiquement
  • CD (Livraison Continue) : le code qui passe la CI est toujours prêt à être déployé en production
  • CD (Déploiement Continu) : le code est déployé automatiquement en production sans intervention manuelle

Pipeline de CI/CD

Un pipeline est une séquence d’étapes automatisées que le code traverse depuis le commit jusqu’à la production.

Étapes typiques

Commit → Build → Test → Analyse → Artefact → Deploy Staging → Deploy Production
  1. Build : compiler le code, générer les artefacts
  2. Tests unitaires : exécuter des tests rapides qui valident la logique
  3. Tests d’intégration : vérifier que les composants fonctionnent ensemble
  4. Analyse statique : linting, type checking, analyse de sécurité
  5. Construction de l’artefact : créer une image Docker, un paquet, etc.
  6. Deploy vers staging : déployer automatiquement pour les tests finaux
  7. Deploy vers production : déployer avec la stratégie choisie

Exemple avec GitHub Actions

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

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

  deploy-staging:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t my-app:${{ github.sha }} .
      - name: Push to registry
        run: docker push my-app:${{ github.sha }}
      - name: Deploy to staging
        run: kubectl set image deployment/my-app my-app=my-app:${{ github.sha }} -n staging

Tests automatisés en CI

Les tests sont la colonne vertébrale de la CI. Sans tests fiables, l’automatisation n’a aucun sens.

Pyramide des tests en CI

  • Tests unitaires (nombreux, rapides) : valident les fonctions et modules individuels
  • Tests d’intégration (modérés) : valident la communication entre les composants
  • Tests end-to-end (peu nombreux, lents) : valident les parcours utilisateur complets

Bonnes pratiques

  • Les tests doivent être déterministes : le même code produit toujours le même résultat
  • Les tests doivent être rapides : un pipeline lent décourage l’intégration fréquente
  • Les tests doivent être indépendants : ne dépendre ni de l’ordre d’exécution ni d’un état partagé
  • Utiliser la parallélisation pour réduire le temps total du pipeline

Stratégies de déploiement

Rolling update

La stratégie par défaut dans Kubernetes. Elle remplace progressivement les anciennes instances par les nouvelles.

  • Avantage : ne nécessite aucune infrastructure supplémentaire
  • Inconvénient : pendant la mise à jour, deux versions coexistent
  • Rollback : automatique si les health checks échouent
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

Blue-Green deployment

Maintient deux environnements identiques : Blue (actuel) et Green (nouveau). Le trafic est redirigé de Blue vers Green lorsque Green est prêt.

  • Avantage : rollback instantané (retour à Blue)
  • Inconvénient : nécessite le double d’infrastructure pendant le déploiement
  • Idéal pour : les changements importants ou les migrations de base de données

Canary deployment

Déploie la nouvelle version d’abord auprès d’un petit pourcentage d’utilisateurs. Si tout se passe bien, on l’augmente progressivement jusqu’à 100 %.

  • Avantage : risque minimal, détection précoce des problèmes
  • Inconvénient : plus complexe à implémenter et à monitorer
  • Idéal pour : les changements risqués ou les fonctionnalités expérimentales
Phase 1 : 5 % du trafic → nouvelle version
Phase 2 : 25 % du trafic → nouvelle version
Phase 3 : 50 % du trafic → nouvelle version
Phase 4 : 100 % du trafic → nouvelle version

Feature flags

Ce n’est pas une stratégie de déploiement à proprement parler, mais elle complète les précédentes. Elle permet d’activer ou de désactiver des fonctionnalités sans redéployer.

  • Le nouveau code est déployé mais désactivé par défaut
  • Il est activé progressivement pour des utilisateurs spécifiques
  • En cas de problème, il est désactivé sans rollback

Bonnes pratiques de CI/CD

  1. Faire des commits petits et fréquents : facilite la détection des erreurs
  2. Le pipeline doit être rapide : idéalement moins de 10 minutes pour la CI
  3. Ne jamais contourner le pipeline : chaque changement passe par la CI, sans exception
  4. Artefacts immuables : le même artefact est promu d’un environnement à l’autre
  5. Monitorer les déploiements : alertes automatiques si quelque chose échoue après le déploiement
  6. Automatiser les rollbacks : si les métriques se dégradent, revenir en arrière automatiquement

Résumé

Le CI/CD automatise le chemin du code vers la production. L’intégration continue garantit que chaque changement est validé automatiquement, tandis que les stratégies de déploiement (rolling, blue-green, canary) permettent d’acheminer les changements en production avec confiance et un risque minimal.