Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English
Read in English

CI, Continuous Delivery, Continuous Deployment : quel niveau choisir ?

Par mis à jour le

Améliorer cette page

L'intégration continue valide chaque modification, la livraison continue rend le code déployable à tout moment, le déploiement continu le met en production sans intervention humaine. Les deux dernières partagent l'acronyme « CD », d'où la confusion. Le choix du niveau n'est pas une question de vocabulaire : il engage la culture de l'équipe, ses exigences de tests et le risque qu'elle accepte. Cette leçon définit les trois pratiques, aide à choisir son niveau et montre une chaîne complète qui les enchaîne.

  • Distinguer intégration continue, livraison continue et déploiement continu
  • Appliquer les quatre règles qui rendent une CI efficace
  • Justifier une validation humaine avant la production
  • Vérifier les prérequis du déploiement continu avant de l'adopter
  • Lire une chaîne complète et situer sa porte d'approbation
  • Reconnaître le piège du « full CD » prématuré

Chaque niveau inclut le précédent : pas de livraison continue sans intégration continue, pas de déploiement continu sans livraison continue. C'est une progression, pas un choix entre trois options équivalentes. Le schéma montre où chacun s'arrête : la CI s'arrête à la validation, la livraison à un artefact prêt, le déploiement à la production.

Les trois niveaux en progression : la CI construit et teste pour donner un retour au développeur (obligatoire), la livraison continue rend le code prêt à livrer avec une validation humaine (recommandée), le déploiement continu déploie automatiquement sans intervention (optionnel).CI : build + test, feedback devobligatoire pour toutes les équipesCD (Delivery) : prêt à livrervalidation humaine, recommandéCD (Deployment) : déployé autozéro intervention, optionnel
Source · SVG
Échap pour fermer, + et − pour zoomer, défilement pour se déplacer. 100 %

L'intégration continue (CI) valide chaque modification dès qu'elle est poussée, avant qu'elle ne rejoigne la branche principale. Imaginez cinq développeurs, chacun sur sa branche : Alice pousse lundi, Bob mardi, chaque code compile chez son auteur, et vendredi la fusion ne compile plus, parce que les deux changements sont incompatibles sans que personne le sache.

Avec la CI, le problème apparaît immédiatement : dès qu'Alice pousse, la pipeline vérifie que son code fonctionne avec le reste, et elle le sait en quelques minutes plutôt qu'en cinq jours. À chaque commit ou pull request, la pipeline compile, lance les tests unitaires et d'intégration, l'analyse statique et un scan des dépendances vulnérables.

Plus un bogue est découvert tard, plus il coûte : au moment du commit, son auteur a encore le contexte en tête ; en production, il faut retrouver le changement fautif, le corriger sous pression et redéployer. La CI ramène la détection au plus près de l'écriture du code.

Le coût de correction d'un bogue croît avec le temps : faible au commit, plus élevé au merge puis en staging, maximal en production.le coût de correctioncroît avec le tempsCommitcoût faibleMergeStagingProdcoût le plus élevé
Source · SVG
Échap pour fermer, + et − pour zoomer, défilement pour se déplacer. 100 %

Une CI ne protège que si elle est respectée. Chaque commit la déclenche, sans exception ; un échec bloque la fusion, pour qu'aucun code cassé n'atteigne la branche principale ; les tests restent rapides, idéalement sous dix minutes, faute de quoi les développeurs contournent le système ; et le retour arrive directement au développeur, dans son interface ou sa messagerie.

La livraison continue : prêt à déployer, sur décision

Section intitulée « La livraison continue : prêt à déployer, sur décision »

La livraison continue (Continuous Delivery) prolonge la CI : le code n'est pas seulement validé, il est prêt à partir en production à tout moment. Un humain décide quand. Après la CI, la pipeline construit un artefact immuable (image, binaire, paquet), le déploie en recette, lance des tests de bout en bout sur des parcours complets, puis attend une validation.

Livraison continue : CI, construction de l'artefact et déploiement en staging sont automatiques ; le passage en production attend qu'un humain réponde « Oui, go. » à la question « On déploie ? ».« Oui, go. »CIautoBuild artefactautoStaging deployauto« On déploie ? »manuelProduction
Source · SVG
Échap pour fermer, + et − pour zoomer, défilement pour se déplacer. 100 %

