YAGW : Yet another git workflow
Lecture 11 min. âą
Table des matiĂšres
- No Flow : YOLO ( -8000 av JC )
- Gitflow : le premier arrivé (2010)
- Github Flow : Une simplification drastique (2011)
- GitLab Flow : Automatisation Ă tout prix (2014)
- YAGW : Mon approche du problĂšme
- Conclusion

A partir du moment oĂč jâai dĂ» faire de la programmation Ă plusieurs ( mes personnalitĂ©s multiples ça compte pas đ€Ș ).
Un problĂšme sâest toujours posĂ©: comment ne pas se marcher sur les pieds.
Durant ma courte expĂ©rience de dev, jâai dĂ©jĂ tester plusieurs principes tout fait. Je vais vous avouez que je nâai Ă©tĂ© convaincu par aucun dâentre eux.
Avant de prĂ©senter YAGW. Je vais faire un tour dâhorizon de ce que je connais pour les avoir essayĂ©s.
No Flow : YOLO ( -8000 av JC )
Tout le monde Ă©crit dans la master et personne ne fait de branche, letâs rock baby !

Il peut y avoir des tags mais câest pas dit.
Avantages
- Pas de charge mentale
- IdĂ©al lorsquâon est seul
- TrĂšs automatisable
Désavantages
- Câest mort pour collaborer
- Tester câest douter
Bon maintenant quâon a Ă©vacuĂ© le troll, passons aux choses sĂ©rieuses. đ
Gitflow : le premier arrivé (2010)
Quand le développement a commencé à se structurer autours de git. Une méthode appelée gitflow a vu le jour. Elle se voulait apte à résoudre toutes les problématiques ou presque.
Mais comme toujours la flexibilitĂ© vient souvent avec son lot de complexitĂ©s. Et ça nâa pas ratĂ©. Gitflow est vĂ©ritablement une usine Ă gaz, voyez plutĂŽt:

Oui câest pas Ă©vident du tout.
Pour expliquer la philosophie: elle part du principe que la branche master ne sert quâĂ tagger un historique.
Cette master est isolée du reste par des branches éphémÚres appelées releases.
Le coeur de la vie du projet est situé sur la branche develop, celle ci doit impérativement contenir tous les commits du projet.
De cette branche on va dĂ©river tout une sĂ©rie de branches. Celles ci sont appelĂ©es des branches de features/X. Elles peuvent nâavoir que 2 fins. Mourrir ou ĂȘtre mergĂ©es dans la develop.
Lorsque lâon dĂ©sire crĂ©er une release, on va dĂ©river Ă partir dâun commit de la develop une branche release/X, ce X peut reprĂ©senter un hash de commit un nom explicite ou une version. 3 destins attend cette branche: mourrir, ĂȘtre remergĂ© dans la develop aprĂšs modifications. Ou ĂȘtre mergĂ© Ă la fois dans la master et dans la develop.
Dans la littérature ils appellent ça des back-merge. Je trouve personnellement cette solution trÚs peu élégante. Et surtout difficilement intégrable dans un environnement comme gitlab/github.
Une derniĂšre sĂ©rie de branches sont appelĂ©es hotfix, elles sont destinĂ©es Ă ĂȘtre mergĂ©es Ă la fois dans la master et dans la develop. Elle permette de corriger des bugs critiques qui seraient passĂ©s lors dâun merge dâune branche release dans la master. Il est impĂ©ratif que la develop contiennent lâintĂ©gralitĂ© des hotfix qui ont Ă©tĂ© mergĂ©es dans la master.
Si ces processus de back-merge des hotfix vers la develop ou des commits ayant eu lieu sur les branches de release vers la develop sont oubliĂ©s ou quâune automatisation Ă©choue. La develop et la master vont finir par ĂȘtre disjointes. Ce qui pourrait causer plus tard des soucis de merge de branche release/.
Un autre point que je trouve vraiment dĂ©rangeant câest le manque total dâĂ©lĂ©gance et de lisibilitĂ© dâun arbre ayant subit le principe gitflow. Je suis pas le seul
VoilĂ le rĂ©sultat dâun arbre aprĂšs quelques temps dâutilisation de gitflow.

