Meilleures pratiques avec le branchement du code source et le cycle de vie des applications

10

Nous sommes un petit magasin ISV et nous expédions généralement une nouvelle version de nos produits chaque mois. Nous utilisons Subversion comme référentiel de code et Visual Studio 2010 comme IDE. Je sais que beaucoup de gens préconisent Mercurial et d'autres systèmes de contrôle de source distribués, mais à ce stade, je ne vois pas comment nous pourrions en bénéficier, mais je peux me tromper.

Notre principal problème est de savoir comment synchroniser les branches et le tronc principal.

Voici comment nous faisons les choses aujourd'hui:

  1. Release new version (create automatically a tag in Subversion)
  2. Continuez à travailler sur le coffre principal qui sortira le mois prochain

Et le cycle se répète tous les mois et fonctionne parfaitement. Le problème se pose lorsqu'une version de service urgente doit être publiée. Nous ne pouvons pas le libérer du coffre principal (2) car il est en cours de développement et il n'est pas suffisamment stable pour être libéré de toute urgence.

Dans ce cas, nous procédons comme suit:

  1. Créez une branche à partir de la balise que nous avons créée à l'étape (1)
  2. Correction d'un bug
  3. Test et publication
  4. Repousser le changement dans le coffre principal (le cas échéant)

Notre plus gros problème est de fusionner ces deux (branche avec principal). Dans la plupart des cas, nous ne pouvons pas compter sur la fusion automatique car, par exemple:

  • de nombreux changements ont été apportés au tronc principal
  • la fusion de fichiers complexes (comme les fichiers XML Visual Studio, etc.) ne fonctionne pas très bien
  • un autre développeur / équipe a apporté des modifications que vous ne comprenez pas et que vous ne pouvez pas simplement fusionner

Donc, ce que vous pensez est la meilleure pratique pour garder ces deux versions différentes (branche et principale) synchronisées. Que faire?

Toni Frankola
la source
1
Assurez-vous de consulter tfsbranchingguideiii.codeplex.com (ne pas publier comme réponse car il ne répond pas directement à votre question, mais je le recommande toujours aux personnes qui cherchent à améliorer leur branche-fu TFS). Peut-être que l'un de leurs plans de succursale vous donnera une idée de la façon d'améliorer votre configuration.
nlawalker

Réponses:

2

Je pense que votre approche de la ramification et de la fusion est correcte, mais si le principal problème est que la base de code est assez instable, c'est sur cela que vous devez vous concentrer et minimiser.

La principale chose à garantir est que la base de code a une bonne séparation des préoccupations . Les dépendances entre les différents composants doivent être isolées et réduites. Cela devrait résoudre la majorité de vos problèmes. Il sera également utile de suivre des pratiques telles que le principe de responsabilité unique.

Si un changement architectural majeur doit se produire, il devrait avoir lieu dans sa propre branche, puis fusionné de nouveau dans le principal une fois entièrement testé et «stable» (dans des limites raisonnables). Cela peut être douloureux et difficile, mais cela devrait également être rare. Si vous disposez de bonnes pratiques de test, le risque est minimisé.

Il peut également être utile de passer à un système de contrôle de version distribué. Cela devrait vous donner un tronc stable, avec différentes fonctionnalités fusionnées à partir de différentes branches lorsqu'elles sont prêtes. Vous aurez toujours de la difficulté à fusionner si le code est trop interdépendant, mais vous aurez plus de contrôle.

En considérant cela sous un autre angle, envisagez également une communication accrue au sein de votre équipe. Organisez régulièrement des réunions standup de style agile. Demandez-vous où les membres de l'équipe sont assis et comment cela peut aider. Si une fusion complexe doit avoir lieu, ce n'est peut-être pas une si mauvaise chose - utilisez une approche de programmation par paires qui donnera de la compréhension aux deux parties.

Alex Angas
la source
2

J'ai tendance à voir les choses à peu près de la manière opposée:

  • Le tronc doit toujours être du code prêt pour la production (après votre première version initiale, c'est-à-dire).
  • Il devrait y avoir une branche de type développement qui fonctionne parallèlement au tronc, où se déroule votre développement mensuel. Chaque mois, en ce qui concerne le temps de sortie, celui-ci est fusionné dans le coffre, testé, puis publié.
  • Les correctifs peuvent ensuite être facilement créés dans votre coffre et enregistrés, et toujours être déployés avec succès. Créez ensuite un correctif à partir du correctif et appliquez-le à votre branche de développement.

Bien sûr, ce flux de travail est beaucoup mieux adapté à quelque chose qui n'est pas SVN, car une bonne ramification et fusion est quelque chose de très pénible dans SVN, quel que soit votre flux de travail. D'après mon expérience, la fusion dans SVN devrait presque toujours être effectuée manuellement, car cela ne fonctionne tout simplement pas, et il n'y a pas vraiment de solution.

sevenseacat
la source
1

Dernièrement, j'ai préconisé une philosophie de «branche et fusion» comme dernier résultat. Je pense que c'est la triste vérité que traiter les fusions de code à partir de branches n'est pas un problème technique, mais c'est une tâche difficile sur le plan cognitif: je pense que c'est simplement que le cerveau humain ne suit pas suffisamment de détails pour le rendre facile. De plus, je n'ai pas encore vu de branchements et de fusions fonctionner dans la pratique. Une fois que le code est ramifié, l'expérience me dit que ce n'est rien d'autre que de la fusionner à nouveau.

smithco
la source
2
Quels VCS avez-vous essayé? La facilité d'une fusion dépend grandement du VCS utilisé.
alternative
Beaucoup de nouveaux VCS gèrent très bien la fusion. Parfois, des conflits se produisent toujours, mais ils ont tendance à être des conflits réels, pas les faux signalés beaucoup de temps par SVN.
sevenseacat
J'ai essayé plusieurs systèmes SCM. La plupart des outils de fusion peuvent claquer deux morceaux de texte avec plus ou moins de succès. Cependant, aucun outil de fusion ne peut dire s'il a obtenu le bon résultat. J'ai vu trop de bugs passer car un programmeur a décidé de faire confiance à un outil de fusion.
smithco
1
Les outils de fusion ne sont pas censés claquer ensemble deux morceaux de texte. Ils sont censés fusionner les modifications du commit parent; énorme différence.
alternative
Les outils de fusion ne comprennent pas le code. Tout ce qu'ils peuvent faire, c'est prendre deux morceaux de texte différents et essayer de les réconcilier intelligemment. Je ne saurais trop insister sur le nombre de fois où j'ai vu de mauvaises fusions glisser et provoquer des échecs de construction et des bugs. Chaque fusion doit être considérée comme risquée et les résultats examinés par un humain et passer la batterie de tests avant de valider les modifications fusionnées. C'est un processus compliqué et devrait être fait rarement.
smithco
1

Une approche disciplinée de libération principale fonctionne bien.

La ramification SVN n'est pas conçue pour être flexible. Je dirais que votre premier problème réside dans SVN; passer de cela ouvrira de nouvelles options.

Paul Nathan
la source