La validation humaine n'est pas un aveu de faiblesse : elle est rationnelle dans quatre situations. Une fonctionnalité doit sortir avec une annonce commerciale, et le déploiement automatique ne lit pas le calendrier marketing. Un secteur régulé (santé, finance, aéronautique) exige que chaque mise en production soit documentée et approuvée. L'équipe n'a pas encore assez de tests pour s'en passer. Ou le déploiement touche des partenaires qu'il faut prévenir.

Le point clé tient en une phrase : avec la livraison continue, le code est toujours déployable. La question n'est plus « peut-on déployer ? », mais « veut-on déployer maintenant ? ». C'est cette disponibilité permanente qui compte, pas l'absence de bouton.

Le déploiement continu : aucune intervention humaine

Section intitulée « Le déploiement continu : aucune intervention humaine »

Le déploiement continu (Continuous Deployment) supprime la dernière barrière : chaque modification validée part automatiquement en production. Un développeur fusionne sa pull request à 14 h 03 ; à 14 h 08, le code sert de vrais utilisateurs, sans que personne ait cliqué sur « déployer ». En 2011 déjà, Amazon annonçait un déploiement en production toutes les 11,6 secondes en moyenne.

Déploiement continu : CI, construction de l'artefact, déploiement en staging puis en production s'enchaînent automatiquement, sans aucun humain entre le commit et la production.autoautoautoCIBuildartefactStagingdeployProductiondeployZéro humainentre commit et prod
Source · SVG
Échap pour fermer, + et − pour zoomer, défilement pour se déplacer. 100 %

Sans humain dans la boucle, un bogue qui passe les tests arrive en production. Le déploiement continu exige donc cinq fondations. Des tests qui couvrent chaque chemin critique. Des feature flags, qui livrent du code désactivé et permettent de couper une fonctionnalité sans redéployer. Un retour arrière automatique quand les taux d'erreur ou la latence se dégradent.

Il faut aussi une observabilité qui détecte un problème en secondes, avec alertes, tableaux de bord et journaux centralisés : on ne corrige pas ce qu'on ne voit pas. Et une culture sans blâme, où un incident sert à améliorer le système plutôt qu'à désigner un coupable, sans quoi les développeurs auront peur de fusionner. Les équipes qui pratiquent ce mode y ont investi des années : c'est une destination, pas un point de départ.

Le tableau met les trois pratiques en regard sur huit critères. Lisez surtout les lignes « déploiement production » et « intervention humaine » : c'est là que se joue la différence entre les deux CD. Les autres lignes montrent ce que chaque niveau ajoute en exigences, notamment en tests et en retour arrière.

AspectCILivraison continueDéploiement continu
DéclencheurCommit, pull requestFusion dans mainFusion dans main
Artefact produitOptionnelObligatoireObligatoire
Déploiement en recetteOptionnelObligatoireObligatoire
Déploiement productionNonManuelAutomatique
Retour arrièreSans objetManuelAutomatique
Exigence de testsUnitairesDe bout en boutDe bout en bout et canary
Délai avant productionSans objetHeures à joursMinutes
Intervention humaineAucuneValidation finaleAucune

Le bon niveau est celui que l'équipe sait tenir, et il se gravit dans l'ordre. Commencez par la CI si elle manque : c'est la priorité absolue, avec un objectif minimal clair, chaque pull request qui déclenche une pipeline, des tests qui bloquent la fusion en cas d'échec et un retour en moins de dix minutes. Le reste peut attendre tant que ce socle n'est pas en place.

Une fois la CI stabilisée, passez à la livraison continue : artefacts immuables, déploiement automatique en recette après chaque fusion, tests de bout en bout, validation humaine avant la production. C'est le niveau suffisant pour la plupart des équipes, et la validation humaine y est souvent la bonne réponse, pas un échec.

Le déploiement continu se considère ensuite, et seulement si quatre réponses sont « oui » : les chemins critiques sont-ils couverts par des tests automatisés ? Détecte-t-on un problème en production en quelques minutes ? Le retour arrière est-il automatique ? L'équipe traite-t-elle les incidents sans chercher de coupable ? Un seul « non », et la livraison continue reste le bon choix.

À quoi ressemble une chaîne complète, de la CI à la production ?

Section intitulée « À quoi ressemble une chaîne complète, de la CI à la production ? »

