YAGW : Yet another git workflow

Lecture 11 min. ‱


Table des matiĂšres

la guerre

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

Désavantages

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

Désavantages

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:

  1. Tout ce qui est sur la master est déployable et déployé.
  2. Tout ajout à la master doit préalablement passer par une branche lisiblement nommée dérivée de la master
  3. Le développeur travail jamais sur la master toujours sur sa branche
  4. Lorsqu’il doit collaborer avec une autre personne, une pull-request doit-ĂȘtre crĂ©e.
  5. Une fois la pull-request vérifiée, le reviewer merge la branche sur la master
  6. 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

Désavantages

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:

  1. Ne jamais faire de commit direct sur la master
  2. Tout commits doit bénéficier de tests automatisés, pas seulement sur la branche master
  3. On lance tous les tests, tout le temps. Pas seulement ceux de la feature que l’on dĂ©veloppe
  4. On fait la code review avant le merge sur la master pas aprĂšs.
  5. Tout est automatisé
  6. Les tags doivent ĂȘtre apposĂ©s par un humain, pas un robot
  7. Une release = un tag
  8. Un commit partagé est considéré immutable, jamais de rebase!
  9. Le rĂ©fĂ©rentiel est la master, tout le monde commence d’elle, et finit Ă  elle
  10. Les bugs sont fixĂ©s d’abord sur la master puis sur les releases.
  11. 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

Désavantages

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:

  1. Tout ce qui est sur la master est déployable en production
  2. Tout ce qui est sur la develop est testable par des équipes non techniques et non déployé publiquement
  3. Un humain ne peut pas faire de commit ni sur la develop ni sur la master
  4. Chaque release part de la master et se finit dans la develop
  5. Chaque sprint possĂšde sa branche de release
  6. Chaque feature possĂšde sa branche feature
  7. Toute feature avant d’ĂȘtre mergĂ© dans la release passe par une merge-request
  8. Toute release avant d’ĂȘtre mergĂ© dans la develop passe par une merge-request
  9. Tout merge de develop vers master se fait par merge-request
  10. Les hotfix dérive de develop et finissent dans develop
  11. Les branches master et develop sont immutables, un commit ajoutĂ© n’est jamais modifiĂ© encore mois supprimĂ©
  12. Les branches de release peuvent ĂȘtre rebase sur la develop si besoin
  13. 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

Désavantages

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. 😀