L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
Une startup avec trois développeurs et un seul service n'a pas besoin de la
même architecture de pipeline qu'une banque avec 200 équipes et des centaines
de microservices. Le premier cas se pilote avec une pipeline unique qui
construit, teste et déploie ; le second exige de découper les dépôts, de
détecter les changements et de coordonner des dizaines de pipelines. Il
n'existe pas de « meilleure » pipeline, seulement celle qui correspond à votre
contexte.
Ce guide présente les grandes familles d'architectures de pipelines et leurs
compromis : stratégies de branches, monorepo vs polyrepo, promotion
vs rebuild et séparation application/infrastructure. L'objectif est de
vous donner les critères pour choisir la vôtre ou la faire évoluer.
Quand on parle d'« architecture de pipeline », on parle de comment organiser
l'ensemble de vos pipelines, pas du contenu d'une seule pipeline. Les questions clés sont :
Combien de pipelines avez-vous ? Une seule pour tout ? Une par service ?
Une par branche ?
Comment se déclenchent-elles ? À chaque commit ? Seulement sur certaines
branches ?
Comment les artefacts circulent-ils ? Reconstruits à chaque étape ? Promus
d'un environnement à l'autre ?
Ces choix dépendent de trois facteurs principaux :
Facteur
Questions à se poser
Structure d'équipe
Combien de développeurs ? Combien d'équipes ? Travaillent-elles sur le même code ?
Stratégie de branches
Utilisez-vous GitFlow avec plusieurs branches longues ? Ou tout le monde travaille sur main ?
Modèle de déploiement
Déployez-vous une fois par mois ou 50 fois par jour ? Avez-vous plusieurs versions en production ?
Glissez pour voir
Stratégies de branches : comment organiser votre code
Le principe : vous maintenez plusieurs branches « longues » qui vivent en
parallèle pendant des semaines ou des mois. Chaque branche a un rôle précis et
sa propre pipeline.
Les développeurs travaillent sur des branchesfeature/* (nouvelles fonctionnalités)
Ces branches sont mergées dans develop, une branche d'intégration
Quand on prépare une release, on crée une branche release/X.Y
Après validation, la release est mergée dans main (production)
Chaque branche longue a sa propre pipeline avec des comportements différents
Exemple de configuration :
Branche
Ce que fait la pipeline
feature/*
Tests unitaires, lint, analyse statique
develop
Tests + déploiement en environnement de développement
release/*
Tests complets + déploiement en staging + tests d'acceptance
main
Déploiement en production (souvent avec approbation manuelle)
Glissez pour voir
Avantages :
Séparation claire : chaque environnement correspond à une branche, c'est
facile à comprendre
Contrôle fin : vous décidez exactement ce qui va en production et quand
Versions parallèles : vous pouvez maintenir plusieurs versions en
production (1.0, 1.1, 2.0)
Inconvénients :
Complexité : plusieurs pipelines à maintenir, qui peuvent diverger
Merges douloureux : plus les branches vivent longtemps, plus les conflits
sont nombreux
Délai : entre l'écriture du code et sa mise en production, il peut se
passer des semaines
Contexte idéal : équipes avec des cycles de release planifiés (tous les
mois, tous les trimestres), produits avec plusieurs versions supportées en
parallèle (logiciels installés chez les clients, applications mobiles).
Trunk-based development : tout sur une seule branche
Le principe : tout le monde travaille directement sur la branche principale
(main ou trunk). Les branches de fonctionnalité existent, mais elles sont
très courtes, quelques heures, pas quelques jours.
Trunk-based development : les branches feature/a, feature/b et feature/c, qui vivent moins de 24 h, fusionnent dans main, qui déclenche la CI puis le déploiement en staging et en production.Durée : moins de 24 hfeature/afeature/bfeature/cmainCIstagingprod
Un développeur crée une branche feature/xxx depuis main
Il travaille quelques heures (rarement plus d'une journée)
Il ouvre une pull request, qui est revue rapidement
Dès que c'est mergé dans main, la pipeline se déclenche
Si tous les tests passent, le code peut partir en production automatiquement
La clé : les feature flags
Comment déployer du code en production s'il n'est pas terminé ? Grâce aux
feature flags (ou « feature toggles »), des interrupteurs dans le code qui
activent ou désactivent une fonctionnalité.
# Exemple simplifié de feature flag
if feature_flags.is_enabled("nouvelle_interface_paiement"):
afficher_nouvelle_interface()
else:
afficher_ancienne_interface()
Le code est en production, mais la fonctionnalité est « éteinte ». Quand elle est prête, on l'active pour quelques utilisateurs (canary), puis pour tout le monde.
Avantages :
Intégration continue vraie : le code est intégré plusieurs fois par jour,
pas une fois par semaine
Pas de « merge hell » : les branches courtes = peu de conflits
Feedback rapide : vous savez en quelques heures si votre code fonctionne
avec celui des autres
Inconvénients :
Discipline stricte : chaque commit sur main doit être de qualité
production
Feature flags obligatoires : infrastructure supplémentaire à gérer
Couverture de tests excellente requise : sans tests fiables, c'est le
chaos
Contexte idéal : équipes matures pratiquant le continuous deployment,
produits SaaS où une seule version est en production.
Le tableau confronte les deux modèles ligne par ligne. La ligne décisive est la
fréquence de merge : c'est elle qui détermine tout le reste. Des merges
espacés de plusieurs jours entraînent mécaniquement des branches longues, donc
des conflits, donc un besoin de tests moins pressant ; des merges pluriquotidiens
imposent les feature flags et une couverture de tests solide. Lisez d'abord
cette ligne, puis descendez.
Aspect
Pipeline par branche (GitFlow)
Trunk-based
Fréquence de merge
Jours ou semaines
Heures
Nombre de pipelines
Multiple (une par type de branche)
Une seule
Feature flags
Optionnels
Obligatoires
Risque de conflit Git
Élevé (branches longues)
Faible (branches courtes)
Temps jusqu'à la production
Jours ou semaines
Minutes ou heures
Complexité de la pipeline
Moyenne à élevée
Simple
Besoin en tests
Important
Critique
Glissez pour voir
Comment choisir ?
Vous livrez une fois par mois ou moins → GitFlow est acceptable
Vous livrez plusieurs fois par semaine → considérez trunk-based
Vous avez plusieurs versions en production → GitFlow est souvent
nécessaire
Vous faites du SaaS avec une seule version → trunk-based est plus adapté
Le principe : tous vos services, bibliothèques et outils partagent le même
dépôt Git. Google, Meta et Microsoft utilisent cette approche pour une grande
partie de leur code.
monorepo/
├── services/
│ ├── api/ # Service backend
│ ├── frontend/ # Application web
│ └── worker/ # Traitement asynchrone
├── libs/
│ ├── auth/ # Bibliothèque d'authentification
│ └── utils/ # Utilitaires partagés
└── infra/
├── terraform/ # Infrastructure as Code
└── k8s/ # Manifests Kubernetes
Le défi : ne pas tout reconstruire à chaque commit
Si quelqu'un modifie le README du frontend, inutile de reconstruire l'API. La
pipeline doit être « intelligente » et détecter ce qui a changé.
Peu d'organisations sont 100 % monorepo ou 100 % polyrepo. La plupart tranchent
type de code par type de code : les services métier gagnent au regroupement,
tandis que l'infrastructure et les bibliothèques diffusées largement suivent des
cycles de vie assez différents pour justifier leur propre dépôt. Le tableau
suivant résume ce découpage courant.
Type de code
Stratégie
Pourquoi
Services métier
Monorepo
Refactoring atomique, cohérence
Infrastructure
Repo séparé
Cycle de vie différent, permissions distinctes
Libs très partagées
Repos séparés + versioning
Réutilisation hors de l'organisation
Glissez pour voir
Exemple concret :
github.com/acme/platform # Monorepo : API + frontend + workers
Le principe : construire l'artefact une seule fois, puis le promouvoir
d'environnement en environnement sans le reconstruire.
Promotion d'artefact : l'image construite une fois par docker build -t app:abc12 est promue, identique, de dev à staging puis à prod.même imagemême imagemême imagebuilddocker build -t app:abc12devstagingprod
Jusqu'ici, on a surtout parlé des pipelines qui déploient du code applicatif
(API, frontend). Mais l'infrastructure aussi peut, et devrait, être gérée par des pipelines.
C'est celle que la plupart des équipes ont déjà : elle transforme un commit de code en version déployée. Ses caractéristiques découlent toutes du fait qu'elle
tourne souvent et n'affecte qu'un périmètre limité, ce qui autorise un feedback rapide et un risque contenu à chaque exécution.
Ce qu'elle déploie : le code de votre application, API, frontend, workers,
jobs.
Pipeline applicative : lint, test, build de l'image Docker, puis déploiement sur Kubernetes.linttestbuilddockerdeployk8s
Elle applique les changements décrits en Infrastructure as Code et se
distingue par l'inverse de la précédente : elle tourne rarement mais son rayon d'impact est large, puisqu'une seule modification peut toucher tous les services
hébergés. C'est cette asymétrie qui justifie de la traiter à part, avec ses
propres garde-fous et ses propres approbations.
Ce qu'elle déploie : les ressources sur lesquelles tourne votre application,
réseaux, bases de données, clusters, DNS.
Le tableau met les deux options en balance. La séparation limite le rayon
d'impact et garde des permissions distinctes ; une pipeline unique gagne
l'atomicité, au prix de la complexité et d'un risque élevé en cas d'échec.
Recommandation : séparez les pipelines, mais coordonnez-les.
L'infrastructure change moins souvent que le code. Mélanger les deux crée des pipelines lourdes où un changement de couleur de bouton déclenche une vérification Terraform.
Comment coordonner ?
Triggers : la pipeline infra déclenche la pipeline app après succès
GitOps : des outils comme ArgoCD ou Flux détectent les changements et
déploient
Dépendances explicites : la pipeline app vérifie que l'infra est à jour
avant de déployer
Le principe : exécuter un maximum de jobs en parallèle, puis reconverger
avant l'étape suivante.
Pourquoi « diamant » ? La forme du graphe ressemble à un diamant : un point
de départ, une divergence (parallélisation), une convergence, puis à nouveau
divergence/convergence.
Pipeline en diamant : checkout diverge vers lint, test et scan en parallèle, qui convergent vers build ; build diverge à son tour vers les déploiements dev, staging et prod, staging portant une approbation.checkoutlinttestscanbuilddevstagingprod(approbation)
Le problème : votre bibliothèque doit fonctionner avec Python 3.11, 3.12,
3.13 et 3.14, sur Ubuntu, macOS et Windows. Ça fait 12 combinaisons à tester.
La solution : la matrix génère automatiquement tous les jobs.
test:
strategy:
matrix:
# Versions quotées : sans guillemets, YAML lit 3.10 comme le nombre 3.1
python: ["3.11", "3.12", "3.13", "3.14"]
os: [ubuntu-24.04, macos-26, windows-2025]
# Résultat : 4 versions × 3 OS = 12 jobs parallèles
Deux détails de cet extrait évitent des pannes discrètes. Les versions
sont entre guillemets, parce que YAML lit 3.10 comme le nombre 3.1, et la
matrice testerait alors une version qui n'existe pas. Les systèmes sont
nommés par leur version (macos-26, windows-2025) plutôt que par une
étiquette -latest, qui change de cible sans prévenir et rend un échec
difficile à reproduire.
Cas d'usage :
Bibliothèques open source (compatibilité multi-versions)
Applications desktop (multi-OS)
Validation de compatibilité avant une mise à jour de dépendance
Pipeline conditionnelle : adapter selon le contexte
Le nombre d'équipes qui partagent le code détermine surtout le choix
monorepo ou polyrepo. Tant qu'une seule équipe touche l'ensemble, un
monorepo reste simple à outiller. Au-delà de quelques équipes, soit vous investissez dans un outil de build incrémental, soit vous découpez en dépôts autonomes pour rendre les équipes indépendantes.
Situation
Recommandation
1 équipe (< 10 personnes)
Monorepo simple, trunk-based possible
2-5 équipes
Monorepo avec outillage (Nx, Turborepo) ou polyrepo léger
10+ équipes
Polyrepo probable, ou monorepo avec infrastructure dédiée
La cadence de déploiement tranche entre GitFlow et trunk-based. Plus vous livrez souvent, moins les branches longues sont tenables : le coût des merges finit par dépasser le bénéfice du contrôle qu'elles apportent. À partir du
rythme hebdomadaire, la promotion d'artefact cesse d'être un confort pour
devenir une nécessité, sous peine de déployer un binaire différent de celui
qui a été testé.
Cette question est souvent la plus contraignante, car elle ne dépend pas de vos
préférences mais de votre produit. Un logiciel installé chez le client ou une
application mobile impose de maintenir plusieurs versions en parallèle, donc
des branches de release et des pipelines par branche. Un SaaS où tous les
utilisateurs sont sur la même version lève cette contrainte et ouvre la voie au
trunk-based.
La maturité des tests agit comme un garde-fou sur tout ce qui précède. Le trunk-based et le déploiement continu ne fonctionnent que si vos tests automatisés attrapent réellement les régressions ; sinon, chaque merge sur
main devient un pari. Soyez honnête sur ce point : investir dans la couverture
de tests avant d'accélérer les déploiements évite de transformer une pipeline
rapide en distributeur d'incidents.
Niveau
Recommandation
Peu ou pas de tests automatisés
Restez sur des pipelines simples, investissez dans les tests d'abord
« Netflix fait du trunk-based avec continuous deployment, on devrait faire
pareil ! »
Non. Une entreprise de cette taille réunit quatre conditions qui rendent
ce modèle soutenable : des équipes entières dédiées à l'outillage, des
années d'itération sur ses pratiques, une infrastructure de tests et de feature
flags mature, et un contexte SaaS avec une seule version en production.
Copier son architecture sans reproduire ces quatre conditions, c'est hériter de la complexité sans le socle qui la rend soutenable : des pipelines fragiles, des déploiements ratés et une équipe qui passe son temps à réparer l'outillage
au lieu de livrer.
La bonne approche :
Commencez simple : une pipeline linéaire qui build, teste, déploie
Identifiez les douleurs : qu'est-ce qui vous ralentit vraiment ?
Évoluez progressivement : ajoutez de la complexité quand vous en avez
besoin
Mesurez : temps de pipeline, fréquence de déploiement, taux d'échec
L'architecture de pipeline reflète votre contexte : structure d'équipe,
stratégie de branches, modèle de déploiement. Il n'y a pas de solution
universelle.
Trunk-based vs GitFlow : branches courtes = moins de conflits et feedback rapide, mais demande discipline et feature flags. Branches longues = plus de
contrôle, mais merges douloureux.
Monorepo vs polyrepo : monorepo facilite le refactoring et la cohérence,
mais demande de l'outillage. Polyrepo donne de l'autonomie, mais complique la
coordination.
Promotion > rebuild : construisez l'artefact une fois, déployez-le
partout. Ce que vous testez doit être exactement ce que vous déployez.
Séparez app et infra : des cycles différents, des permissions
différentes, des risques différents. Coordonnez, mais ne mélangez pas.
Commencez simple, complexifiez quand nécessaire : la pipeline parfaite
n'existe pas au jour 1. Itérez en fonction des problèmes réels.
Vérifiez que l'essentiel de cette leçon est acquis. Les questions portent
uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
6 questions
6 min.
70% requis
Informations
Le chronomètre démarre au clic sur Démarrer
Questions à choix multiples, vrai/faux et réponses courtes
Vous pouvez naviguer entre les questions
Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
⏱️--:--
0 / 6
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.