Retour aux ressources
// devops · déploiement

Rendre un déploiement ennuyeux

Un bon déploiement ne devrait déclencher aucune émotion. Pas de « on croise les doigts », pas de fenêtre de maintenance à minuit. Voici comment je transforme un déploiement stressant en non-événement reproductible.

Guide14 juil. 2026~8 min · intermédiaire
CI/CDTerraformGitHub Actionshealth checksrollback
01

Pourquoi « ennuyeux » est un objectif

Un déploiement excitant, c'est un déploiement risqué. « Ça marche chez moi » veut dire que l'environnement n'est pas reproductible ; une mise en prod stressante veut dire qu'il n'y a pas de filet. L'objectif : pouvoir déployer un vendredi à 17h sans y penser.

01
Reproductible

La même commande produit le même résultat, partout. Zéro étape manuelle, zéro « il faut aussi penser à… ».

02
Automatisé

Un merge sur main déclenche build, tests, déploiement. L'humain ne copie plus de fichiers à la main.

03
Observable

Tu sais en temps réel si le déploiement s'est bien passé — health checks, logs, métriques — sans attendre un ticket client.

04
Réversible

Un rollback en une commande. La question n'est pas « est-ce que ça va marcher » mais « en combien de temps je reviens en arrière ».

02

Infra as code

Une infra cliquée à la main dans la console n'est pas reproductible et personne ne sait ce qui a changé. En Terraform, l'infra devient du code : versionné, relu en pull request, recréable à l'identique.

infrastructure.tfcopier
# infrastructure.tf — l'infra est du code, versionne et relisible
resource "aws_instance" "web" {
ami = "ami-0abc"
instance_type = "t3.large"
tags = { Project = "shop", Env = "prod" }
}
# "terraform apply" recree la meme infra a l'identique, partout
03

Le pipeline

Le principe clé : le même script de déploiement tourne en CI et en local. Pas de logique secrète cachée dans l'interface GitHub — si la CI tombe, tu lances le script à la main et tu obtiens le même résultat.

.github/workflows/deploy.ymlcopier
# .github/workflows/deploy.yml — chaque merge sur main deploie
name: deploy
on:
push: { branches: [main] }
jobs:
ship:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm run build && npm test
- name: deploy
run: ./scripts/deploy.sh # meme script que tu peux lancer en local
04

Le filet : health checks + rollback

La nouvelle version ne prend le trafic qu'après avoir prouvé qu'elle est vivante. Le load balancer interroge un endpoint /health ; tant qu'il ne répond pas 200, l'ancienne version reste en place.

health.tscopier
// l'app expose un endpoint que le load balancer interroge
app.get("/health", (_, res) => res.json({ ok: true }));
// le deploiement attend que /health reponde 200 avant de basculer
// sinon : rollback automatique, l'ancienne version reste en place

Avec un déploiement blue-green ou rolling, la bascule est progressive : si le /health échoue, rien ne bascule et l'utilisateur ne voit rien. Le rollback devient un non-sujet.

i

Côté applicatif, la même logique d'observabilité vaut pour l'IA : je détaille le traçage dans tracer et scorer un agent.

05

Blue-green ou canary : choisir son filet

J'ai évoqué le blue-green plus haut ; en pratique je choisis entre deux stratégies selon le risque. En blue-green, deux environnements identiques tournent en parallèle : je bascule 100% du trafic de « blue » vers « green » d'un coup, et le rollback est un simple retour de trafic vers « blue » resté debout. En canary, je décale le trafic par paliers — 5%, puis 25%, puis 100% — et je n'avance que si les erreurs et la latence restent saines.

Blue-green

Bascule instantanée, rollback instantané.

Rollback = re-router vers l'environnement d'origine, déjà chaud. La question « en combien de temps je reviens » se compte en secondes.
Coût : deux environnements complets en parallèle le temps de la bascule.
Angle mort : au moment de la bascule, 100% des utilisateurs voient la nouvelle version d'un coup. Un bug non couvert par le /health touche tout le monde.
Canary

Exposition graduelle, blast radius plafonné.

Le premier palier limite les dégâts : à 5%, une mauvaise version ne touche qu'un utilisateur sur vingt avant d'être arrêtée.
Exige une observabilité solide : sans métriques par version fiables, tu ne sais pas quand avancer ou reculer.
Plus lent : la montée en trafic prend des minutes à des heures, et tu gères une cohabitation de deux versions.
i

