Résilience et sécurité des déploiements
Vue d'ensemble
Les choses casseront. L'attitude n'est pas "empêcher toute panne" mais échouer petit, récupérer vite, et apprendre à chaque fois. La fiabilité n'est pas l'absence de panne ; c'est le rayon d'explosion limité et le temps de récupération court quand la panne survient.
Sécurité des déploiements — Chaque déploiement réversible et exposé progressivement
- L'artefact est immuable et promu, pas reconstruit. Une seule image, construite une fois en CI et identifiée par son digest de contenu, se déplace preview → staging → production sans modification. Reconstruire par environnement revient à déployer quelque chose que vous n'avez jamais testé.
- Les tags sont des pointeurs mutables ; le digest est l'identité. Un tag peut être écrasé et pointer silencieusement vers autre chose. Un digest de contenu ne le peut pas. Chaque environnement enregistre le digest qu'il a validé, et la production exécute seulement un digest qu'un environnement inférieur a validé — donc "l'objet exact que nous avons testé" est une propriété que le pipeline impose, pas une discipline que quelqu'un doit retenir.
- Une décision humaine précède la production. Pour un mainteneur solo, c'est une pause délibérée et un enregistrement d'audit plutôt qu'une séparation des tâches. Dites clairement de quoi il s'agit ; ne le vendez pas trop.
- La version en cours est injectée au moment du déploiement, jamais intégrée dans l'image. Une version intégrée comme argument de build force une reconstruction pour estampiller une release, et la reconstruction est exactement ce que la promotion vise à éviter.
- Quand l'infrastructure vit dans son propre dépôt, coordonnez par expansion/contraction. L'infrastructure s'étend d'abord (de manière additive, rétrocompatible), l'application consomme la nouvelle capacité dans un déploiement ultérieur, et l'infrastructure se contracte seulement une fois qu'aucun artefact actif ne dépend de l'ancienne forme — la même discipline qu'un changement de schéma (voir
zero-downtime-migrations). L'invariant : ne jamais livrer un artefact applicatif qui nécessite un changement d'infrastructure pas encore en place. Respecté, chaque dépôt est réversible indépendamment, ce qui rend le rollback gérable quand les deux sont décalés. - N'avancez que quand vous pouvez revenir en arrière. Un chemin de rollback existe et est testé avant qu'un changement risqué ne soit mis en production. "Comment annuler cela ?" est répondu dans le plan, pas pendant l'incident.
- Le rollback consiste à redéployer le digest précédemment bon. Ce digest est toujours dans le registre et toujours immuable, donc revenir en arrière est une promotion inversée — jamais une reconstruction, et jamais une reconstruction "telle qu'elle était".
- Exposition progressive. Les nouvelles versions atteignent les utilisateurs progressivement (déploiement à santé contrôlée, canary là où c'est supporté), donc une mauvaise release nuit à une fraction, pas à tout le monde.
- Les modifications de schéma sont découplées des déploiements de code et suivent l'expansion/contraction (voir
zero-downtime-migrations). Un déploiement ne doit jamais nécessiter une migration destructive simultanée. - Une checklist de préparation au déploiement vérifie la production : observabilité en place, rollback vérifié, migrations sûres pour l'expansion, SLOs non violés.
Réponse aux incidents — La panne est une entrée d'apprentissage
- Classez par sévérité et répondez proportionnellement ; ayez un chemin connu pour impliquer les bonnes personnes.
- Post-mortems sans blâme pour chaque incident visible par les utilisateurs. Chronologie écrite, causes contributives (systémiques, pas personnelles), actions concrètes. La question est "qu'est-ce que le système a permis qui a causé cela", jamais "qui a fait l'erreur".
- Les actions sont suivies, pas oubliées — elles sont intégrées dans le document des considérations futures (voir
recording-decisions) et deviennent du vrai travail. - Le budget d'erreur gouverne. Quand la fiabilité est épuisée, le travail de fiabilité prime sur les fonctionnalités jusqu'à ce que le budget se rétablisse.
Référence rapide
| Avant un déploiement risqué | À vérifier |
|---|---|
| Artefact | Construit une fois en CI ; promu par digest ; le même que celui validé en staging |
| Porte | Une décision humaine enregistrée avant la production |
| Rollback | Un chemin existe et est testé |
| Exposition | Graduelle/canary, pas tout d'un coup |
| Schéma | Sécurisé pour l'expansion, découplé du déploiement de code |
| Observabilité | Pouvez-vous voir si ça tourne mal ? |
Quand passer à l'échelle
Les projets locaux/pré-lancement écrivent ces règles maintenant, les activent dès les premiers vrais utilisateurs. Les propriétés sont portables — construire une fois, promouvoir ce que vous avez testé, décider avant la production, pouvoir revenir en arrière — mais les mécanismes ne le sont pas : une promotion par digest est pertinente sur un hôte conteneurisé et largement sans objet pour un site statique, et une plateforme managée peut fournir des environnements preview et un rollback instantané gratuitement. Nommez le mécanisme dans la compétence de livraison du projet ; conservez la propriété ici. Empilez les mécanismes (sondes Kubernetes, canary, environnements par PR) : cloud-delivery-aks.
Justification complète : Article XII de la constitution, regroupé dans engineering-constitution/references/engineering-constitution.md.