103 votes

Meilleure stratégie de branchement lors de l'intégration continue ?

Quelle est la meilleure stratégie de branchement à utiliser lorsque l'on veut faire de l'intégration continue ?

  1. Branchement de la libération : développer sur le tronc, garder une branche pour chaque version.
  2. Branchement des fonctionnalités : développer chaque fonctionnalité dans une branche séparée, ne fusionner qu'une fois stable.

Est-il judicieux d'utiliser ces deux stratégies ensemble ? Par exemple, vous faites des branches pour chaque version, mais aussi pour les fonctionnalités importantes ? L'une de ces stratégies est-elle mieux adaptée à l'intégration continue ? L'utilisation de l'intégration continue aurait-elle même un sens lorsqu'on utilise un tronc instable ?

2 votes

Remarque : certains diront que même si de nouvelles fonctionnalités sont ajoutées, tout devrait toujours être stable. D'un autre côté, c'est peut-être un peu idéaliste.

21voto

pablo Points 3496

Je trouve le sujet vraiment intéressant car je m'appuie beaucoup sur les branches dans mon travail quotidien.

  • Je me souviens que Mark Shuttleworth avait proposé un modèle consistant à garder la branche principale intacte tout en allant au-delà de l'IC conventionnelle. J'ai publié un article à ce sujet ici .
  • Puisque je suis familier avec le Cruise Control, j'ai également parlé des branches de tâches et de l'IC. ici . Il s'agit d'un tutoriel expliquant étape par étape comment le faire avec Plastique SCM .
  • Enfin, j'ai trouvé certains des sujets sur l'IC (et potentiellement parler de branchement) dans le livre de Duvall sur l'IC très intéressant aussi .

J'espère que vous trouverez ces liens intéressants.

0 votes

Nous avons ajouté un support à Bamboo pour faire une branche par tâche codicesoftware.blogspot.com/2012/02/ et il semble que leur dernière version le fera de manière native avec plusieurs contrôles de version, y compris les dvcs.

20voto

Jiri Klouda Points 902

La réponse dépend de la taille de votre équipe, de la qualité de votre contrôle de source et de votre capacité à fusionner correctement des ensembles de modifications complexes. Par exemple, dans le cas d'un contrôle de source à branche complète comme CVS ou SVN, la fusion peut être difficile et il est préférable d'opter pour le premier modèle, tandis que si vous utilisez un système plus complexe comme IBM ClearCase et une équipe plus importante, il est préférable d'opter pour le deuxième modèle ou une combinaison des deux.

Personnellement, j'opterais pour le modèle des branches de fonctionnalités, où chaque fonctionnalité majeure est développée sur une branche distincte, avec des sous-branches de tâches pour chaque changement effectué par un développeur individuel. Au fur et à mesure que les fonctionnalités se stabilisent, elles sont fusionnées dans le tronc, que vous maintenez raisonnablement stable et qui passe tous les tests de régression à tout moment. Lorsque vous approchez de la fin de votre cycle de publication et que toutes les branches de fonctionnalités fusionnent, vous stabilisez et créez une branche de système de publication sur laquelle vous ne corrigez que les bogues de stabilité et les rétroportages nécessaires, tandis que le tronc est utilisé pour le développement de la prochaine publication et que vous vous séparez à nouveau pour les nouvelles branches de fonctionnalités. Et ainsi de suite.

De cette façon, le tronc contient toujours le code le plus récent, mais vous parvenez à le garder raisonnablement stable, en créant des étiquettes stables (tags) sur les changements majeurs et les fusions de fonctionnalités, les branches de fonctionnalités sont des développements rapides avec intégration continue et les sous-branches de tâches individuelles peuvent être souvent rafraîchies à partir de la branche de fonctionnalités pour que tout le monde travaille sur la même fonctionnalité en synchronisation, tout en n'affectant pas les autres équipes travaillant sur des fonctionnalités différentes.

En même temps, vous disposez, à travers l'historique, d'un ensemble de branches de publication, où vous pouvez fournir des rétroportages, un support et des corrections de bogues à vos clients qui, pour une raison quelconque, restent sur des versions antérieures de votre produit ou même sur la dernière version publiée. Comme pour le tronc, vous ne configurez pas l'intégration continue sur les branches de publication, elles sont soigneusement intégrées après avoir passé tous les tests de régression et autres contrôles de qualité de la publication.