Biensûr il est possible de rendre ça lisible avec git log --graph --oneline --first-parent develop. Mais je ne pense pas que ça soit un bon point de devoir changer de référentiel pour comprendre un problÚme.
Avantage
- Il permet de gérer plusieurs versions en production
Désavantages
- Beaucoup trop complexe
- Peu automatisable et intégrale dans une CI sans faire des concessions
- Un arbre de commit trĂšs peu lisible
Github Flow : Une simplification drastique (2011)
A lâĂ©poque dĂ©jĂ certaines personnes nâavait pas le besoin de la complexitĂ© de gitflow, dans cet article.
Oui Ă lâĂ©poque chez github ils Ă©taient 30 đ.
Ce workflow se base sur 6 grands principes:
- Tout ce qui est sur la master est déployable et déployé.
- Tout ajout à la master doit préalablement passer par une branche lisiblement nommée dérivée de la
master - Le développeur travail jamais sur la
mastertoujours sur sa branche - Lorsquâil doit collaborer avec une autre personne, une pull-request doit-ĂȘtre crĂ©e.
- Une fois la pull-request vérifiée, le reviewer merge la branche sur la
master - Si câest mergĂ© ça doit ĂȘtre dĂ©ployĂ©!

Câest dĂ©jĂ plus clean đ€©.
Par contre chaque merge de feature peu planter la master si le cafĂ© du matin nâĂ©tait pas assez fort. Il faut donc un code trĂšs automatisĂ© en terme de vĂ©rification pour Ă©viter de dĂ©ployer des rĂ©gressions.
Jâappellerai ça le dĂ©ploiement sans filet đ€Ș.
Avantages
- TrĂšs facile Ă automatiser dans une CI/CD
- On peut lire le graphe de commit !
Désavantages
- Dépendant du systÚme externe des pull-requests
- La master peut ĂȘtre instable Ă tout merge
- Non adapté à des cycles de déployement ( sprint )
- Non adapté au maintient de plusieurs versions
GitLab Flow : Automatisation Ă tout prix (2014)
Dans un article paru en 2014. Les équipes de GitLab nous exposent leur maniÚre de procéder.
Ce processus sâappuie sur 11 rĂšgles:
- Ne jamais faire de commit direct sur la master
- Tout commits doit bénéficier de tests automatisés, pas seulement sur la branche
master - On lance tous les tests, tout le temps. Pas seulement ceux de la feature que lâon dĂ©veloppe
- On fait la code review avant le merge sur la
masterpas aprÚs. - Tout est automatisé
- Les tags doivent ĂȘtre apposĂ©s par un humain, pas un robot
- Une release = un tag
- Un commit partagé est considéré immutable, jamais de rebase!
- Le référentiel est la
master, tout le monde commence dâelle, et finit Ă elle - Les bugs sont fixĂ©s dâabord sur la
masterpuis sur les releases. - Soignez vos messages de commits !

Si lâon ne prend que la partie haute du schĂ©ma, on retrouve le GithubFlow.
Ce qui diffĂšre ce sont les deux branches staging et production. Celles ci, ne sont et doivent pas ĂȘtre modifiĂ©s par un humain. Elles servent Ă dĂ©ployer des environnements diffĂ©rents avec des niveaux de criticitĂ© diffĂ©rents.
La master est destinĂ© aux dĂ©veloppeurs, le but ultime nâest pas de la flinguer. Mais si elle est sur le carreau cela nâimpacte entre guillemets que les devs.
La staging est plus critique, ce qui est en staging est mis Ă disposition des Ă©quipes internes. Un down peu impacter le travail des Ă©quipes de QA et de produits. Elle ne devrait pas avoir de down mais lâerreur est humaine.
Les bugs post-release sont corrigés dans cette environnement, autrement dit les hotfix internes, dérivent de la staging et sont reportées dans la master puis dans la staging.
Le lourd pour finir, la production, jamais de down, tout ce qui est sur production a obligatoirement passé par le staging!
Comme dâhabitude si un bug critique est dĂ©couvert et quâil faut absolument dĂ©ployer en urgence. Il est possible de gĂ©nĂ©rer des branches de hotfix depuis la production et de les merger Ă la fois dans staging puis production.
Une fois le hotfix dans la staging, il faut encore la faire descendre dans la master.
Avantages
- Par construction, automatisable dans une CI
- Un arbre de commit trĂšs propre
- Donne un filet de sécurité avant de déployer des régressions
Désavantages
- Se base sur un code trĂšs automatisĂ© Ă la base, TU, tests de rĂ©gression, etcâŠ
- Nâest pas conçu pour gĂ©rer plusieurs versions en production en parallĂšle
- Les hotfix sont gĂ©rĂ©es dâune maniĂšre trĂšs peu Ă©lĂ©gante
YAGW : Mon approche du problĂšme
Tout dâabord Ă©nonçons le contexte.
Je travaille sur un projet basé sur un sytÚme de release cadencé de 3 semaines.
La base de code est en dĂ©but dâautomatisation des tests ( il y a des TU mais trĂšs localisĂ©s ). Aucun tests e2e. Et lâautomatisation de la CI est encore balbutiante.
Notre environnement de collaboration est GitLab et nous utilisons la version Core de celle ci. Nous utilisons déjà les issues et les merge-request.
LâidĂ©e est dâarriver Ă une sĂ©paration dâenvironnement de production et de dĂ©veloppement, tout en sâassurant de gestion plus Ă©lĂ©gante des hotfix que ce que GitLab Flow peut proposer.
La CD devra ĂȘtre capable de dĂ©ployer des environnement diffĂ©rents en fonctions des contextes dâutilisation.
Mon systĂšme se base sur 10 principes:
- Tout ce qui est sur la master est déployable en production
- Tout ce qui est sur la develop est testable par des équipes non techniques et non déployé publiquement
- Un humain ne peut pas faire de commit ni sur la
developni sur lamaster - Chaque release part de la master et se finit dans la develop
- Chaque sprint possĂšde sa branche de release
- Chaque feature possĂšde sa branche feature
- Toute feature avant dâĂȘtre mergĂ© dans la release passe par une merge-request
- Toute release avant dâĂȘtre mergĂ© dans la develop passe par une merge-request
- Tout merge de develop vers master se fait par merge-request
- Les hotfix dérive de develop et finissent dans develop
- Les branches master et develop sont immutables, un commit ajoutĂ© nâest jamais modifiĂ© encore mois supprimĂ©
- Les branches de release peuvent ĂȘtre rebase sur la develop si besoin
- Les dĂ©ploiements de production sont conditionnĂ©s par lâajout dâun tag

