Aller au contenu

Principes CI/CD

Comprendre les trois niveaux de l'intégration et de la livraison continues, et pourquoi ils changent fondamentalement la façon de livrer du logiciel.


CI vs CD vs CD

Les trois sigles se ressemblent, mais ils désignent des pratiques distinctes avec des objectifs différents.

Intégration Continue (CI) : chaque modification de code est automatiquement vérifiée — build, tests, analyse statique. L'objectif est de détecter les régressions immédiatement, avant qu'elles ne s'accumulent.

Livraison Continue (Continuous Delivery) : le code passe CI et est automatiquement préparé pour être déployé en production. Le déploiement reste un acte humain volontaire, mais il peut être fait à tout moment en un clic.

Déploiement Continu (Continuous Deployment) : toute modification qui passe CI est automatiquement déployée en production sans intervention humaine.

graph LR
    A["Commit"] --> B["Build & Tests<br/>automatiques"]
    B --> C{"Qualite OK ?"}
    C -->|Non| D["Feedback<br/>immediat"]
    C -->|Oui| E["Artefact pret<br/>a deployer"]
    E --> F{"Declencheur"}
    F -->|"Manuel<br/>(CD Delivery)"| G["Production"]
    F -->|"Automatique<br/>(CD Deployment)"| G
    style D fill:#e74c3c,color:#fff
    style G fill:#2ecc71,color:#fff

Quelle approche choisir ?

Le déploiement continu n'est pas toujours la bonne réponse. Il nécessité une confiance totale dans la suite de tests et une culture de feature flags mature. La livraison continue est souvent le meilleur compromis : automatisation maximale, décision humaine finale.


Le feedback loop

La valeur de la CI repose sur la vitesse du retour d'information. Un pipeline qui prend 45 minutes est un pipeline que les développeurs ignorent.

Shift-left

Le principe shift-left consiste à détecter les problèmes le plus tôt possible dans le cycle de développement, là où le coût de correction est le plus bas.

graph LR
    A["Editeur<br/>secondes"] -->|"Linter + formatter"| B["Commit<br/>minutes"]
    B -->|"Pre-commit hooks"| C["Push CI<br/>< 10 min"]
    C -->|"Tests + SAST + SCA"| D["Staging<br/>heures"]
    D -->|"Tests E2E"| E["Production"]
    style A fill:#2ecc71,color:#fff
    style E fill:#e74c3c,color:#fff

Plus le problème est détecté à gauche, moins sa correction est chere. Un bug trouve dans l'éditeur se corrige en 30 secondes. Le même bug trouve en production peut mobiliser une équipe pendant des heures.

Objectif : pipeline < 10 minutes

Au-delà de 10 minutes, les développeurs commencent à travailler sur autre chose avant de lire le résultat. Le contexte est perdu. Visez un pipeline principal rapide, et deplacez les verifications longues (tests E2E, scans complets) dans des pipelines secondaires asynchrones.


Principes fondamentaux

Reproductibilite

Le même commit doit produire exactement le même artefact, qu'il soit builde aujourd'hui, demain ou dans six mois. Cela implique :

  • des dépendances versionnees et lockees (package-lock.json, requirements.txt)
  • des images de base versionnees et non mutables (node:20.12.0 et non node:latest)
  • un environnement de build défini (image conteneur reproductible)

Idempotence

Exécuter le pipeline une fois ou dix fois sur le même commit doit produire le même résultat. Les pipelines ne doivent pas avoir d'effets de bord cumulatifs.

Fail fast

Le pipeline doit échouer le plus tôt possible et avec un message clair. Ne pas continuer a construire une image si les tests ont échoué. Ne pas déployer si la signature est invalide.

Infrastructure as Code

L'environnement de CI lui-même est code. Les fichiers YAML de pipeline sont commites, versionnes, et soumis à revue comme le reste du code. Aucune configuration manuelle sur le serveur CI.

Le pipeline est du code

Un pipeline configure uniquement via l'interface graphique du CI est une dette technique. Si le serveur disparait, vous perdez la configuration. Commitez tout : les YAML de pipeline, les scripts utilisés, les Dockerfiles de build.


Le pipeline comme contrat

Un pipeline CI/CD bien conçu est un contrat passe avec l'équipe. Il garantit que tout code qui arrive en production :

Garantie Vérifiée par
Compile sans erreur Étape de build
Passe les tests unitaires Suite de tests automatises
Respecte le style Linter + formatter
N'introduit pas de faille SAST + SCA
Est tracable Tag Git + numéro de build
Est reproductible Artefact signe et stocke

Ce contrat sert aussi de documentation vivante : en lisant le pipeline, un nouveau développeur comprend exactement ce qu'il faut faire pour livrer du code.

Ne jamais contourner le pipeline

Les déploiements manuels directs en production, même "juste cette fois", cassent la traçabilité et accumulent des ecarts entre ce qui est déployé et ce qui est dans Git. Le pipeline est la seule voie.


Outils

Outil Description Lien
Gitea Actions CI/CD intégré a Gitea, compatible avec la syntaxe GitHub gitea.com
GitHub Actions CI/CD natif GitHub, écosystème de marketplace très riche github.com/features/actions
GitLab CI CI/CD intégré a GitLab, puissant et configurable docs.gitlab.com/ee/ci
Tekton CI/CD Kubernetes-native, pipeline as code tekton.dev