Vous avez une branche de production ou utilisez Master?

16

Je travaille en petite équipe avec d'autres développeurs distants sur une Railsapplication. Nous commençons à modifier notre gitflux de travail. Nous avons pensé à une structure de ramification comme ci-dessous:

(dev) -> (qa) -> (stag) -> (master)

Mais certains développeurs ont pensé que cela pourrait être moins déroutant pour les nouveaux développeurs qui pourraient automatiquement passer en production sur master. Ils ont pensé plutôt que tout le monde travaille sur le master et crée une branche distincte pour la production.

(master) -> (qa) -> (stag) -> (prod)

On m'a appris que vous vouliez garder maître déployable et ne pas l'utiliser comme développement et des endroits précédents où j'ai travaillé maître est toujours destiné à être déployable pour la production.

Quels seraient les inconvénients de l'utilisation d'une structure de branchement où le maître est activement utilisé pour le développement et où une branche de production distincte est celle que vous utilisez pour les déploiements?


la source
D'après mon expérience, il est payant d'avoir un endroit où les gens peuvent s'engager à volonté (que ce soit pour l'enregistrement quotidien ou autre) - sans aucune exigence pour "toujours compiler". Sans cela, les gens retardent les enregistrements et courent le risque de perdre du code en cas d'accident (par exemple, panne de disque). Ensuite, c'est à eux de propager une version significative à partir de là et de la "publier" vers le flux d'intégration. Donc, mon ensemble préféré d'étapes est comme (dev) -> (unités) -> (intégration) -> (test) -> (production)
BitTickler
2
Nous utilisons avec succès le workflow git décrit sur ce site avec quelques différences. nvie.com/posts/a-successful-git-branching-model La seule différence est que nous préférons écraser les succursales locales pour en développer une afin de maintenir un historique propre et de suivre la logique "un engagement, un problème"
Jepessen
Que se passe-t-il normalement sur votre branche "cerf"?
simgineer
recommander pour CI / CD plus clair. la branche principale n'est pas utilisée car elle peut être mal interprétée. {develop} - {unit} - {integration} - {staging} - {production}. en bleu / vert ayant une production en continu de construction> tranche active et mise en scène> tranche inactive. HEAD> développer une branche où les fonctionnalités sont ramifiées. développer des webhooks pour déclencher des builds vers la progression de l'unité vers l'intégration et la mise en scène (avec des balises appropriées lors de la réussite de l'intégration). correctifs pour développer + production (rare mais ça arrive). plus de subtilités mais une idée générale.
Jimmy MG Lim

Réponses:

16

Il n'y a ni avantages ni inconvénients à cette approche. La raison pour laquelle je dis cela est simple: pour Git, cela ne fait aucune différence si vous développez à partir de master ou sortez de master. Vous n'avez même pas besoin de libérer des branches; vous pouvez marquer un commit arbitraire et le libérer à la place.

Le vrai problème ici est le processus et la procédure. Les développeurs les plus âgés qui craignent que le faire dans un sens confondra les nouveaux développeurs doivent être prêts à investir du temps pour expliquer ce qu'est le modèle de version et pourquoi il en est ainsi.

Tant que tout le monde comprend que master est pour le développement, et qu'une autre branche arbitraire est pour les versions, et que le travail pour le maintenir est fait , alors il ne devrait pas y avoir de problème avec cette approche.

Makoto
la source
1
Je pense vraiment que vous avez touché un bon point. Merci pour les commentaires.
+1 pour le marquage des validations. Je travaille par moi-même la plupart du temps, mais j'étiquette les versions pour deux raisons. 1) Cela fonctionne très bien avec les outils d'historique visuel git pour montrer quels commits ont été réellement en production. 2) Cela fonctionne très bien avec des outils comme GitHub qui peuvent empaqueter des versions de version en vérifiant le commit balisé et en le compressant dans un fichier zip pour la consommation.
nbering le
9

Je peux voir votre dilemme. Je l'avais aussi, jusqu'à ce que j'apprenne ce que je pensais toujours du maître.

On m'a appris que vous vouliez garder maître déployable et ne pas l'utiliser comme développement et des endroits précédents où j'ai travaillé maître est toujours destiné à être déployable pour la production.