Une chaîne de livraison continue enchaîne les trois niveaux dans un même fichier : la partie CI valide chaque modification, la partie CD déploie en recette puis en production, et une porte d'approbation sépare les deux dernières étapes. Le fichier ci-dessous est écrit pour GitHub Actions : il se lit sans en connaître la syntaxe, qu'enseigne la formation GitHub Actions, et il illustre ce que les leçons de la formation construisent pas à pas.

Les jobs de CI (lint, test, security) s'exécutent en parallèle, puis build ne démarre que si les trois réussissent, grâce à la clé needs. La partie CD suit le même chaînage jusqu'à la production. L'image est construite une seule fois, étiquetée par le SHA du commit, et c'est elle que les environnements reçoivent.

name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
# Aucun droit par défaut : chaque job ne reçoit que ce dont il a besoin
permissions: {}
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
# ===== CONTINUOUS INTEGRATION =====
lint:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run test -- --coverage
- uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
security:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Run Trivy
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0, pinné par SHA
with:
scan-type: 'fs'
severity: 'CRITICAL,HIGH'
- name: Check secrets
uses: gitleaks/gitleaks-action@e0c47f4f8be36e29cdc102c57e68cb5cbf0e8d1e # v3.0.0
build:
needs: [lint, test, security]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
- uses: docker/login-action@06fb636fac595d6fb4b28a5dfcb21a6f5091859c # v4.5.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
# ===== CONTINUOUS DELIVERY =====
deploy-staging:
if: github.ref == 'refs/heads/main'
needs: build
runs-on: ubuntu-latest
environment: staging
steps:
- name: Deploy to staging
run: |
echo "Déploiement sur staging..."
# kubectl, ArgoCD, ou autre outil de déploiement
integration-tests:
needs: deploy-staging
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Run E2E tests on staging
run: npm run test:e2e
env:
BASE_URL: https://recette.inventaire.lab
deploy-production:
needs: integration-tests
runs-on: ubuntu-latest
environment:
name: production
url: https://inventaire.lab
steps:
- name: Deploy to production
run: |
echo "Déploiement en production..."
# Déploiement avec stratégie Blue/Green ou Canary

Deux réglages de sécurité encadrent ce fichier : permissions: {} retire tout droit au jeton GitHub par défaut, chaque job ne recevant que le strict nécessaire (packages: write pour publier l'image), et persist-credentials: false évite que le jeton reste écrit sur le disque du runner après le checkout. Les étapes Deploy ne font qu'un echo : le déploiement réel dépend de la cible, et la leçon Environnements et promotion en montre un complet.

La clé environment: production est ce qui fait de ce fichier une livraison continue plutôt qu'un déploiement continu. Côté GitHub, elle déclenche une règle de protection configurable : approbation manuelle, restriction de branche ou délai d'attente. Retirez la règle, et le même fichier part en production sans intervention : le niveau d'automatisation se règle sans dupliquer la pipeline.

Certaines équipes veulent « faire du déploiement continu » pour cocher une case ou parce qu'une grande entreprise le fait, sans en avoir les prérequis. Le résultat est prévisible : des bogues en production chaque jour, des développeurs qui ont peur de fusionner et fusionnent donc moins souvent, des retours arrière manuels en urgence, puis une perte de confiance dans la pipeline.

Le déploiement continu n'est pas un objectif en soi, c'est la conséquence d'une maturité acquise. La bonne approche consiste à rester en livraison continue et à renforcer tests, observabilité et culture. Le jour où la validation humaine n'apporte plus rien, parce que les tests détectent ce qu'elle aurait vu, le passage au déploiement continu devient naturel.

  • La CI valide chaque commit automatiquement : elle est obligatoire pour toute équipe.
  • La livraison continue garde le code toujours déployable, la mise en production restant une décision humaine.
  • Le déploiement continu met en production sans intervention humaine, et exige tests, feature flags, retour arrière automatique, observabilité et culture sans blâme.
  • Chaque niveau inclut les précédents : il n'y a pas de raccourci.
  • Une validation humaine est souvent la bonne réponse, pas un échec.
  • Le « full CD » prématuré crée plus de problèmes qu'il n'en résout.
  • Dans une chaîne complète, une porte d'approbation avant la production suffit à faire d'un déploiement continu une livraison continue.

Vérifiez que l'essentiel de cette leçon est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn