Modèle de branches

a marqué ce sujet comme résolu.

Pour le moment, je ne suis plus dans le développement du site, mon avis n'est qu'un point de vue extérieur mais, si je comprends bien, initialement nous sommes censés avoir 3 branches : prod, master, dev. La prod est câblé sur la prod, le master sur la preprod et le dev est censé être utilisé par les contributeurs.

Peut-être que nous n'utilisons pas bien ce workflow. Personnellement, j'avais compris le workflow de la manière suivante : La prod est mise à jour que par des merges de la master. Le master est mis à jour par des merges de la dev et par des hotfixs (qui sont répercutés directement après sur la branche dev) et le dev est régulièrement modifié par les contributeurs.

Suis-je toujours dans le bon ?

Si oui, alors je ne vois pas pourquoi il faut changer.

  • Pour les simples contributeurs, c'est complètement transparent. A la place de faire des PR sur le master, ils le font sur le dev et cas exceptionnel, pour un bug survenu sur la prod, ils font une petite modification sur le master.
  • Cela peut alléger le process de la QA à la PR puisque des tests pourront être fais sur la preprod par la suite.

En espérant ne pas avoir dit des conneries. :)

Ca parait bon, sauf que pour le moment dev a deux semaines de retard sur master… Comment on fait pour garder dev au courant des fix de master aussi souvent que possible ?

Eskimon

C'est clairement jamais censé arrivé. Jusqu'à présent, les PRs sont faites sur le master et donc le retard grandit rapidement entre les deux branches alors que les PRs devraient être faites sur le dev et très exceptionnellement sur le master.

Le retard sera moins important et celui qui fait le merge d'un hotfix vers la prod doit prendre l'habitude de faire un merge vers le dev aussi. Comme ça, toutes les branches sont tout le temps à jour.

Le retard sera moins important et celui qui fait le merge d'un hotfix vers la prod doit prendre l'habitude de faire un merge vers le dev aussi.

Je ne suis pas assez specialiste git, mais un githook peut pas faire ca auto ? "chaque fois qu'un merge est fait sur master depuis autres chose que dev, alors master doit etre merge sur dev" ?

+0 -0

Ce n'est pas master qu'il faut merge dans dev, mais le hotfix qui a atterrit sur master. Le problème étant qu'on ne peut pas vraiment mettre en place un githook sur github, à part peut-être via un webhook qui déclencherait alors un script…

C'est ce que je dis depuis le début : il faut qu'on se mette à merger à la main. C'est à dire ? On a la hiérarchie suivante :

1
2
3
4
5
6
7
8
           ---- (prod)
          /
        --------- (master)
       /
      /
     /
    /
----------- dev)

On a donc un problème : dev est carrément désynchronisé avec master, et pareil master vis à vis deprod (car il y a potentiellement eu des hotfix sur la prod).

Imaginons, je veux faire un hotfixe sur la prod. Nommons la branche du hotfix "hotfix-1".

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
              - (hotfix-1)
             /
           ---- (prod)
          /
        --------- (master)
       /
      /
     /
    /
----------- dev)

en mergeant le hotfix dans prod, on a donc cet arbre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
              - (hotfix-1)
             / |
           ----. (prod)
          /
        --------- (master)
       /
      /
     /
    /
----------- dev)

Maintenant que la prod intègre le hotfix, il faut aussi le répercuter sur master, du coup un des mainteneurs principaux fait un merge via git checkout master; git merge hotfix-1, et pareil en répercutant aussi sur dev. Ce qui nous fait l'arbre suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
              - (hotfix-1)
             / |
           ----. (prod)
          /     \
        ---------. (master)
       /         |
      /          |
     /       -----  
    /       /
-----------. dev)

Le cas est évidemment le même si un fix arrive sur master, il faut aussi le répercuter sur dev.

