Cursus
Il est essentiel de disposer de stratégies efficaces de branchement Git pour gérer la complexité du développement logiciel. Cet article examine les avantages et les inconvénients des stratégies de branchement couramment utilisées afin de vous aider à mettre en œuvre la stratégie de branchement la mieux adaptée à votre équipe.
Pour obtenir une vue d'ensemble de Git, je vous recommande les ressources suivantes de DataCamp :
Quelles sont les stratégies de branchement Git ?
Les équipes utilisent différentes stratégies pour gérer la complexité du développement logiciel. Chaque approche équilibre stabilité et flexibilité, en fonction de la tolérance au risque de l'équipe, des exigences réglementaires et des compromis entre développement rapide et fiabilité à long terme.
Le rôle des succursales dans le développement collaboratif
Afin de permettre un développement parallèle et de maintenir la stabilité du code principal, les équipes ont recours à une stratégie de branchement. Avec la ramification, chaque développeur travaille localement dans une branche distincte, en se concentrant sur une tâche spécifique.
La ramification permet un développement parallèle afin que les développeurs puissent travailler sur différentes parties du code indépendamment les uns des autres sans écraser leur travail mutuel. Il simplifie également la révision du code en isolant chaque modification. Si quelque chose perturbe le code, les équipes peuvent revenir à une version précédente.
Archétypes de ramification de base
Il existe deux principaux types de branches : persistantes et éphémères.
Les branches persistantes ont une longue durée de vie. Ils soutiennent la promotion structurée du code par le biais d'environnements tels que dev, staging et production. Ils contiennent un code stable et partagé qui reflète l'état du projet à des étapes clés.
Les branches éphémères ont une durée de vie limitée et se concentrent sur des tâches de développement spécifiques. Les développeurs les créent à partir d'une branche persistante et les suppriment après la fusion. Il peut s'agir, par exemple, de branches de fonctionnalités pour de nouvelles fonctionnalités, de correctifs pour des réparations d'urgence et de branches de correction de bogues pour des défauts isolés.
Pour plus d'informations sur le fonctionnement des branches Git, veuillez consulter les tutoriels suivants :
- Changement de branche Git : Un guide avec des exemples pratiques
- Git Checkout Branche distante : Guide étape par étape
- Cloner la branche Git : Un tutoriel étape par étape
- Sélectionner une version Git : Comment sélectionner et appliquer des commits spécifiques
- Renommer une branche Git : Comment renommer une branche locale ou distante
- Comment cloner une branche spécifique dans Git
- Force de traction Git : Comment remplacer une branche locale par une branche distante
- Supprimer une branche Git : Comment supprimer des branches locales et distantes
Principales stratégies de ramification
La flexibilité de Git implique qu'il n'existe pas de workflow standard unique. Au lieu de cela, plusieurs stratégies de ramification concurrentes sont utilisées, chacune présentant ses propres avantages et défis. Je vais vous présenter ici les approches les plus courantes : le workflow par branches de fonctionnalités, GitFlow, GitHub Flow, le développement basé sur le tronc et GitLab Flow.
Workflow des branches de fonctionnalités
Dans le workflow des branches de fonctionnalités, les développeurs créent une branche dédiée pour chaque fonctionnalité. L'isolation du travail dans des branches distinctes évite les conflits de code et empêche le code instable d'atteindre la branche d'main, qui représente l'historique officiel du projet.
Ce flux de travail repose sur les demandes d'extraction (PR). Après avoir poussé une branche, le développeur ouvre une PR pour demander la révision et l'approbation d'un collègue avant que la branche ne soit fusionnée dans l'main. Ce processus favorise la collaboration et contribue à maintenir la qualité du code.
L'intégration continue (CI) est une pratique de développement dans laquelle les modifications apportées au code sont automatiquement testées et validées lors de leur fusion. Si le code échoue à un test ou enfreint les normes, le système bloque la fusion afin de protéger la base de code partagée. Avec la livraison continue (CD), chaque modification de code est automatiquement préparée pour le déploiement. Ensemble, le CD et le CI permettent aux équipes d'avoir la certitude que leurs modifications sont fiables et prêtes à être mises en production.
Avantages et défis
L'approche du workflow par branche de fonctionnalités permet de créer un historique de code clair et modulaire. Les PR garantissent la révision par les pairs et favorisent le partage des connaissances au sein de l'équipe. Si une modification perturbe le fonctionnement du code existant, les équipes peuvent revenir en arrière sans affecter le reste du code.
L'intégration continue vérifie automatiquement une branche avant sa fusion, ce qui réduit le risque de bogues en production.
Cependant, ce flux de travail présente des défis. Si les réviseurs ne sont pas disponibles, les PR peuvent rester inactifs et retarder la progression. Les branches de fonctionnalités à longue durée de vie risquent de s'éloigner de l'main, ce qui augmente le risque de conflits de fusion. Par rapport à d'autres stratégies, telles que la méthode trunk-based ou GitHub Flow (décrite ci-dessous), cette stratégie peut ralentir les temps d'itération.
Scénarios courants
Cette stratégie est particulièrement efficace pour les équipes de taille moyenne et les projets open source qui nécessitent une révision et une collaboration structurées.
- Contributeurs indépendants. Les développeurs travaillent de manière indépendante sans interférer avec les autres développeurs. C'est idéal pour les équipes réparties sur plusieurs fuseaux horaires ou les contributeurs open source travaillant de manière asynchrone.
- Développement modulaire. Isoler chaque fonctionnalité ou correction dans sa propre branche réduit la portée des modifications et simplifie les tests. Les équipes peuvent revenir en arrière sur une fonctionnalité si nécessaire.
- Assurance qualité constante. Les revues PR et les vérifications CI fournissent des garanties de qualité légères qui permettent de détecter les problèmes avant leur intégration dans l'
main. - Culture de l'évaluation par les pairs. Grâce aux PR, les développeurs partagent la propriété du code et transfèrent leurs connaissances. Les équipes améliorent la qualité en appliquant des normes collectives.
- Nettoyez vos dépôts. Les branches de fonctionnalités éphémères évitent l'encombrement et permettent de garder le dépôt organisé. La branche
mainconserve un historique clair et lisible.
GitFlow
GitFlow prend en charge le développement logiciel structuré en plusieurs étapes à l'aide d'un ensemble prédéfini de branches persistantes et éphémères.
Il existe trois branches persistantes.
- La branche
maincontient le code prêt pour la production. Les équipes l'étiquettent pour les versions (par exemple, v2.0.1) et configurent souvent des pipelines CD pour le déployer automatiquement. - La branche
developsert de branche d'intégration. Les développeurs fusionnent les branches de fonctionnalités terminées dans l'develop, pour la mise en attente et les tests. - Une branche d'
release/*ation met en scène le code pour la mise en production. Les équipes créent une branche à partir derelease/*surdevelopafin de stabiliser une version avant sa publication. Seules les corrections de bogues, les mises à jour de la documentation et les modifications finales liées à l'assurance qualité sont autorisées dans une branche de publication.
Il existe également des branches éphémères.
- Une branche d'
feature/*isole le travail nécessaire à la création d'une nouvelle fonctionnalité, d'une amélioration ou d'une expérimentation. Un développeur crée une branche d'feature/*à partir dedevelop, y travaille de manière indépendante, puis fusionne les modifications après révision et test. Ils suppriment ensuite la branche. - Une branche d'
hotfix/*, est une correction d'urgence apportée à l'mainafin de résoudre des problèmes critiques en production. Les développeurs créent une branche telle quemain, corrigent les problèmes, fusionnent les modifications dansmain(pour le déploiement) et dansdevelop(pour la synchronisation), puis procèdent immédiatement au déploiement. Ils suppriment la branche après la fusion.
Flux de travail Gitflow
- Veuillez créer une branche «
feature/*» à partir de «develop». - Veuillez travailler sur cette fonctionnalité.
- Fusionner la branche de fonctionnalité dans l'
develop. - Lorsque vous êtes prêt à publier, veuillez créer une branche
release/*à partir dedevelop. - Finalisez la version dans la branche
release/*. - Veuillez fusionner cette version dans les deux fichiers
mainetdevelop. - Veuillez marquer la version sur
mainpour la gestion des versions.
Avantages et défis
Comme toute stratégie de branchement, GitFlow présente des avantages et des inconvénients. En termes d'avantages, il prend en charge le développement et le déploiement par étapes grâce à ses branches develop, release et main. Il conserve l'historique des fusions, ce qui facilite l'audit et la restauration.
Il est particulièrement adapté au développement parallèle, car sa structure favorise des processus de développement isolés et vérifiables. Les équipes peuvent déployer des correctifs sur la production sans perturber les modifications non publiées.
Cependant, GitFlow peut ralentir la vitesse de publication en nécessitant la promotion manuelle du code. La réintégration des correctifs dans l'develop ajoute une charge supplémentaire et peut entraîner des modifications. La fusion de plusieurs branches augmente la complexité du pipeline et rend l'automatisation plus difficile.
Selon Atlassian, GitFlow est une stratégie obsolète (dépréciée) qui a été remplacée par les workflows basés sur le tronc.
Flux GitHub
GitHub Flow est une stratégie de branchement légère conçue pour un développement rapide et itératif. Il convient particulièrement aux projets qui privilégient la rapidité et la simplicité.
Son processus est simple. Un développeur crée une branche de fonctionnalité à partir de la branche main, développe la fonctionnalité, ouvre une PR, la fusionne dans main après révision et approbation, puis supprime la branche. Cela permet de maintenir un processus simple et continu.
Avantages et défis
Le principal avantage de cette approche réside dans sa simplicité. Les équipes ne gèrent qu'une seule branche persistante, main. Il n'est pas nécessaire de promouvoir le code dans plusieurs environnements. Cette structure favorise les retours rapides et les déploiements fréquents.
GitHub Flow présente également des limites. Il ne prend pas explicitement en charge la mise en scène ou la promotion d'environnements, ce qui complique la gestion des déploiements en plusieurs étapes.
Étant donné que les modifications sont directement intégrées dans le code principal sans passer par des branches intermédiaires, le risque d'incomplétude ou de dysfonctionnement du code est plus élevé. Si les processus de test ou de révision sont insuffisants, des codes défectueux peuvent rapidement atteindre la phase de production. Cette fonctionnalité rend GitHub Flow peu adapté aux environnements réglementés, où les approbations manuelles et les pistes d'audit sont essentielles.
Cela nécessite également une discipline CI/CD rigoureuse, dans laquelle chaque PR est examiné et testé avant fusion. Les équipes doivent avoir la certitude que l'main reste stable et prête pour la production.
Scénarios courants
GitHub Flow est efficace dans plusieurs scénarios courants. Il convient aux environnements de déploiement continu dans lesquels chaque PR est automatiquement testé et déployé après fusion. Il convient également aux équipes disposant de tests automatisés performants, en particulier lorsque les tests unitaires, d'intégration et d'interface utilisateur sont fiables et rapides.
Pour les applications Web, il prend en charge les modifications fréquentes et incrémentielles qui réduisent les risques liés au déploiement. Les petites et moyennes équipes bénéficient d'un modèle de ramification simple qui réduit les coûts de coordination. Ses fonctionnalités intégrées de relations publiques et de protection des branches facilitent l'application des politiques sans nécessiter d'outils supplémentaires ni de complexité.
Développement basé sur le tronc
Dans le développement basé sur le tronc, tous les développeurs partagent une seule branche persistante, main. Si les développeurs utilisent des branches de fonctionnalités, ils les gardent de courte durée, seulement quelques heures ou une journée. Les développeurs fusionnent fréquemment et résolvent les conflits rapidement. Ils masquent les tâches inachevées à l'aide de boutons de publication.
Un pipeline CI/CD robuste construit, teste et vérifie automatiquement chaque commit. Cela garantit la stabilité et la disponibilité de l'main. Si un problème survient, l'équipe peut rapidement annuler les modifications.
Déploiement indépendant de la mise en service
Le développement basé sur le tronc dissocie le déploiement de la publication. La fusion d'une fonctionnalité ne la rend pas active par défaut. Au lieu de cela, les équipes contrôlent l'exposition grâce à des boutons de basculement, des déploiements canaris et des tests A/B.
Les boutons bascules de publication permettent aux équipes d'activer ou de désactiver des fonctionnalités lors de l'exécution sans avoir à procéder à un nouveau déploiement. Cela leur permet de dissimuler du code incomplet ou à haut risque, même après son déploiement.
Les déploiements Canary publient d'abord les modifications auprès d'un petit pourcentage d'utilisateurs. Si le déploiement se déroule sans problème, l'équipe pourra le généraliser. En cas de problèmes, l'équipe peut interrompre ou annuler le déploiement.
Dans le cadre d'un test A/B, l'équipe présente différentes variantes d'une fonctionnalité à différents groupes d'utilisateurs. Cela leur permet de comparer les performances ou le comportement des utilisateurs avant de s'engager dans une version complète.
Résoudre les conflits de fusion
Afin d'éviter les conflits de fusion ou de les détecter rapidement, les équipes doivent suivre des pratiques spécifiques.
- Fusions fréquentes. Afin de synchroniser les branches, les développeurs intègrent les modifications dans l'
main, plusieurs fois par jour. Cela évite que les branches ne se désynchronisent et limite les divergences de code. - Branches de courte durée. Les branches petites et ciblées sont moins susceptibles de se chevaucher avec d'autres et sont plus faciles à fusionner.
- Clarification de la propriété du code. Les équipes doivent attribuer les responsabilités pour les différentes parties du code. Cela permet d'éviter que plusieurs développeurs modifient le même fichier en même temps.
- Communiquez de manière active. Coordonnez le travail à l'aide de code partagé ou sur des chemins critiques.
- Pratiques CI/CD. Les pipelines automatisés doivent créer et tester chaque commit et chaque fusion afin de garantir que les conflits ou les régressions sont détectés rapidement.
Avantages et défis
Réduire les conflits de fusion présente plusieurs avantages : les équipes consacrent moins de temps aux retouches, les cycles de développement sont plus rapides, la coordination s'améliore et la qualité du code reste élevée.
Cependant, la mise en œuvre de cette stratégie comporte des défis. Étant donné que toutes les validations sont directement envoyées à main, tout bug qui passe les tests automatisés sera détecté en production. Par conséquent, une couverture complète des tests automatisés est essentielle.
Les indicateurs de fonctionnalité sont essentiels pour masquer les travaux incomplets. Cela ajoute à la complexité. La gestion des bascules entre les environnements et les équipes peut être source d'erreurs en l'absence de directives claires.
Cette stratégie nécessite également un changement culturel. Les équipes doivent faire preuve d'une coordination rigoureuse, d'une discipline stricte et d'une réactivité rapide. Il est essentiel que chacun s'engage fréquemment, révise rapidement et considère l'main comme prête pour la production.
Flux GitLab
GitLab Flow combine des concepts issus de GitFlow, GitHub Flow et des workflows basés sur l'environnement. Il aligne les branches avec les environnements. Il est particulièrement adapté aux équipes qui gèrent plusieurs environnements ou des déploiements réglementés.
Dans GitLab Flow, les équipes utilisent des branches persistantes qui correspondent aux environnements de déploiement, telles que dev, staging et main. Les développeurs créent des branches de fonctionnalités éphémères à partir d'une branche d'environnement, généralement dev.
devUn chemin d'accès type redirige vers feature/*, puis vers staging et enfin vers main, reflétant ainsi la séquence de déploiement réelle. Les demandes de fusion (MR) sont utilisées à chaque étape pour garantir la révision du code, les tests automatisés et les approbations manuelles lorsque nécessaire. Les équipes marquent les commits stables pour les versions, ce qui facilite la restauration, la traçabilité et la reproductibilité.
Avantages et défis
GitLab Flow offre de nombreux avantages. Chaque branche persistante correspond à une étape de déploiement, ce qui offre une visibilité claire sur l'emplacement de chaque modification. Les équipes favorisent les changements étape par étape grâce à des branches qui reflètent les environnements, ce qui réduit les risques et permet des déploiements progressifs. Cette structure favorise une forte auditabilité, particulièrement utile dans les environnements réglementés ou soumis à des exigences de conformité élevées.
GitLab Flow présente également des défis. L'utilisation de plusieurs branches persistantes augmente la complexité des branches. La coordination des fusions peut ralentir la progression, en particulier pour les équipes qui gèrent des fusions fréquentes entre les différentes branches de l'environnement. Sans tests minutieux, ce flux peut entraîner des conflits de fusion ou des divergences entre les bases de code.
La promotion manuelle entre les environnements ajoute une charge supplémentaire. Cela ralentit l'itération et réduit la vitesse de développement. Le débogage devient plus complexe. Lorsque des défaillances de production surviennent, il peut être difficile de déterminer quelle validation ou fusion est à l'origine du problème, en particulier si les modifications ont été apportées à plusieurs branches.
Enfin, cette stratégie est particulièrement lourde, surtout pour les petites équipes ou les développeurs indépendants. La charge administrative liée à la gestion de plusieurs branches et demandes de fusion peut l'emporter sur les avantages dans le cadre de projets évoluant rapidement.
Exemple
Supposons qu'une application existe et nécessite une interface utilisateur de connexion. Un développeur utilisant le flux GitLab peut utiliser le workflow suivant.
- Un développeur crée l'
feature/login-uià partir de la branchedev. - Le développeur termine la fonctionnalité et ouvre une MR vers la branche
dev. - Le système CD/CI exécute des tests. Le code est examiné, approuvé et fusionné.
- Le développeur ouvre une MR vers la branche
stagingafin de passer à la phase d'assurance qualité. - Après validation, le développeur ouvre une demande de modification (MR) à l'adresse
mainpour le déploiement.
Microservices
Chaque branche Git est directement mappée à un environnement de déploiement. La fusion dans dev, staging ou main déclenche un déploiement vers l'environnement correspondant. Cette configuration permet aux équipes de déterminer quelle version d'un service est exécutée dans chaque environnement, de suivre la progression vers la publication et de promouvoir le code selon une séquence contrôlée. Il fournit également un historique clair des déploiements et simplifie les opérations de restauration.
Le modèle « en amont d'abord » reflète la promotion des services par le biais des environnements. Les équipes créent une image de conteneur à partir d'une branche de fonctionnalités, la testent dans dev, la transfèrent vers staging et la fusionnent dans main pour la production. Chaque fusion représente une étape contrôlée dans le processus de publication. Cette structure offre une traçabilité claire et aligne les modifications du code sur le flux de déploiement.
GitLab Flow prend en charge les configurations multi-référentiels et monoréférentiels. Dans un modèle multi-référentiel, chaque microservice dispose de son propre référentiel, avec des branches d'environnement dédiées et un pipeline CI/CD distinct. Dans un monorepo, tous les microservices résident dans un seul dépôt.
GitLab CI permet aux équipes de définir des pipelines segmentés qui ne se déclenchent que pour les services concernés par un changement. Cette flexibilité permet à GitLab Flow de s'adapter à des bases de code volumineuses et de prendre en charge des équipes indépendantes.
GitLab Flow s'intègre aux outils d'observabilité et de suivi du déploiement de GitLab pour offrir une visibilité totale sur l'état de chaque service. Le tableau de bord Environnements indique quel commit est déployé dans chaque environnement, ce qui facilite le suivi de l'exécution de chaque service. Les équipes peuvent consulter l'historique des déploiements, identifier qui a approuvé chaque modification et suivre les restaurations. GitLab affiche également des indicateurs clés de performance tels que la fréquence de déploiement et le délai d'exécution des modifications. Lorsque les équipes gèrent des dizaines de services déployés indépendamment, cette visibilité leur permet de coordonner efficacement leurs efforts.
Il existe également des défis à relever. La coordination entre les services peut s'avérer complexe. Les équipes qui gèrent des dizaines de microservices peuvent rencontrer des difficultés pour promouvoir les changements de manière cohérente via l'dev, l'staging et l'main. Cela nécessite une planification minutieuse et une communication efficace.
Ce flux de travail augmente également la charge cognitive. Les développeurs doivent respecter la discipline en matière de balisage des versions, de dénomination des branches et de synchronisation des fusions. Sans cohérence, les équipes risquent la dérive, des déploiements incohérents et un débogage difficile.
Déploiements réglementés
Pistes d'audit et conformité
GitLab Flow fournit des pistes d'audit claires pour une traçabilité de bout en bout. Chaque modification est enregistrée, avec mention de la personne qui l'a proposée, de celle qui l'a examinée et de l'historique des discussions. L'historique des commits enregistre le code exact, les horodatages et les auteurs. Les versions marquées indiquent des points stables dans le référentiel, reliant les déploiements à des ensembles de modifications spécifiques et traçables.
Contrôles et approbations
Les équipes appliquent des branches protégées et des approbations manuelles afin de garder le contrôle sur les modifications.
- Les branches protégées empêchent les modifications directes : chaque modification doit passer par un processus de révision formel.
- Les demandes de fusion (MR) doivent être approuvées par un réviseur avant d'être fusionnées, afin de garantir la séparation des tâches. Ces contrôles garantissent que seul le code vérifié et approuvé est utilisé en production.
Déploiements dans l'environnement
Chaque environnement (développement, préproduction et production) est associé à une branche dédiée. Les règles de promotion, qu'elles soient automatiques ou manuelles, déterminent comment le code passe d'un environnement à l'autre. Cette progression contrôlée valide les changements à chaque étape, réduisant ainsi le risque que des problèmes surviennent en production.
Défis et frais généraux
Cette approche implique une charge de travail supplémentaire importante.
- Les équipes doivent coordonner et maintenir plusieurs branches d'environnement persistantes.
- Chaque modification nécessite des étapes administratives, notamment des MR, le balisage et la promotion.
- Les approbations manuelles peuvent ralentir la progression et créer des goulots d'étranglement. Le suivi de l'état du déploiement ajoute également une charge opérationnelle.
Gouvernance et formation
Ce modèle exige une gouvernance solide. Les équipes doivent respecter une nomenclature cohérente pour les branches, les pratiques de fusion et les workflows de promotion. Les développeurs doivent maîtriser les fonctionnalités CI/CD de GitLab, et l'intégration doit garantir que les nouveaux membres de l'équipe comprennent les politiques afin d'éviter les incohérences et les erreurs.
Considérations relatives à la mise en œuvre stratégique
Pour tirer le meilleur parti d'une stratégie de branchement, les équipes doivent mettre en œuvre des pratiques de soutien en matière de nommage, d'automatisation et de gouvernance. Cette section présente les meilleures pratiques pour intégrer des workflows de branchement dans des workflows et des pipelines CI/CD.
Conventions de dénomination des succursales
L'utilisation de conventions de nommage cohérentes pour les branches aide votre équipe de plusieurs façons.
- Réduction de la charge cognitive. Les noms ne sont pas arbitraires, vous n'avez donc pas besoin de vous souvenir ou de deviner les noms des branches.
- Amélioration de la collaboration. Le but d'une succursale est évident dès que l'on entend ce terme.
- Automatisation. Les outils CI/CD déclenchent différents workflows en fonction du nom d'une branche.
- Application des politiques. Les règles sont appliquées aux branches en fonction de leur type. Par exemple, les fusions directes vers
mainsont bloquées.
Quelques modèles suggérés pour différents types de succursales.
|
Type |
Motif |
Objectif |
|
Caractéristique |
fonctionnalité/<nom> |
Développement de nouvelles fonctionnalités |
|
Correction de bug |
bugfix/<issue> |
Résoudre un problème connu |
|
Hotfix |
hotfix/<critical-issue> |
Correction d'urgence pour la production |
|
Sortie |
release/<version> |
Code préparé pour une publication |
|
Essai |
spike/<idea> |
Travaux exploratoires |
Intégration du pipeline CI/CD
Intégration des pipelines CI/CD avec des stratégies de branchement
Les stratégies de branchement modernes s'intègrent aux outils d'automatisation, notamment aux systèmes CI/CD tels que GitLab ou GitHub Actions. Ces outils peuvent déclencher des tâches en fonction de modèles de noms de branches tels que main, release/* ou hotfix/*. Cela permet aux équipes de personnaliser les suites de tests et le déploiement en fonction des types de branches spécifiques.
Cette approche présente de nombreux avantages.
- Efficacité. Les flux de travail sont personnalisés en fonction du type de succursale afin de réduire le temps et les ressources informatiques consacrés à des tâches inutiles.
- Assurance de la qualité. Les branches importantes, telles que
mainourelease/*, font l'objet d'une couverture complète des tests et d'une analyse des vulnérabilités. - Lancements contrôlés. Les branches destinées au déploiement déclenchent automatiquement des tâches qui poussent le code vers les environnements ou marquent les versions.
- Application des politiques. Le CI/CD bloque les fusions qui échouent aux tests ou qui enfreignent les règles de sécurité.
- Tests automatisés. Chaque PR déclenche des tests, des vérifications de conformité et des contrôles de qualité du code.
- Déploiements automatisés par succursale. Les branches associées à des environnements (par exemple,
mainvers production) déclenchent des déploiements vers les environnements correspondants.
Composants de fusion CD/CI
Vérifications de fusion
Les vérifications de fusion garantissent que le code fusionné répond aux normes de qualité avant de pouvoir être fusionné dans des branches protégées, telles que merge ou release/*. Ces contrôles permettent de détecter rapidement les problèmes et de garantir le respect des règles.
Les vérifications habituelles comprennent :
- Approbations des réviseurs. Les évaluations par les pairs contribuent à maintenir la qualité du code.
- Tests. Les tests unitaires, les tests d'intégration et/ou les tests de bout en bout permettent de valider les fonctionnalités.
- Linting. Le linting permet de garantir la cohérence et la lisibilité du style du code.
- Analyse statique. Des outils tels que SonarQube détectent les bogues potentiels, les odeurs de code et la complexité excessive.
- Failles de sécurité. Identifier les vulnérabilités et les violations des politiques.
Promotion de l'environnement
La promotion de l'environnement automatise la progression du code à travers les états de déploiement en fonction de sa branche correspondante. Les équipes peuvent configurer les promotions pour qu'elles soient automatiques ou qu'elles nécessitent une approbation manuelle. Les versions stables sont identifiées par une balise ou un numéro de version afin de pouvoir revenir en arrière en cas de problème.
Gestion automatique des versions et des balises
Le versionnement et le balisage automatiques sont des pratiques courantes dans les pipelines CI/CD. Lorsque le code est fusionné dans une branche de production, de publication ou de correctif, le pipeline génère une balise de version sémantique (v2.1.0), met à jour les métadonnées telles que les fichiers de version et les journaux des modifications, crée un artefact (tel qu'une image Docker) et, si nécessaire, le publie dans des registres de paquets tels que pypi, docker hub ou npm.
Évaluation de la maturité de l'équipe
Fournissez une matrice de sélection de stratégies basée sur les caractéristiques de l'équipe, telles que sa taille, la fréquence des mises en production, l'automatisation des tests et les exigences réglementaires.
Avec autant de choix, il est difficile de savoir quelle stratégie adopter. Voici une matrice de sélection de stratégies basée sur les caractéristiques de l'équipe.
|
Caractéristiques de l'équipe |
Stratégie |
Justification |
|
Petite équipe, faibles coûts de processus |
Flux GitHub |
Branchement simple, déploiements rapides, formalités réduites au minimum |
|
Équipe de taille moyenne, recherche une évaluation par les pairs |
Workflow des branches de fonctionnalités |
Prend en charge les modifications modulaires et la révision obligatoire des relations publiques. |
|
Entreprise/grande équipe, versions planifiées |
GitFlow |
Prise en charge de la publication structurée/par étapes, contrôle des branches à longue durée de vie |
|
Déploiements fréquents, CI/CD intensif |
Développement basé sur le tronc |
Favorise les itérations rapides et réduit les coûts liés à la fusion. |
|
Environnements multi-étapes, approbation manuelle |
Flux GitLab |
Modèles d'environnements de développement/préproduction/production, fusions en amont pour la promotion |
|
Fortement réglementé, une piste d'audit est requise. |
GitFlow ou GitLab Flow |
Prend en charge les versions contrôlées, les approbations manuelles et le balisage facilitant la restauration. |
|
Faible automatisation des tests, dépendance à l'assurance qualité manuelle |
Branche de fonctionnalité ou GitFlow |
Fusion et mise en scène plus lentes et contrôlées via release/* |
Tendances émergentes et orientations futures
Cette section explore les nouvelles tendances en matière de stratégies de branchement Git, notamment la gestion monorepo, les outils basés sur l'IA et les pratiques de sécurité intégrées.
Les défis du monorepo
Lorsqu'il s'agit de diriger des équipes travaillant sur plusieurs projets, il est nécessaire de choisir entre un référentiel monolithique (monorepo) ou un référentiel multiple (multirepo). Dans un environnement multi-référentiel, chaque projet réside dans son propre référentiel, tandis que dans un environnement mono-référentiel, tous les projets résident dans un référentiel (potentiellement très volumineux).
Dans une configuration multi-référentiels, les équipes bénéficient d'une propriété indépendante, d'un contrôle d'accès granulaire, de référentiels plus petits et d'un développement et d'un déploiement isolés. Cependant, la gestion des politiques d'accès et d'audit sur plusieurs référentiels peut s'avérer complexe et chronophage dans les grandes organisations. La configuration CI/CD standard doit être dupliquée, et les mises à jour des outils ou les refactorisations globales sont difficiles à coordonner.
En revanche, un mono-référentiel simplifie le partage de code, garantit la cohérence des outils, centralise le CI/CD et offre une meilleure visibilité sur l'ensemble du code. De nombreuses entreprises, dont Google, avec son immense base de code, choisissent d'utiliser un monorepo pour (la plupart de) leur base de code.
La gestion de monorepos à grande échelle présente des défis. Des conflits de fusion peuvent survenir entre des codes non liés, les pipelines CI peuvent ralentir car même de petites modifications peuvent déclencher des compilations ou des tests complets sur l'ensemble du référentiel, et les frontières entre les projets peuvent devenir floues. Il est difficile de suivre les modifications apportées à plusieurs modules sans conventions ni discipline au sein de l'équipe.
Pour résoudre ces problèmes, les équipes mettent en œuvre diverses solutions et solutions de contournement. Les compilations partielles utilisent des filtres basés sur le chemin d'accès pour déclencher le CI/CD uniquement lorsque le code pertinent est modifié. Des fusions fréquentes et de moindre envergure réduisent les divergences et simplifient les conflits. Une structure de projet claire permet de définir les responsabilités et d'appliquer les révisions de code. La traçabilité est améliorée grâce aux versions étiquetées, aux journaux des modifications et aux métadonnées de validation qui relient les modifications aux problèmes et aux PR.
Gestion des succursales optimisée par l'intelligence artificielle
L'intelligence artificielle optimise la gestion des succursales. Les outils de détection prédictive des conflits, tels que l'outil AI Merge Tool de GitKraken, alertent les développeurs des conflits de fusion potentiels avant la fusion, proposent des suggestions de fusion intelligentes et permettent aux développeurs de résoudre les problèmes à un stade précoce. Le nettoyage automatique des branches améliore l'hygiène du dépôt en supprimant les branches fusionnées ou inactives après une période définie.
Branchement axé sur la sécurité
La stratégie de branchement axée sur la sécurité intègre les pratiques de sécurité directement dans la stratégie de branchement.
- s relatives à l'analyse des vulnérabilités. Chaque PR déclenche une analyse automatique à la recherche de vulnérabilités connues. La fusion est bloquée si des problèmes sont détectés.
- Contrôles spécifiques à l'environnement. Seules les branches de confiance (telles que
main,release/*,hotfix/*) peuvent déclencher des déploiements. - s d'accès avec privilèges minimaux. Les contrôles d'accès basés sur les rôles limitent les développeurs autorisés à publier ou approuver des modifications sur les branches sensibles.
- de la politique en tant que code. Les équipes ont défini des politiques de sécurité et des exigences de fusion dans le code.
La sécurisation prioritaire est essentielle pour les applications à haut risque et les secteurs réglementés où la conformité et la traçabilité sont cruciales.
Conclusion
Comme j'espère l'avoir démontré tout au long de cet article, une stratégie de branchement Git devrait constituer un élément clé du flux de travail de votre équipe. Cela dit, différentes stratégies Git s'appliquent à différents types de développement. Il est donc essentiel de choisir la stratégie qui correspond à vos objectifs de livraison et à votre culture.
Si vous souhaitez approfondir vos connaissances sur Git, je vous recommande les ressources suivantes :
FAQ sur la stratégie de branchement Git
Quelles sont les stratégies de branchement Git courantes ?
Les stratégies courantes comprennent le workflow Feature Branch, GitFlow, GitHub Flow, le développement basé sur le tronc et GitLab Flow.
Quel est le rôle des indicateurs de fonctionnalité dans les stratégies de branchement ?
Les indicateurs de fonctionnalité vous permettent d'intégrer des fonctionnalités incomplètes dans l'main sans les activer pour les utilisateurs. Cela permet des déploiements plus sécurisés et prend en charge les flux de travail basés sur le tronc.
Comment le CI/CD s'intègre-t-il à la création de branches ?
Les systèmes CI/CD déclenchent différentes tâches en fonction des noms des branches. Par exemple, main peut déclencher le déploiement en production, tandis que les branches feature/* exécutent uniquement des tests.
Les monorépos sont-ils préférables aux multi-répos ?
Pas nécessairement. Les monorepos simplifient la gestion des dépendances et la visibilité entre les équipes, mais peuvent présenter des défis en matière de mise à l'échelle et de coordination. Les référentiels multiples offrent isolation et autonomie, mais augmentent la duplication des configurations et les problèmes de visibilité entre les équipes.

Mark Pedigo, PhD, est un éminent scientifique des données, spécialisé dans la science des données de santé, la programmation et l'éducation. Titulaire d'un doctorat en mathématiques, d'une licence en informatique et d'un certificat professionnel en intelligence artificielle, Mark allie connaissances techniques et résolution de problèmes pratiques. Au cours de sa carrière, il a joué un rôle dans la détection des fraudes, la prédiction de la mortalité infantile et les prévisions financières, et a contribué au logiciel d'estimation des coûts de la NASA. En tant qu'éducateur, il a enseigné à DataCamp et à l'université Washington de St. Louis et a encadré des programmeurs juniors. Pendant son temps libre, Mark profite de la nature du Minnesota avec sa femme Mandy et son chien Harley, et joue du piano jazz.