C'est un scénario courant que la base de code d'un produit détenu par un référentiel dans un système VCS évolue à un point où cette base de code peut sans doute être considérée comme contenant plusieurs produits. La division de la base de code entre plusieurs référentiels VCS, chacun dédié à un seul produit, peut tirer parti de plusieurs avantages (voir Avantages d'avoir un produit par référentiel VCS par rapport au modèle de référentiel gonflé ci-dessous). Sur le plan technique, le fractionnement de la base de code est une étape assez facile car la plupart des VCS prennent en charge cette opération. La scission pourrait toutefois soulever des problèmes d'ingénierie liés aux tests automatisés, à la livraison continue, à l'intégration ou à la surveillance des services (voir Problèmes soulevés par la scission.) Les organisations qui envisagent d'effectuer une telle division doivent donc savoir comment effectuer cette transition aussi facilement que possible, c'est-à-dire sans interrompre leur livraison et leur pipeline de surveillance. La première étape consiste probablement à mieux comprendre la notion de projet et comment délimiter la scission dans une base de code monolithique.
Dans les réponses à ces questions, j'aimerais voir:
Une tentative de donner une définition pratique de ce qu'est un produit, qui donne des critères pratiques pour délimiter réellement des produits dans une base de code existante.
Selon cette définition de travail, élaborez un plan qui effectue réellement la scission. Nous pouvons faire l'hypothèse simplificatrice que la base de code est traitée par un sdlc entièrement automatisé implémentant l'intégration continue et la livraison continue . En d'autres termes, chaque branche est validée par une suite de tests automatisée implémentée dans la base de code actuelle et chaque fusion avec une branche «magique» génère des artefacts de produit qui sont testés et déployés. ( Les artefacts du produit sont, par exemple , les archives tar sources, la documentation, les progiciels binaires, les images Docker , les AMI, les unikernels.)
Un tel plan est satisfaisant s’il explique comment contourner le
Problèmes soulevés par la scission
Quel est le lien entre les procédures de test automatisées et le référentiel monolithique préexistant et les référentiels fractionnés?
Comment les procédures de déploiement automatisé sont-elles liées au référentiel monolithique préexistant et aux référentiels fractionnés?
Où est stocké le code des procédures de déploiement automatisées elles-mêmes?
Où se trouvent l' infrastructure stockée , la surveillance et les stratégies de haute disponibilité ?
Comment s'assurer qu'un développeur n'a besoin que d'une seule base de code à la fois (mais utilise éventuellement des artefacts provenant d'autres bases de code).
Comment un outil comme git-bissect
Note marginale: Avantages d'avoir un produit par référentiel VCS par rapport au modèle de référentiel de ballonnement
Le fait d'avoir plusieurs petits référentiels contenant la base de code pour un produit spécifique présente les avantages suivants par rapport à l'approche du «référentiel gonflé»:
Avec un référentiel gonflé, il est difficile d'annuler une version lorsqu'un produit est instable, car l'historique est mélangé avec un autre historique de produit.
Avec un référentiel pléthorique, il est difficile de revoir l'historique ou les pulls du projet, avec de petits référentiels, nous sommes plus susceptibles de lire ces informations. (Cela peut être spécifique à VCS comme git, où contrairement à svn, nous ne pouvons pas extraire les sous-arbres!)
Avec un dépôt de ballonnement, nous devons faire beaucoup plus de branch-dance lorsque nous nous développons. Si nous avons N référentiels, nous pouvons travailler en parallèle sur N branches, si nous n'avons qu'un seul référentiel, nous ne pouvons travailler que sur une seule branche, ou avoir une charge de copies de travail qui sont également très compliquées à gérer.
Avec plusieurs petits référentiels, les journaux donnent une carte thermique du projet. Ils peuvent même être utilisés comme proxy de diffusion des connaissances dans l'équipe de développement: si je ne me suis pas engagé dans le repo X depuis 3 mois, il pourrait être bon de m'affecter dans une équipe travaillant sur le repo X pour que je reste au courant des développements dans ce composant.
Avec de petits référentiels, il est plus facile d'avoir une vue d'ensemble claire d'un composant. Si tout se passe dans un seul grand référentiel, il n'y a pas d'artefact tangible délimitant chaque composant, et la base de code peut facilement dériver vers la grosse boule de boue .
Les petits référentiels nous obligent à travailler sur les interfaces entre les composants. Mais comme nous voulons avoir une bonne capsulation, c'est un travail que nous devons faire de toute façon, donc je considérerais cela comme un avantage pour les petits référentiels.
Avec plusieurs petits référentiels, il est plus facile d'avoir plusieurs propriétaires de produits.
Avec plusieurs petits référentiels, il est plus facile d'avoir des normes de code simples qui sont pertinentes pour un référentiel complet et qui peuvent être vérifiées automatiquement.