Ma règle : blue-green quand le rollback instantané prime et que le trafic est prévisible ; canary quand je veux valider une version risquée sur un vrai échantillon avant de l'exposer à tous. Les deux se gèrent sur AWS avec CodeDeploy et le décalage de trafic de l'ELB.

06

Readiness vs liveness, et mesurer l'ennui

Un /health ne suffit pas : distingue « vivant » et « prêt »

Le /health que j'ai montré plus haut cache en réalité deux questions différentes, et Kubernetes les sépare explicitement avec ses probes liveness, readiness et startup. La readiness dit « je peux recevoir du trafic maintenant » (DB connectée, cache chaud) : si elle échoue, on me retire du load balancer sans me tuer. La liveness dit « je suis vivant, ne me redémarre pas » : si elle échoue, on redémarre le conteneur. Confondre les deux mène à des redémarrages en boucle dès qu'une dépendance ralentit.

probes.tscopier
// deux endpoints distincts, deux responsabilites
// /livez : le process tourne-t-il ? (ne teste PAS les dependances)
app.get("/livez", (_req, res) => res.status(200).send("ok"));
// /readyz : puis-je servir du trafic ? (teste les dependances)
app.get("/readyz", async (_req, res) => {
try {
await db.query("SELECT 1"); // la base repond ?
await redis.ping(); // le cache repond ?
res.status(200).send("ready");
} catch {
res.status(503).send("not ready"); // retire du LB, pas de restart
}
});
!

Piège classique : mettre les dépendances dans la liveness. Si la base a un hoquet de 30s, toutes tes instances échouent la liveness en même temps, se font redémarrer en même temps, et tu transformes une lenteur passagère en panne totale. La liveness doit rester locale au process.

Mesurer que c'est vraiment ennuyeux : les métriques DORA

« Ennuyeux » n'est pas qu'un ressenti, ça se mesure. Les métriques DORA — issues de six ans de recherche Google — capturent à la fois la vélocité et la stabilité d'une chaîne de livraison. La contre-intuition clé du rapport : vitesse et stabilité ne sont pas un compromis, les meilleures équipes déploient plus souvent ET récupèrent plus vite.

Deployment frequencyÀ quelle fréquence tu livres en prod. Un déploiement ennuyeux se fait souvent, en petits lots — pas une grosse release trimestrielle stressante.
Lead time for changesTemps entre un commit et sa mise en prod. Plus il est court, plus le changement est petit et facile à diagnostiquer s'il casse.
Change failure ratePart des déploiements qui provoquent un incident. C'est le juge de paix de tes health checks et de ta stratégie de bascule.
Failed deployment recovery timeTemps pour restaurer le service après un échec. C'est exactement la propriété « réversible » : mon rollback en une commande le pousse vers zéro.

Note : DORA a fait évoluer son modèle vers cinq métriques (en ajoutant un « rework rate »), mais ces quatre-là restent le socle. Je les instrumente comme le reste — métriques, logs et traces — dans la lignée des trois signaux d'OpenTelemetry.

07

Sources & ressources

01DORA — Software delivery performance metricsLe référentiel officiel des métriques DORA et leur définition à jour.02Google Cloud — Use the Four Keys to measure DevOps performanceLes quatre métriques expliquées, avec le projet open source Four Keys pour les collecter.03Kubernetes — Liveness, Readiness and Startup ProbesLa distinction canonique entre « vivant » et « prêt », avec exemples de configuration.04AWS — Canary deploymentsLe décalage de trafic par paliers pour plafonner le blast radius.05AWS — Blue/Green Deployments whitepaperDeux environnements identiques et le rollback par retour de trafic.06HashiCorp — Manage resource drift with TerraformDétecter la dérive entre l'état et l'infra réelle avec terraform plan -refresh-only.07OpenTelemetry — Signals (traces, metrics, logs)Les trois signaux d'observabilité pour savoir en temps réel si un déploiement s'est bien passé.

Un déploiement ennuyeux, c'est le plus grand compliment qu'on puisse faire à une équipe d'infra. Reproductible, automatisé, observable, réversible : quatre propriétés, et le stress disparaît. Le temps libéré va sur le produit.