DevOps
Industrialiser une chaîne de livraison et passer au GitOps sans tout casser
Une chaîne de livraison utile n'est pas celle qui compte le plus d'étapes, mais celle qui répond le plus vite à une question simple : ce changement est-il bon ? Voici comment nous la reconstruisons, puis comment nous basculons le déploiement en GitOps.
La plupart des chaînes de livraison que nous auditons ont le même profil : quarante minutes de compilation et de tests, un taux d'échec élevé, et une mise en production manuelle qui concentre tout le risque. La reconstruction commence toujours par une mesure, jamais par un outil.
Étape 1 : mesurer avant de toucher
Nous relevons quatre chiffres sur les trente dernières exécutions : durée totale, durée d'attente avant démarrage, taux d'échec, et part des échecs attribuables à l'infrastructure plutôt qu'au code. Ce dernier point est souvent révélateur : quand un tiers des échecs vient de l'environnement, corriger les tests ne sert à rien.
- Durée totale et durée d'attente avant démarrage.
- Taux d'échec global, et part liée à l'infrastructure.
- Temps moyen de correction après un échec détecté.
- Nombre de versions déployées capables d'être reconstruites à l'identique.
Étape 2 : découper le pipeline par objectifs
Un pipeline utile se lit comme une séquence de questions. Chaque étape répond à une question unique, et son échec doit être compréhensible par la personne qui doit corriger, sans consulter un journal de mille lignes.
| Étape | Question à laquelle elle répond | Durée cible | Bloquante |
|---|---|---|---|
| Compilation | Le code se construit-il ? | Moins d'une minute | Oui |
| Tests unitaires | Les règles métier tiennent-elles ? | Moins de trois minutes | Oui |
| Analyse statique | Des points sensibles sont-ils introduits ? | Moins de deux minutes | Oui sur les seuils définis |
| Tests d'intégration | L'application fonctionne-t-elle avec ses dépendances réelles ? | Moins de huit minutes | Oui |
| Tests de bout en bout | Les parcours critiques fonctionnent-ils ? | Moins de dix minutes | Oui sur les parcours critiques |
| Publication d'image | L'artefact est-il versionné et signé ? | Moins de trois minutes | Oui |
Le piège de l'étape fourre-tout
Beaucoup de chaînes accumulent les vérifications dans une seule étape, ce qui rend l'échec illisible et empêche toute parallélisation. Séparer les étapes permet de lancer les tests unitaires, l'analyse statique et la construction d'image en parallèle, puis de n'exécuter les tests lourds qu'après validation des vérifications rapides.
Étape 3 : rendre la version déployée vérifiable
Un déploiement ne devrait jamais reposer sur une supposition. Nous exposons la version construite et l'horodatage de construction dans un point d'entrée technique, interrogé automatiquement après chaque déploiement.
@RestController
class VersionController {
private final BuildProperties buildProperties;
VersionController(BuildProperties buildProperties) {
this.buildProperties = buildProperties;
}
@GetMapping("/internal/version")
VersionResponse version() {
String time = buildProperties.getTime() == null
? "unknown"
: buildProperties.getTime().toString();
return new VersionResponse(buildProperties.getVersion(), time);
}
}
Ce point d'entrée peut sembler anecdotique : il est en réalité la condition d'un diagnostic rapide. Sans lui, savoir quelle version tourne réellement sur un environnement demande de consulter un registre, un tableau de bord et parfois le journal d'un conteneur.
Étape 4 : basculer le déploiement en GitOps
Le GitOps déplace la question du déploiement : on n'applique plus des commandes, on décrit un état attendu. Le dépôt de configuration devient la source de vérité, et tout écart constaté sur le cluster est une anomalie à expliquer.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: billing-api-staging
namespace: argocd
spec:
project: default
source:
repoURL: https://example.com/git/platform-config
targetRevision: main
path: environments/staging/billing-api
destination:
server: https://kubernetes.default.svc
namespace: billing
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=false
Le retour arrière devient une opération ordinaire : on revient à la révision précédente du dépôt de configuration. Cette simplicité a une condition : les migrations de base de données doivent rester compatibles avec la version précédente du code pendant au moins une livraison.
Une chaîne de livraison se juge au temps qu'il faut pour savoir qu'un changement est mauvais, pas au nombre d'étapes qu'elle contient.
Étape 5 : entraîner l'équipe sur un cas réel
La dernière étape consiste à provoquer volontairement une panne en environnement de recette : image défectueuse, migration incompatible, dépendance indisponible. L'équipe exécute le retour arrière, puis nous corrigeons la documentation en fonction de ce qui a réellement été nécessaire. Cette séance révèle en général deux ou trois procédures manquantes que personne n'avait identifiées.
Ce qu'il faut retenir
L'industrialisation d'une chaîne de livraison n'est pas un projet d'outillage : c'est un travail de réduction du délai de retour d'information. Commencez par la mesure, découpez par question, rendez la version déployée vérifiable, puis basculez le déploiement en GitOps. Le reste suit naturellement.
Articles associes
Observabilité avec OpenTelemetry : instrumenter ce qui sert vraiment au diagnostic
Ajouter une bibliothèque de traces ne rend pas un système observable. Ce qui compte, c'est le choix des attributs, la propagation du contexte et la discipline sur les volumes stockés.