De la documentation / livre de Git - Git branching

La branche «maître» de Git n'est pas une branche spéciale. C'est exactement comme n'importe quelle autre branche. La seule raison pour laquelle presque tous les référentiels en ont un est que la commande git init le crée par défaut et la plupart des gens ne prennent pas la peine de le changer.

Donc, si vous avez un flux de travail préféré et qu'il est difficile de travailler avec lui car les différents développeurs de l'équipe ont des idées différentes master. Vous pourriez même envisager de renommer masterpour dire prodet utiliser un flux de travail comme ci-dessous -

(dev) -> (qa) -> (stag) -> (prod)

Voici comment vous changez le nom de la branche principale .

Je ne dis pas que vous devez changer le masternom de la succursale. Mais si vous avez un flux de travail préféré et que cela aide à changer le masternom de la branche, faites-le par tous les moyens :-)

Sumeet Pareek
la source
C'est un très bon point. Merci de l'avoir fait. Je ne sais pas si nous irons jusqu'à renommer mais il est bon de savoir que git ne traite pas le maître d'une manière spéciale. Merci!
6

Je préfère les vérifications aux conventions dans ce cas. Chaque équipe comprend des membres qui sont mieux à même de démarrer de nouvelles fonctionnalités et d'autres personnes qui sont mieux à stabiliser les choses pour une version.

Si vous n'avez pas ce dernier, alors les révisions de code vous aideront (souvent, les personnes les plus disciplinées voudront de toute façon des révisions de code).

C'est pourquoi nous configurons notre référentiel Git (nous utilisons Gitlab) pour que seules certaines personnes puissent fusionner les demandes de tirage et chaque développeur obtient sa propre fourchette privée du référentiel principal.

Cela résout deux problèmes:

  1. Les nouveaux développeurs ne peuvent pas changer la mauvaise branche (car ils ne peuvent pas pousser leur travail directement dans le référentiel principal). Ils peuvent pousser mastersur leur propre dépôt, mais cela sera corrigé lorsque la demande de tirage arrivera.

  2. Les conventions de code se répandent rapidement dans l'équipe puisque chaque validation est vérifiée par au moins une autre personne qui apporte son point de vue et ses connaissances.

Aaron Digulla
la source
1

Tout dépend du processus global de développement logiciel. La gestion de la configuration et la création d'une nouvelle version ne peuvent être définies sans connaître le processus global.

Il y a la faction "agile" qui opterait pour une "première zone de commit toujours active". Ils exécuteraient des installations automatisées de construction et de test en permanence dans cette zone et essaieraient d'avoir un système fonctionnel "à tout moment".

Ils verraient le (master) -> (release) avec peut-être 1,2 organisation d'étapes intermédiaires comme bénéfique.

Ensuite, il y a la faction plus "classique", qui a un processus guidé par la planification et les étapes d'intégration planifiées vers les jalons, où une version "unité de travail" est une activité planifiée avec des exigences telles que "uniquement la version quand elle est (unité) testée et censé correspondre à la prochaine étape prévue ". Là, la planification comprend la gestion des versions des «unités de travail» et, en général, elles vont très loin pour définir à quoi la prochaine version prévue du produit doit ressembler en termes de fonctionnalités et de correctifs. Pour des raisons de planification, ils veulent savoir que ce qu'un développeur publie est "approprié" et un acte conscient d'engager une unité de travail.

Cette approche classique ne signifie pas nécessairement qu'il y a des périodes plus longues où il n'y a pas de version complète du produit disponible.

Le workflow "classique" serait donc: (dev) -> (unit) -> (integration) -> (test / qa) -> (production).

Le rôle de l'intégrateur est d '«accepter / acheter» les unités publiées ou de les rejeter si elles ne correspondent pas aux besoins de la prochaine version à venir.

Il est également possible de mélanger ces 2 approches de base de manière opportune.

D'après mon expérience (qui était principalement dans le domaine de l'utilisation de l'approche "classique"), l'approche "classique" fonctionnait assez bien dans des projets d'environ 4 à 50 personnes en équipe.

BitTickler
la source