Quelques précisions concernants certains points:
Le tag 1.0-fix3 est nĂ©cessaire pour des cause de process lecacy qui ont besoin dâun tag pour fonctionner.
Il est donc autoriser de tagger les commits de la develop Ă des fins de pre-release internes.
La branche feature/4 est une sorte dâanomalie dans le processus. Elle peut soit ĂȘtre dĂ» Ă un dĂ©veloppeur qui fini ses tickets de la release courante et qui sâattaque en avance de phase Ă des fonctionnalitĂ© de la release suivante. Soit câest une feature qui a pris plus de temps que le sprint et qui nâest donc pas terminĂ©e.
Que cela soit lâune ou lâautre lâidĂ©e sera de rebase feature/4 sur la release/1.2.0 lorsque celle existera.
On remarque que la feature/2 ne provient pas du tag 1.0.0 mais du commit de merge de la feature/1. Je considĂšre que les tests de features peuvent sâĂ©taler tout au long dâun sprint et ne sont pas obligatoirement Ă faire Ă la toute fin de celui-ci.
Les branches de release ne sont pas forcé de provenir du commit taggé sur la master mais je trouve plus clean ainsi.
Par contre je considĂšre comme une anomalie dâavoir deux release actives.
LâintĂ©rĂȘt du sytĂšme qui on doit se lâavouer est trĂšs proche de Gitlab Flow est de ne pas considĂ©rĂ© les hotfix comme des commits dâexception.
Le deuxiĂšme intĂ©rĂȘt est de merger quâune seul fois une branche et de pouvoir la dĂ©truire ensuite. Ce qui sâintĂšgre trĂšs bien au processus de merge request de GitLab.
Enfin, les branches de release peuvent servir dâenvironnement de dev, la develop de staging et la master de production.
A la fois develop et master peuvent accueillir des processus de CD.
Avantages
- Peut-ĂȘtre automatisĂ© mais ce nâest pas obligĂ©
- Le code peut ne pas ĂȘtre automatisĂ© en test, les vĂ©rification humaines sont prĂ©sentes
- Permet une séparation en environnement
- Fix le problĂšme de gestions dâhotfix en ne les considĂ©rant pas comme des cas particuliers
Désavantages
- Les merge request peuvent-ĂȘtre nombreuses
- Ne gĂšre quâune version en production Ă la fois
- Se base activement sur GitLab/Github et ses outils de merge/pull request
Conclusion
Je nâai pas la prĂ©tention dâavoir rĂ©volutionnĂ© quoique ce soit.
Je vous prĂ©sente un systĂšme que jâai Ă©prouvĂ© et qui mâa semblĂ© pertinent.
NâhĂ©sitez surtout pas Ă venir dans les commentaires.
Merci beaucoup de mâavoir lu et Ă la prochaine pour de nouvelles aventures. đ