Ceci nous permet d'avoir des arbres dit cleans, sans avoir des merge dans tous les sens, auquel cas plus rien n'est compréhensible (je sais de quoi je parle, j'ai du fixer un putain d'arbre au boulot pas plus tard qu'hier soir à cause de merges intempestifs…).

Il ne faut pas avoir peur des conflits. Il ne faut pas non plus fixer les bugs en solitaire lors d'une PR, spécialement si ça n'a rien à voir avec la feature qui est développée. De toutes façons, même en mergeant plus tard master dans dev, ou etc, on aura quand même ces même conflits, sur une échelle plus grande, auquel cas il est impossible de s'en démeler sans une boîte entière d'aspirine.

Evidemment, ce workflow (qui est du git-flow, j'anticipe…) demande un peu de rigueur, en demandant que dev, master, ou prod n'accueille que des commits de merge. Pas de commits unitaires qui se baladent. Sinon c'est un peu plus chiant, et faut jouer avec du cherry-pick.

Ainsi, si on veut mettre à jour la branche de prod pour qu'elle puisse démarrer depuis un autre point, il suffit de scratcher la branche via un git branch -D prod et la recréer au bon endroit (je parle pas de rebase ou autre, car je sais que vous y êtes allergiques) via un git checkout -b prod origin/master par exemple (ou tout identifiant de commit, de tag, … peu importe).

+0 -0

Bon, je me demande toujours comment on a pu dire oui pour un workflow qu'on a pas vraiment compris, mais passons. Il y'a quelques points qui me paraissent nécessaire à poser pour comprendre le gitflow :

  • notre branche master, n'est pas une branche permanente, c'est une realease branch, elle est appelée à mourir dès qu'on atteint la milestone v1. En fait, on dirait que c'est ça qui pertube, peut-être faut-il l'appeler tout simplement RC-1.0
  • nous n'avons que deux branches réellement vivantes, la prod et la dev. La prod est stable, et la dev est la branche vivante.

Tout le monde trouve la branche dev inutile pour deux raisons :

  • la phase de realease prend beaucoup de temps
  • la branche dev n'est pas régulièrement mise à jour avec les hotfix de la master

Conclusion, pour moi le workflow est bon, c'est juste qu'on manque de personnes dédiée à la mise à jour des branches entre elles. Il faudrait que quelqu'un s'occupe de maintenir le workflow.

Maintenant, pour répondre à certaines questions :

En gros la QA devrait tout bêtement ne plus s'occuper de ce qui est pushé sur dev pour l'instant.

nohar

En gros on est en freeze officieux :ninja: ?

du coup j'ai une feature v1 qui va arriver, je l'envoie sur master, c'est bien ça ?

poulp

C'est ça. :)

nohar

Euh .. moi justement il a une feature v1, elle devrait arriver sur dev, et non sur master. master n'est là que pour accueillir du bugfix.

Ca parait bon, sauf que pour le moment dev a deux semaines de retard sur master… Comment on fait pour garder dev au courant des fix de master aussi souvent que possible ?

Eskimon

Comme je le disais plus haut, quelqu'un doit être dédié à la mise à jour des branches dès qu'un merge est fait sur la master. Sinon on se retrouve ou on en est aujourd'hui. S'il y'a conflit lors de l'intra-merge, il faut faire une QA dessus avant merge.

Ca parait bon, sauf que pour le moment dev a deux semaines de retard sur master… Comment on fait pour garder dev au courant des fix de master aussi souvent que possible ?

Eskimon

C'est clairement jamais censé arrivé. Jusqu'à présent, les PRs sont faites sur le master et donc le retard grandit rapidement entre les deux branches alors que les PRs devraient être faites sur le dev et très exceptionnellement sur le master.

Andr0

Selon le gitflow justement, les PR de fix doivent se faire sur la master qui est une release branch pour la v1 rappelons le. Et ce n'est qu'ensuite qu'il faut répercuter le fix arrivé sur master dans dev.

Je ne suis pas assez specialiste git, mais un githook peut pas faire ca auto ? "chaque fois qu'un merge est fait sur master depuis autres chose que dev, alors master doit etre merge sur dev" ?

Eskimon

le problème c'est que s'il y'a un conflit (oui ça peut arriver) lors d'un merge intra-branche (master -> dev ) il faut necessairement gérer ces conflits et refaire une passe de QA pour s'assurer que celui qui s'est occupé des conflits n'a pas cassé les features et fix installés.

Si on allégeait le process de QA ? Voilà ce que je propose. […]

  • QA en continu sur master sur la preprod.

nohar

C'est bien ce que j'ai proposé il y'a 3 semaines, mais le problème de ce système est toujours d'actualité. Il faut quelqu'un en continu aussi pour faire les déploiement sur la preprod. Ce qui n'est pas gagné.

Je pense que la QA fonctionne plutot bien actuellement (merci Eskimon), et que le problème ici c'est qu'il faut assurer le workflow en faisant les merge intra-branche adéquat dès qu'un merge est fait sur une branche.

Voili, voualou ce que j'en pense.

Ca parait bon, sauf que pour le moment dev a deux semaines de retard sur master… Comment on fait pour garder dev au courant des fix de master aussi souvent que possible ?

Eskimon

Comme je le disais plus haut, quelqu'un doit être dédié à la mise à jour des branches dès qu'un merge est fait sur la master. Sinon on se retrouve ou on en est aujourd'hui. S'il y'a conflit lors de l'intra-merge, il faut faire une QA dessus avant merge.

firm1

Bah c'est un peu ce que j'essaye de vendre depuis le début, plutôt que des merges horribles entre les 3 branches. :) Donc +1.

+1 -0

TL;DR : Une seule branche taguée est nécessaire : master.


Le seul truc que je ne comprends pas, c'est l'intérêt d'avoir une branche prod qui ne sert strictement à rien, puisque ça n'est qu'un pointeur vers un commit de master (en gros).

Pour moi, à chaque MEP il y a un nouveau tag sur master et ça part en prod, ça me semble amplement suffisant. Dans tous les cas, on ne touche jamais à prod.

Le soucis actuel, c'est qu'on est trop peu pour maintenir un workflow pareil. Les trois branches ne servent à rien, car il y a trop peu de ressources pour les gérer et développer sur les différentes branches en parallèle.

En clair, selon moi, ça se résume à :

  • master

et c'est tout. Dessus on y dev, on y met des tag, on bugfix. On a de toutes façons pas assez de ressources pour dé-freeze : pourquoi s'emmerder la vie avec le maintient de branches qu'on ne peut de toute façon pas maintenir sans perdre notre temps plus qu'on en gagne ?

Il y a des tonnes de projets qui fonctionnent comme ça. Une nouvelle feature, elle est dans sa branche, on la stabilise de son côté, puis on l'intègre. C'est exactement ce qu'on fait de toutes façon.

Je ne sais pas si vous vous rendez compte de la contradiction entre "on veut plein de contributeur, faut pas qu'on ait 15 outils/langages, faut que ce soit simple" et "on met gitflow de porc, avec trois branches, dont une qu'on arrive pas à maintenir et une qui n'est qu'une copie de master, et personne n'y comprend rien".

Je tiens à rappeler que git est une grosse machine difficile à assimiler, et que sur le projet beaucoup se forment à git, alors je trouve que plus ça va plus on est exigeant avec des gens qui veulent simplement aider. S'il n'y a qu'une branche : pas de question de "où je PR ?". Si une seule branche, pas de désynchro. Si une seule branche : TOUT EST SIMPLE ! On ne développe pas un logiciel avec des versions à maintenir séparément. On développe un site web qui vit sa vie, avec son code qu'on laisse dispo à tout le monde.

Voilà, c'est tout pour moi. Plus ça va, plus j'ai envie de dire qu'on veut jouer les pros sans ressources humaines suffisantes, et qu'on perd notre temps à en re-re-reparler 50x au lieu de passer du bon temps ou de continuer à développer ce projet.

Il y a des tonnes de projets qui fonctionnent comme ça. Une nouvelle feature, elle est dans sa branche, on la stabilise de son côté, puis on l'intègre. C'est exactement ce qu'on fait de toutes façon.

Et au moment où tu l'intègres tu n'as aucune assurance que ça ne va pas clasher, d'où le besoin d'un workflow qui tient compte de ça.

+2 -0

Le problème avec une branche, c'est que si tu as besoin d'hotfixer la prod, et que t'es sur master, bah tu peux pas, à part en branchant depuis le tag d'entrée. Et qui demandera de toutes manières un merge plus complexe que l'appui sur un bouton.

Bref, autant je suis pour le fait de virer une des trois branches / de revoir un peu le workflow, autant je suis contre le fait de se baser sur une seule branche. Donc de travailler avec une branche fixe de dev, et une autre qui peut être éphèmre, vivant le temps d'une version, scratchée et recréée lors du déploiement d'une nouvelle version.

+0 -0

perso, je pense clairement que une branche master qui prend tout (dev, hotfix) et une branche prod qui propose une version stable à 100% est vraiment mieux. Autre possibilité, en cas de développement de fonctionnalité lourde (exemple: ZEP 08, ZEP 02), on crée une branche qui n'existera que pendant que le travail sur la ZEP existe pour ensuite être mergé.

Bon. On va récapituler ce qui a été dit.

  • Le développement se fait sur une branche et toutes les PR sont mergées dessus (mettons master, au pif).

  • À un moment, on veut releaser, donc on crée branche à partir du point qui nous intéresse pour créer la "V1.0".

  • Cette branche de "V1.0" est checkoutée sur la prod et sert de branche de prod. Comme ça, on n'a pour l'instant que 2 branches dont une 100% stable qui tourne en prod.

  • Admettons, pour faire plaisir à Talus, que pour la V1.1, on se crée la branche "V1.1" et que quand on voudra la coller en prod, on se contentera de la checkouter en prod à la place de la branche "V1.0" (donc de scraper v1.0).

Il reste la question centrale : quand, comment, sur quelle branche stabilisons-nous la release avant de la mettre en prod ?

  • Réponse A : Sur la branche master ?

    • Ça veut dire qu'on est obligé de faire un freeze sur les nouvelles features pendant ce temps et donc potentiellement de laisser dormir les PR… qui vont finir (loi de Murphy) par clasher quand la QA pourra s'en occuper à nouveau après la release.
    • Mais ça veut également dire qu'on n'a pas besoin de backporter les hotfixes nulle part avant la MEP (s'il y en a après "dans l'urgence", par contre, il faudra les backporter).
  • Réponse B : Sur la branche V1.0 ?

    • Ça veut dire que les hotfixes sur V1 doivent être également mergés dans master au fur et à mesure.
    • Ça veut dire que les PR peuvent continuer à tomber sur master pour les nouvelles features sans avoir besoin d'une période de freeze. Mais que dans les faits la QA n'aura pas le temps de s'en occuper pour les merger avant d'avoir fini la release, et donc (loi de Murphy), qu'elles clasheront au moment d'être mergées.
    • … Ça revient en fait strictement au même que le workflow actuel.
  • Réponse C : La réponse C.

  • Réponse D : Obi-wan Kenobi.

À vos télécommandes.

Vous avez le droit au 50-50. L'ordinateur supprime les réponses C et D.

+2 -0

Edit d'Alex-D : pas la peine de quote le message juste au dessus <3

Je prends le super moit-moit.

Réponse B du coup. Mais de toutes manières, ca demandera en effet que les merges de hotfix soient répercutés sur les branches parentes (dans le cas de master / dev / whatever et de prod, la parente est toujours plus avancée que l'enfant), quitte à le faire vite fait à la main. Je veux bien me porter volontaire pour ça, et je viendrai faire chier sur IRC si y'a des soucis. :D

+0 -0

Bah vu que master est juste en avance sur dev (non ?), et qu'on repasse à 2 branches (prod & master), autant se débarrasser de dev ?

A moins qu'il n'y ait eu des travaux sur dev ? Dans ce cas un cherry pick devrait faire l'affaire

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte