Sur cette page
Propriété d'architecture
COADF P-6 : un garde-fou qui vit dans un document est un conseil ; un garde-fou qui s'exécute dans la chaîne et bloque une livraison est un fence. Les fences se répartissent en quatre catégories (données, architecture, texte et processus), chacun avec un identifiant, une règle et une méthode d'application, et un fence ne mérite sa place que par une preuve de dents. COADF ne publie pas le vocabulaire sur lequel son propre fence de publication se déclenche, parce qu'une liste de ce qui est surveillé est une carte de ce qui est protégé.
La propriété n'est pas « il existe un contrôle ». C'est que l'état interdit ne peut pas dépasser un point donné, et que quelqu'un l'a vu y être arrêté.
Pourquoi elle compte
Chaque autre propriété de ce Companion peut être mise en œuvre correctement une fois et perdue au changement suivant. Un fence est ce qui garde une propriété vraie à travers des changements que personne n'a relus en ayant cette propriété en tête. La difficulté est rarement d'écrire le contrôle. Elle est de placer le contrôle sur le chemin que l'état interdit doit emprunter, et de prouver qu'il se déclenche là, sur le vrai chemin, plutôt que dans un test unitaire de la fonction de contrôle.
Stratégies de mise en œuvre valables
Surfaces d'application
Chaque surface voit quelque chose de différent, et chacune a un contournement caractéristique. Un fence a sa place sur la surface qui voit l'état interdit, et il n'est pas plus fort que le contournement de cette surface.
| Surface | Voit | Contournement habituel |
|---|---|---|
| Compilateur et vérificateur de types | La structure du code et les types déclarés | Casts, typage dynamique, réflexion, code généré |
| Validation dans l'application | Les valeurs à une frontière, à l'exécution | Un second point d'entrée : un job par lots, un script, une migration |
| Test d'architecture | Le graphe des dépendances | Le chargement par nom à l'exécution ; un nouveau paquet que la règle ne nomme pas |
| Test de contrat et de schéma | La compatibilité des interfaces | Un consommateur que personne n'a enregistré |
| Intégration continue | Le dépôt à un commit donné | Un contrôle obligatoire ignoré et signalé comme réussi |
| Barrière de fusion | Les contrôles qui doivent réussir avant une fusion | Les administrateurs, les push directs, une protection que l'offre d'hébergement n'applique pas |
| Chaîne de livraison | L'artefact en cours de promotion | Un téléversement manuel |
| Admission au déploiement | Les objets d'API soumis au cluster | Une politique d'échec qui ignore les erreurs ; les objets qui existaient avant la politique |
| Build de publication | La sortie publique rendue | Du contenu servi depuis l'extérieur du build |
Trois chaînes, chacune se terminant par une transition arrêtée, sont mises en œuvre dans les profils :
- Une violation d'architecture fait échouer un test d'architecture, et la fusion n'a pas lieu (Python et FastAPI).
- Une incompatibilité de contrat fait échouer un contrôle de contrat, et la livraison n'a pas lieu.
- Une sentinelle interdite synthétique dans le site construit fait échouer le fence de publication, et la publication n'a pas lieu (Python et FastAPI, Cloud-native).
L'intégration continue est une surface parmi neuf, pas la définition d'un fence. GitHub Actions, GitLab CI et Jenkins peuvent tous en héberger un ; un vérificateur de types, une politique d'admission ou le build qui rend un site le peuvent aussi.
Preuve de dents
- Introduire un défaut synthétique et contrôlé.
- Exercer le vrai chemin d'application, pas un test unitaire de la fonction de contrôle.
- Vérifier que cela échoue, et échoue pour la raison plantée.
- Restaurer la fixture exacte, et le prouver en comparant une empreinte avant et après.
- Vérifier que cela passe de nouveau.
Commiter avant de planter. Restaurer en abandonnant les modifications restaure le dernier commit, qui sur une branche de travail n'est pas forcément le point de départ, et la preuve détruit alors le travail qu'elle devait protéger.
Modes de défaillance
Le fence est sur le mauvais chemin
Il contrôle le dépôt, alors que le contenu interdit est injecté au build, au déploiement ou à l'exécution.
Un contrôle obligatoire ignoré se lit comme un succès
GitHub signale un job ignoré comme réussi, et un job ignoré n'empêche pas une fusion, même quand c'est un contrôle obligatoire. Un job obligatoire qui dépend d'un fence en échec est ignoré, et la fusion passe. Il faut exiger le fence lui-même, ou un job récapitulatif qui s'exécute toujours et échoue à moins que chaque fence n'ait réussi (le conseil de GitHub lui-même pour les contrôles qui dépendent d'autres jobs).
Consultatif par configuration
continue-on-error,allow_failure: truedans GitLab CI, un webhook d'admission dont la politique d'échec ignore les erreurs, une contrainte Gatekeeper endryrunouwarn: chacun transforme un fence en conseil sans que personne n'écrive le mot.Rien de contrôlé, signalé comme propre
Une liste de motifs vide, une sélection de tests qui ne correspond à rien, l'analyse d'un répertoire vide. Le nombre de contrôles réellement exécutés a sa place dans le résultat, et zéro est un échec.
Le fence se déclenche sur du travail légitime et il est désactivé
La précision garde un fence en vie. Une règle qui correspond à du texte ordinaire sera désactivée plutôt que respectée, et un fence désactivé est pire que pas de fence du tout, parce que tout le monde croit encore qu'il est là.
La liste propre au fence est publiée
Une liste publique des termes surveillés dit exactement au lecteur ce qui est protégé.
L'état existant n'est jamais contrôlé
L'admission et les contrôles avant fusion agissent sur les requêtes au moment où elles sont faites, pas sur ce qui existe déjà. Kubernetes le documente en toutes lettres pour un plugin d'admission : quand une LimitRange est ajoutée, les pods qui existent déjà restent inchangés. Gatekeeper dispose d'un audit des ressources existantes précisément pour cette lacune.
Le vert lu comme suffisant
Un contrôle qui réussit prouve que le contrôle a réussi. Savoir si c'est le bon contrôle est une question d'architecture à laquelle aucun pipeline ne peut répondre ; voir la note technique.
Vérification
Test d'architecture
Réussit quand : La règle de dépendances passe sur l'arborescence actuelle.
Preuve de dents : Planter l'import interdit : cela échoue, et la barrière de fusion refuse.
Test de contrat
Réussit quand : Les schémas du producteur et du consommateur sont compatibles.
Preuve de dents : Retirer un champ obligatoire du producteur : le contrôle échoue et le job de livraison ne s'exécute pas.
Test de bout en bout
Réussit quand : Le fence de publication analyse la sortie construite et passe.
Preuve de dents : Planter une sentinelle synthétique dans la sortie : le build échoue. La retirer, comparer l'empreinte, et le build passe.
Test de déploiement ou d'admission
Réussit quand : Un objet qui respecte la règle est admis.
Preuve de dents : En soumettre un qui l'enfreint : refus, avec le message de la règle.
Preuve manuelle
Réussit quand : Au moment de la fusion, une personne nommée confirme que chaque fence s'est exécuté dans cette exécution : l'identifiant de l'exécution et le nombre de contrôles exécutés sont consignés, et non remémorés.
Réalisations alternatives
- Des hooks pre-commit. Un retour rapide, et contournables sur la machine même du développeur : un conseil, pas un fence.
- Des gardes à l'exécution. Ils arrêtent un état interdit en production plutôt qu'avant. Nécessaires là où l'état n'existe qu'à l'exécution.
- Des barrières manuelles. Une personne nommée exécute une procédure écrite. COADF présente honnêtement un tel contrôle comme manuel, jamais comme appliqué.
- Des moteurs de politiques pour les règles d'infrastructure. ValidatingAdmissionPolicy de Kubernetes dans le processus, ou Open Policy Agent avec Gatekeeper, là où l'état interdit est un objet d'API.
Limites
- Un fence textuel ne peut pas voir un mécanisme exprimé par le flot de contrôle, des identifiants renommés, le flot de données ou la géométrie d'une figure. Les gardes automatisés sont nécessaires et non suffisants ; la revue humaine demeure.
- Un fence détecte ce qu'il a été écrit pour détecter, et rien d'autre.
- Des fences qui passent établissent que les fences ont passé. Ils n'établissent aucun statut réglementaire.
Sources
- GitHub: Control jobs with conditions · documentation officielle · Vérifié le 2026-09-11
- GitHub: Troubleshooting required status checks · documentation officielle · Vérifié le 2026-09-11
- GitLab: CI/CD YAML: allow_failure · documentation officielle · Vérifié le 2026-09-11
- Kubernetes: Dynamic admission control: failure policy · documentation officielle · Kubernetes 1.37 · Vérifié le 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: enforcement actions · documentation officielle · Gatekeeper 3.23 · Vérifié le 2026-09-11
- Kubernetes: Limit Ranges: admission-time validation · documentation officielle · Kubernetes 1.37 · Vérifié le 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: audit · documentation officielle · Gatekeeper 3.23 · Vérifié le 2026-09-11
- Kubernetes: Validating Admission Policy · documentation officielle · Kubernetes 1.37 · Vérifié le 2026-09-11