Si, pour une raison quelconque, deux fonctionnalités sont co-dépendantes et nécessitent des modifications mutuelles, vous pouvez envisager de développer les deux sur la même branche de fonctionnalité ou d'exiger des fonctionnalités qu'elles fusionnent régulièrement les parties stables du code vers le tronc et qu'elles rafraîchissent ensuite les modifications du tronc pour échanger du code entre les branches du tronc. Ou si vous avez besoin d'isoler ces deux fonctionnalités des autres, vous pouvez créer une branche commune à partir de laquelle vous ramifiez ces branches de fonctionnalités et que vous pouvez utiliser pour échanger du code entre les fonctionnalités.

Le modèle ci-dessus n'a pas beaucoup de sens avec des équipes de moins de 50 développeurs et un système de contrôle de source sans branches éparses et sans capacité de fusion appropriée comme CVS ou SVN, ce qui ferait de ce modèle un cauchemar à configurer, gérer et intégrer.

5 votes

Je ne suis pas sûr d'être d'accord pour dire que ce que vous décrivez n'a pas de sens pour les équipes de moins de 50 développeurs. Je peux aussi voir des avantages pour des équipes beaucoup plus petites. +1

2 votes

Bien entendu, les équipes de toute taille peuvent en tirer profit. La question est de savoir à partir de quelle taille d'équipe les avantages l'emportent sur les coûts associés à un processus lourd.

0 votes

Ce modèle est similaire à celui de GitFlow et/ou GitHubFlow. Je ne pense pas que ces modèles facilitent l'intégration continue (IC). À mon avis, le développement basé sur le tronc est une amélioration significative de ces modèles.

9voto

Adnan Points 1623

Je trouve personnellement qu'il est beaucoup plus propre d'avoir un tronc stable et de faire des branchements de fonctionnalités. De cette façon, les testeurs et autres personnes concernées peuvent rester sur une seule "version" et mettre à jour le tronc pour tester toute fonctionnalité dont le code est complet.

De même, si plusieurs développeurs travaillent sur différentes fonctionnalités, ils peuvent tous avoir leurs propres branches séparées, puis fusionner vers le tronc lorsqu'ils ont terminé et envoyer une fonctionnalité à tester sans que le testeur ait à passer par plusieurs branches pour tester différentes fonctionnalités.

En prime, un certain niveau de test d'intégration est fourni automatiquement.

0 votes

Par ailleurs, procédez-vous toujours à la création de branches et à l'étiquetage pour chaque version majeure ? Ou juste étiqueter ?

1 votes

Il fonctionne bien avec le CI tant que les branches de fonctionnalités sont fusionnées dans le tronc avec une certaine discipline afin de ne pas avoir de constructions cassées. Je fais une branche et une étiquette pour chaque version de production qui sera utilisée pour la correction des bogues uniquement. Cela peut être fusionné dans le tronc stable immédiatement.

0 votes

@king Je dirais que cela dépend probablement de ce que vous appelez une version majeure, mais dans tous les cas, vous pouvez étiqueter, et faire des branches plus tard quand vous en avez besoin (en fonction de l'étiquette :)).

5voto

SirFabel Points 358

Les branches de version sont très utiles, et même absolument nécessaires, si vous devez maintenir plusieurs versions de votre application.

Les branches de fonctionnalités sont également très pratiques, notamment si un développeur doit travailler sur une modification importante, tandis que d'autres continuent à publier de nouvelles versions.

Pour moi, utiliser les deux mécanismes est donc une très bonne stratégie.

Lien intéressant du Livre de SVN .

4voto

hermannloose Points 484

J'ai récemment commencé à aimer ce modèle lorsque vous utilisez git. Bien que votre question soit étiquetée "svn", vous pourriez tout de même être en mesure de l'utiliser.

L'intégration continue peut, dans une certaine mesure, se produire dans la branche "développement" (ou quel que soit le nom que vous lui donnez) dans ce modèle, bien que le fait d'avoir des branches de fonctionnalités à long terme pour les futures versions ne rendrait pas le système rigide au point de considérer que chaque changement se produit dans le code quelque part. La question reste de savoir si vous voulez vraiment cela. Martin Fowler le fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X