Article · 30 mars 2026 · 5 min de lecture

Du bricolage à la confiance : notre labo DevSecOps, reconstruit

La version un, c'était une semaine de travail, un pipeline, et beaucoup de bricolage. Elle prouvait le concept : du code entre, une image scannée sort, Argo CD la pose sur un cluster. La version deux, c'est la même petite app avec presque chaque couche en dessous remplacée, restructurée ou durcie. Voici ce qui a changé, et pourquoi.

Carte-titre Project DS v2 : une tête casquée sur un circuit imprimé.
Project DS v2. Le labo porte un nom parce que c'est un vrai projet, avec un repo, un backlog et des versions qui cassent.

L'app est un prétexte

Anchor est un planificateur de révisions espacées construit pour nous-mêmes : donnez-lui un sujet et une date de départ, il rend les dates exactes de révision (jour 0, puis 3, 7, 14, 30) avec un fichier calendrier. Quelques centaines de lignes de Streamlit. Elle compte ici pour une seule raison : c'est l'application que nous faisons passer dans le pipeline DevSecOps complet, de bout en bout, comme le serait le service d'un client.

L'app Anchor : un champ sujet, une date de départ, et le tableau des dates de révision.
Toute l'application. Deux champs, un tableau, deux boutons de téléchargement. Tout ce qui est intéressant se passe en dessous.

Ce qu'est le labo

Un pipeline GitLab qui construit, scanne, teste, déploie, surveille et annule une app conteneurisée sur trois environnements Kubernetes (dev, staging, production), sur un cluster k3s provisionné en Terraform. Rien ne vit dans un fichier monolithique : le repo applicatif porte son code et ses manifests, la logique de pipeline vit dans la même bibliothèque de composants publique qui déploie ce site, et la production est en GitOps : le pipeline commite un changement de version dans un repo de manifests, et Argo CD réconcilie le cluster. Git est la source de vérité de ce qui tourne.

Le répertoire components du repo components-ci, un fichier YAML par job.
Le pipeline lui-même : un fichier par job, aucun dans le repo applicatif. Un correctif dans rollback.yaml atterrit dans tous les projets qui l'incluent, ce site compris.

Le pipeline, étape par étape

Un graphe de pipeline GitLab : sept étapes, tous les jobs au vert.
Un run, sept étapes. Les icônes lecture sont les arrêts volontaires : pousser l'image, staging, production. Tout le reste a décidé seul.
Log du job de détection de secrets : gitleaks scanne le repo et ne trouve rien.
Gitleaks lit tout le dépôt avant la moindre couche Docker. 18,3 ms, aucune fuite. Une seule trouvaille et le run s'arrête ici.
Log du test de bout en bout Playwright : quatre étapes, un test passé en 1,63 seconde.
Pas d'approximation curl : Playwright ouvre le conteneur qui tourne dans Chromium et vérifie ce qu'une personne regarderait, jusqu'au bouton d'envoi.
Log du déploiement en production : le tag d'image est modifié dans le repo de manifests, puis poussé.
La production est un commit, pas un kubectl apply. Le job passe le tag de 1.5.0 à 1.6.0 dans le repo de manifests, pousse, et s'arrête. Argo CD fait le reste.

Ce qui a changé entre v1 et v2

L'instructif, c'est le pourquoi de chaque couche. GitHub Actions a cédé la place à GitLab pour le mécanisme d'include, le registre intégré et les portes manuelles natives. Le fichier de pipeline unique a été éclaté en composants réutilisables, parce qu'un correctif doit atterrir partout à la fois. Trivy a cédé la place à Grype après la découverte de vulnérabilités sérieuses dans le scanner lui-même : un rappel que suivre l'actualité et s'adapter fait partie du métier. Un registre Harbor auto-hébergé sur sa propre machine est devenu le registre GitLab fourni avec le projet : une machine de moins, une surface d'attaque de moins. Un environnement est devenu trois, chacun avec son health check et son rollback. L'absence de vérification post-déploiement est devenue des checks par sondage avec rollback automatique. Et un cluster aveugle a reçu l'opérateur Datadog : traces APM, santé des pods, et un dashboard.

Un dashboard Datadog pour l'app Anchor : nombre de pods, charge système, monitors, latence APM.
La fin des suppositions. Pods, charge, huit monitors et la latence par requête pour l'app que le pipeline a livrée dix minutes plus tôt.
La version un demandait : est-ce que j'arrive à câbler tout ça ? La version deux pose la seule question qui compte en production : est-ce que je peux m'y fier ?

Honnêtement, ce qui reste devant

Moteurs de politiques, gestion des secrets, métriques DORA, déploiements canary et un retour d'état Argo CD plus serré dans le pipeline sont encore sur la liste. L'objectif n'a pas bougé : une plateforme qu'on peut présenter, défendre et transmettre. La v2 s'en approche. Elle n'est pas finie, et le dire fait partie de la méthode.

Le code est public : gitlab.com/project-ds1/project-ds-v2. Et si vous hésitez entre un gros repo unique et une séparation précoce : séparez tôt. Le coût de l'extraction plus tard est toujours supérieur au coût d'un second repo maintenant.

La même forme, sur votre plateforme

Ce labo est la pratique derrière l'abonnement : composants partagés, health checks qui décident, rollbacks sans héros, et tout par écrit. Racontez-nous à quoi ressemble votre pipeline aujourd'hui.

Contactez-nous