Aller au contenu

Projet indépendant de R&D · Cologne

Fences exécutables

Un état interdit empêche la fusion, la livraison, le déploiement ou la publication concernés.

Non normatif

Version du Companion
1.0
Se rapporte à COADF Core
2.2
Statut
À jour
Dernière relecture
Principes COADF
P-6

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.

Où un fence peut se placer, ce qu'il y voit, et comment on le contourne habituellement
SurfaceVoitContournement habituel
Compilateur et vérificateur de typesLa structure du code et les types déclarésCasts, typage dynamique, réflexion, code généré
Validation dans l'applicationLes valeurs à une frontière, à l'exécutionUn second point d'entrée : un job par lots, un script, une migration
Test d'architectureLe graphe des dépendancesLe chargement par nom à l'exécution ; un nouveau paquet que la règle ne nomme pas
Test de contrat et de schémaLa compatibilité des interfacesUn consommateur que personne n'a enregistré
Intégration continueLe dépôt à un commit donnéUn contrôle obligatoire ignoré et signalé comme réussi
Barrière de fusionLes contrôles qui doivent réussir avant une fusionLes administrateurs, les push directs, une protection que l'offre d'hébergement n'applique pas
Chaîne de livraisonL'artefact en cours de promotionUn téléversement manuel
Admission au déploiementLes objets d'API soumis au clusterUne politique d'échec qui ignore les erreurs ; les objets qui existaient avant la politique
Build de publicationLa sortie publique rendueDu 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

  1. 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.

  2. 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).

  3. Consultatif par configuration

    continue-on-error, allow_failure: true dans GitLab CI, un webhook d'admission dont la politique d'échec ignore les erreurs, une contrainte Gatekeeper en dryrun ou warn : chacun transforme un fence en conseil sans que personne n'écrive le mot.

  4. 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.

  5. 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à.

  6. La liste propre au fence est publiée

    Une liste publique des termes surveillés dit exactement au lecteur ce qui est protégé.

  7. 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.

  8. 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

COADF Engineering Companion 1.0 · non normatif · se rapporte à COADF Core 2.2

Droits de publication réservés. Aucune licence publique n'est accordée à ce jour pour le COADF Engineering Companion 1.0 ni pour ses exemples de référence.

Statut de propriété intellectuelle et de publication