ADR 036 — Le push direct sur develop reste ouvert aux Maintainers, EK-15 est accepté (2026-09-09)¶
Statut¶
Accepté, écrit le 2026-09-09. Issue #190 (constat EK-15 de l'audit, volet
EKS de l'action de remédiation 31), Sprint 7 (Remédiation & Fiabilité).
Cette ADR ne change aucun réglage. Elle acte que la correction demandée par l'issue #190 est impossible sur le plan GitLab Free, nomme la mesure qui le prouve, et dit où le garde-fou est déplacé.
Elle suit la forme de l'ADR 035 : accepter et documenter est une décision, pas une absence de décision.
Contexte¶
Ce que l'issue demandait¶
EK-15 mesure que only_allow_merge_if_pipeline_succeeds ne gouverne que les
fusions. Un git push direct sur develop, autorisé aux Maintainers, ne
passe par aucune demande de fusion, donc par aucune revue et par aucune
condition de pipeline.
Le corollaire est plus dur que PT-8 : une ressource entrée par Git est
connue d'ArgoCD, donc déployée, et selfHeal la recrée à chaque
suppression. La persistance devient le comportement nominal de l'outil.
L'issue demandait donc de passer le droit de push sur develop à No one,
comme main l'est déjà.
L'état réel des protections, mesuré le 2026-09-09¶
develop : push = Maintainers merge = Developers + Maintainers force push = non
main : push = No one merge = Maintainers force push = non
Les trois membres du projet, et pourquoi le rôle compte¶
| Compte | Rôle | Pourquoi ce rôle |
|---|---|---|
ykadi |
Owner | l'exploitant |
renovatebotyk |
Developer | ouvre des MR, ne pousse pas sur develop |
yk-gitops-bot |
Maintainer | c'est ce rôle qui lui permet de pousser le write-back sur develop |
Le write-back GitOps est le job update-image-tag : après un build, il écrit le
nouveau tag d'image dans k8s/base/kustomization.yaml et pousse sur
develop, où ArgoCD le lit. C'est le chemin de déploiement nominal du projet
depuis #72.
La mesure qui ferme la question¶
GitLab Free n'accepte que des rôles dans les règles de push d'une branche protégée, jamais un utilisateur nommé. Mesuré le 2026-08-29 :
PATCH /projects/:id/protected_branches/:name avec un user_id
→ 400 "Push access levels user must be blank"
Les seules valeurs acceptées sont No one, Developers + Maintainers et
Maintainers. Nommer un utilisateur est une fonction du plan Premium.
Les deux critères d'acceptation de l'issue #190 sont donc mutuellement exclusifs sur ce plan :
- «
developest en pushNo one» ; - « le write-back GitOps n'est pas cassé par le changement ».
Passer develop à No one bloque tout le monde, Owner compris, donc le
robot aussi. Il n'existe aucun réglage qui bloque l'humain sans bloquer le
robot.
Décision¶
Le droit de push sur develop reste Maintainers. EK-15 est accepté,
documenté, et sa surveillance déplacée. Quatre points.
1. Le constat est connu et accepté, il n'est pas ignoré¶
EK-15 est classé 🔵 Faible dans le rapport d'audit, et cette gravité est
cohérente avec la mesure : la porte extérieure est fermée. Une visibilité
publique sur GitLab donne la lecture et le clonage, jamais l'écriture. Le
chemin n'est ouvert qu'aux deux comptes qui portent un rôle suffisant.
2. Le blocage est une limite de plan, pas un arbitrage de confort¶
C'est ce qui distingue cette ADR d'un report. Il n'y a pas de version « propre mais coûteuse » de la correction qu'on choisirait de ne pas faire : sur Free, elle n'existe pas. La seule voie serait de payer Premium pour un constat de gravité faible.
3. Le garde-fou descend d'un cran, dans le cluster¶
EK-15 n'est que le maillon d'entrée de la chaîne de C-U (le contrôleur
ArgoCD est cluster-admin). Puisque ce maillon n'est pas verrouillable ici, la
remédiation porte sur les maillons suivants, qui eux le sont :
- sortir les namespaces de plateforme du niveau PSA
privileged(EK-3), ce qui casse la chaîne au maillon « pod privilégié montanthostPath /» ; - la détection à l'exécution (action 35, Falco ou Tetragon, non tranchée), qui verrait ce que ni le GitOps ni l'admission ne voient.
Les deux exigent un cluster monté, donc une séance live.
4. La décision est réévaluée si l'un de ces quatre faits change¶
- le projet passe à un plan GitLab qui accepte les utilisateurs nommés dans les règles de push ;
- un troisième compte humain entre dans le projet, ce qui change la nature du risque : aujourd'hui l'humain autorisé est l'exploitant lui-même ;
- le write-back GitOps cesse de pousser sur
develop(par exemple s'il passe par une MR automatique), ce qui rendraitNo oneapplicable sans casse ; C-Uest fermé côté cluster, ce qui retirerait àEK-15sa conséquence.
Conséquences¶
Ce qui ne change pas. Aucun réglage, aucun fichier d'infrastructure, aucun
pipeline. develop reste en push Maintainers, main en No one.
Ce qui change. Le constat quitte l'état status::blocked, où il attendait
une action qui n'arrivera pas. Il est tracé ici, avec sa mesure et ses
déclencheurs de réévaluation.
Ce qu'il faut retenir pour les prochains constats. Une issue dont les critères d'acceptation sont mutuellement exclusifs ne se ferme pas en cochant des cases : elle se ferme en nommant l'exclusion. Le piège aurait été de laisser
190 en blocked indéfiniment, ce qui donne l'apparence d'un suivi sans en¶
être un.
Alternatives écartées¶
A. Passer develop en push No one et faire pousser le robot ailleurs¶
Écartée pour l'instant. Elle est techniquement viable : le write-back ouvrirait une MR au lieu de pousser, et la fusion automatique la porterait. Mais elle transforme le chemin de déploiement nominal du projet, aujourd'hui exercé et fiable depuis #208, pour un constat de gravité faible. Elle redevient candidate au déclencheur 3 du point 4.
B. Payer un plan Premium¶
Écartée. Un plan payant pour lever un constat 🔵 Faible sur un projet portfolio n'est pas un arbitrage défendable. Il serait à réinstruire si le projet accueillait une équipe.
C. Laisser l'issue ouverte en status::blocked¶
Écartée, et c'est l'option qui motive cette ADR. Une issue bloquée sans échéance ni condition de déblocage écrite n'est pas un suivi, c'est un oubli qui se donne l'apparence d'un suivi. La même erreur est nommée dans l'ADR 035, alternative C.
Références¶
- Issue #190 — passer le droit de push sur
developàNo one(EK-15, action 31) - Constat
C-Udu rapport d'audit — le contrôleur ArgoCD estcluster-adminsur les deux clusters, et son maillon d'entrée est le dépôt Git - ADR 035 — le NACL large accepté : même forme de décision, un constat qu'on choisit de ne pas corriger, par écrit, avec ses déclencheurs de réévaluation
- ADR 031 — garde-fou de teardown : un contrôle qu'on choisit de ne pas rendre bloquant
- Rapport d'audit public — https://audit.devopsyouss.com