<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
    <title>La Forge - gitops</title>
    <subtitle>Le blog de la Forge</subtitle>
    <link rel="self" type="application/atom+xml" href="https://staging.lafor.ge/tags/gitops/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://staging.lafor.ge"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2020-12-17T00:00:00+00:00</updated>
    <id>https://staging.lafor.ge/tags/gitops/atom.xml</id>
    <entry xml:lang="fr">
        <title>YAGW : Yet another git workflow</title>
        <published>2020-12-17T00:00:00+00:00</published>
        <updated>2020-12-17T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://staging.lafor.ge/gitworkflow/"/>
        <id>https://staging.lafor.ge/gitworkflow/</id>
        
        <content type="html" xml:base="https://staging.lafor.ge/gitworkflow/">&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://media.giphy.com/media/cFkiFMDg3iFoI/giphy.gif&quot; alt=&quot;la guerre&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;A partir du moment où j’ai dû faire de la programmation à plusieurs ( mes personnalités multiples ça compte pas 🤪 ).&lt;/p&gt;
&lt;p&gt;Un problème s’est toujours posé: comment ne pas se marcher sur les pieds.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Avant de présenter YAGW. Je vais faire un tour d’horizon de ce que je connais pour les avoir essayés.&lt;/p&gt;
&lt;h2 id=&quot;no-flow-yolo-8000-av-jc&quot;&gt;No Flow : YOLO ( -8000 av JC )&lt;/h2&gt;
&lt;p&gt;Tout le monde écrit dans la master et personne ne fait de branche, let’s rock baby !&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/no-flow.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Il peut y avoir des tags mais c’est pas dit.&lt;/p&gt;
&lt;h3 id=&quot;avantages&quot;&gt;Avantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pas de charge mentale&lt;/li&gt;
&lt;li&gt;Idéal lorsqu’on est seul&lt;/li&gt;
&lt;li&gt;Très automatisable&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;desavantages&quot;&gt;Désavantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;C’est mort pour collaborer&lt;/li&gt;
&lt;li&gt;Tester c’est douter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bon maintenant qu’on a évacué le troll, passons aux choses sérieuses. 😉&lt;/p&gt;
&lt;h2 id=&quot;gitflow-le-premier-arrive-2010&quot;&gt;Gitflow : le premier arrivé (2010)&lt;/h2&gt;
&lt;p&gt;Quand le développement a commencé à se structurer autours de git. Une méthode appelée &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://danielkummer.github.io/git-flow-cheatsheet/index.fr_FR.html&quot;&gt;gitflow&lt;/a&gt; a vu le jour.
Elle se voulait apte à résoudre toutes les problématiques ou presque.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/gitflow_1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Oui c’est pas évident du tout.&lt;/p&gt;
&lt;p&gt;Pour expliquer la philosophie: elle part du principe que la branche &lt;code&gt;master&lt;/code&gt; ne sert qu’à tagger un historique.&lt;/p&gt;
&lt;p&gt;Cette &lt;code&gt;master&lt;/code&gt; est isolée du reste par des branches éphémères appelées &lt;code&gt;releases&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le coeur de la vie du projet est situé sur la branche &lt;code&gt;develop&lt;/code&gt;, celle ci doit &lt;strong&gt;impérativement&lt;/strong&gt; contenir &lt;strong&gt;tous&lt;/strong&gt; les commits
du projet.&lt;/p&gt;
&lt;p&gt;De cette branche on va dériver tout une série de branches. Celles ci sont appelées des branches de &lt;code&gt;features/X&lt;/code&gt;. Elles peuvent
n’avoir que 2 fins. Mourrir ou être mergées dans la &lt;code&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lorsque l’on désire créer une release, on va dériver à partir d’un commit de la &lt;code&gt;develop&lt;/code&gt; une branche &lt;code&gt;release/X&lt;/code&gt;, ce &lt;code&gt;X&lt;/code&gt; peut représenter
un hash de commit un nom explicite ou une version. 3 destins attend cette branche: mourrir, être remergé dans la &lt;code&gt;develop&lt;/code&gt;
après modifications. Ou être mergé à la fois dans la &lt;code&gt;master&lt;/code&gt; et dans la &lt;code&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans la littérature ils appellent ça des &lt;code&gt;back-merge&lt;/code&gt;. Je trouve personnellement cette solution très peu élégante.
Et surtout difficilement intégrable dans un environnement comme gitlab/github.&lt;/p&gt;
&lt;p&gt;Une dernière série de branches sont appelées &lt;code&gt;hotfix&lt;/code&gt;, elles sont destinées à être mergées à la fois dans la &lt;code&gt;master&lt;/code&gt; et dans la
&lt;code&gt;develop&lt;/code&gt;. Elle permette de corriger des bugs critiques qui seraient passés lors d’un merge d’une branche release dans la &lt;code&gt;master&lt;/code&gt;. Il est
impératif que la &lt;code&gt;develop&lt;/code&gt; contiennent l’intégralité des &lt;code&gt;hotfix&lt;/code&gt; qui ont été mergées dans la &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si ces processus de &lt;code&gt;back-merge&lt;/code&gt; 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 &lt;code&gt;develop&lt;/code&gt; et la &lt;code&gt;master&lt;/code&gt; vont finir par être disjointes. Ce qui
pourrait causer plus tard des soucis de merge de branche &lt;code&gt;release/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://www.endoflineblog.com/gitflow-considered-harmful&quot;&gt;seul&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voilà le résultat d’un arbre après quelques temps d’utilisation de gitflow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/gitflow-mess.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Biensûr il est possible de rendre ça lisible avec &lt;code&gt;git log --graph --oneline --first-parent develop&lt;/code&gt;.
Mais je ne pense pas que ça soit un bon point de devoir changer de référentiel pour comprendre un problème.&lt;/p&gt;
&lt;h3 id=&quot;avantage&quot;&gt;Avantage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il permet de gérer plusieurs versions en production&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;desavantages-1&quot;&gt;Désavantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Beaucoup trop complexe&lt;/li&gt;
&lt;li&gt;Peu automatisable et intégrale dans une CI sans faire des concessions&lt;/li&gt;
&lt;li&gt;Un arbre de commit très peu lisible&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;github-flow-une-simplification-drastique-2011&quot;&gt;Github Flow : Une simplification drastique (2011)&lt;/h2&gt;
&lt;p&gt;A l’époque déjà certaines personnes n’avait pas le besoin de la complexité de gitflow,
dans cet &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;http://scottchacon.com/2011/08/31/github-flow.html&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oui à l’époque chez github ils étaient 30 😁.&lt;/p&gt;
&lt;p&gt;Ce workflow se base sur 6 grands principes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tout ce qui est sur la master est déployable et déployé.&lt;/li&gt;
&lt;li&gt;Tout ajout à la master doit préalablement passer par une branche lisiblement nommée dérivée de la &lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le développeur travail jamais sur la &lt;code&gt;master&lt;/code&gt; toujours sur sa branche&lt;/li&gt;
&lt;li&gt;Lorsqu’il doit collaborer avec une autre personne, une pull-request doit-être crée.&lt;/li&gt;
&lt;li&gt;Une fois la pull-request vérifiée, le reviewer merge la branche sur la &lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si c’est mergé ça doit être déployé!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/github-flow.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;C’est déjà plus clean 🤩.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;J’appellerai ça le déploiement sans filet 🤪.&lt;/p&gt;
&lt;h3 id=&quot;avantages-1&quot;&gt;Avantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Très facile à automatiser dans une CI/CD&lt;/li&gt;
&lt;li&gt;On peut lire le graphe de commit !&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;desavantages-2&quot;&gt;Désavantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dépendant du système externe des pull-requests&lt;/li&gt;
&lt;li&gt;La master peut être instable à tout merge&lt;/li&gt;
&lt;li&gt;Non adapté à des cycles de déployement ( sprint )&lt;/li&gt;
&lt;li&gt;Non adapté au maintient de plusieurs versions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gitlab-flow-automatisation-a-tout-prix-2014&quot;&gt;GitLab Flow : Automatisation à tout prix (2014)&lt;/h2&gt;
&lt;p&gt;Dans un &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://about.gitlab.com/blog/2014/09/29/gitlab-flow/&quot;&gt;article&lt;/a&gt; paru en 2014. Les
équipes de GitLab nous exposent leur manière de procéder.&lt;/p&gt;
&lt;p&gt;Ce processus s’appuie sur 11 règles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ne jamais faire de commit direct sur la master&lt;/li&gt;
&lt;li&gt;Tout commits doit bénéficier de tests automatisés, pas seulement sur la branche &lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;On lance tous les tests, tout le temps. Pas seulement ceux de la feature que l’on développe&lt;/li&gt;
&lt;li&gt;On fait la code review avant le merge sur la &lt;code&gt;master&lt;/code&gt; pas après.&lt;/li&gt;
&lt;li&gt;Tout est automatisé&lt;/li&gt;
&lt;li&gt;Les tags doivent être apposés par un humain, pas un robot&lt;/li&gt;
&lt;li&gt;Une release = un tag&lt;/li&gt;
&lt;li&gt;Un commit partagé est considéré immutable, &lt;strong&gt;jamais&lt;/strong&gt; de rebase!&lt;/li&gt;
&lt;li&gt;Le référentiel est la &lt;code&gt;master&lt;/code&gt;, tout le monde commence d’elle, et finit à elle&lt;/li&gt;
&lt;li&gt;Les bugs sont fixés d’abord sur la &lt;code&gt;master&lt;/code&gt; puis sur les releases.&lt;/li&gt;
&lt;li&gt;Soignez vos messages de commits !&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/gitlab-flow.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Si l’on ne prend que la partie haute du schéma, on retrouve le GithubFlow.&lt;/p&gt;
&lt;p&gt;Ce qui diffère ce sont les deux branches &lt;code&gt;staging&lt;/code&gt; et &lt;code&gt;production&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;La &lt;code&gt;master&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;La &lt;code&gt;staging&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Les bugs post-release sont corrigés dans cette environnement, autrement dit les hotfix internes,
dérivent de la &lt;code&gt;staging&lt;/code&gt; et sont reportées dans la &lt;code&gt;master&lt;/code&gt; puis dans la &lt;code&gt;staging&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le lourd pour finir, la &lt;code&gt;production&lt;/code&gt;, jamais de down, tout ce qui est sur &lt;code&gt;production&lt;/code&gt; a obligatoirement passé par le &lt;code&gt;staging&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;production&lt;/code&gt; et de les merger à la fois dans &lt;code&gt;staging&lt;/code&gt; puis &lt;code&gt;production&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le hotfix dans la &lt;code&gt;staging&lt;/code&gt;, il faut encore la faire descendre dans la &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;avantages-2&quot;&gt;Avantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Par construction, automatisable dans une CI&lt;/li&gt;
&lt;li&gt;Un arbre de commit très propre&lt;/li&gt;
&lt;li&gt;Donne un filet de sécurité avant de déployer des régressions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;desavantages-3&quot;&gt;Désavantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Se base sur un code très automatisé à la base, TU, tests de régression, etc…&lt;/li&gt;
&lt;li&gt;N’est pas conçu pour gérer plusieurs versions en production en parallèle&lt;/li&gt;
&lt;li&gt;Les hotfix sont gérées d’une manière très peu élégante&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;yagw-mon-approche-du-probleme&quot;&gt;YAGW : Mon approche du problème&lt;/h2&gt;
&lt;p&gt;Tout d’abord énonçons le contexte.&lt;/p&gt;
&lt;p&gt;Je travaille sur un projet basé sur un sytème de release cadencé de 3 semaines.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;La CD devra être capable de déployer des environnement différents en fonctions des contextes d’utilisation.&lt;/p&gt;
&lt;p&gt;Mon système se base sur 10 principes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tout ce qui est sur la master est déployable en production&lt;/li&gt;
&lt;li&gt;Tout ce qui est sur la develop est testable par des équipes non techniques et non déployé publiquement&lt;/li&gt;
&lt;li&gt;Un humain ne peut pas faire de commit ni sur la &lt;code&gt;develop&lt;/code&gt; ni sur la &lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Chaque release part de la master et se finit dans la develop&lt;/li&gt;
&lt;li&gt;Chaque sprint possède sa branche de release&lt;/li&gt;
&lt;li&gt;Chaque feature possède sa branche feature&lt;/li&gt;
&lt;li&gt;Toute feature avant d’être mergé dans la release passe par une merge-request&lt;/li&gt;
&lt;li&gt;Toute release avant d’être mergé dans la develop passe par une merge-request&lt;/li&gt;
&lt;li&gt;Tout merge de develop vers master se fait par merge-request&lt;/li&gt;
&lt;li&gt;Les hotfix dérive de develop et finissent dans develop&lt;/li&gt;
&lt;li&gt;Les branches master et develop sont immutables, un commit ajouté n’est jamais modifié encore mois supprimé&lt;/li&gt;
&lt;li&gt;Les branches de release peuvent être rebase sur la develop si besoin&lt;/li&gt;
&lt;li&gt;Les déploiements de production sont conditionnés par l’ajout d’un tag&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/gitworkflow/yagw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Quelques précisions concernants certains points:&lt;/p&gt;
&lt;p&gt;Le tag &lt;code&gt;1.0-fix3&lt;/code&gt; est nécessaire pour des cause de process lecacy qui ont besoin d’un tag pour fonctionner.&lt;/p&gt;
&lt;p&gt;Il est donc autoriser de tagger les commits de la develop à des fins de pre-release internes.&lt;/p&gt;
&lt;p&gt;La branche &lt;code&gt;feature/4&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Que cela soit l’une ou l’autre l’idée sera de rebase &lt;code&gt;feature/4&lt;/code&gt; sur la &lt;code&gt;release/1.2.0&lt;/code&gt; lorsque celle existera.&lt;/p&gt;
&lt;p&gt;On remarque que la &lt;code&gt;feature/2&lt;/code&gt; ne provient pas du  &lt;code&gt;tag  1.0.0&lt;/code&gt; mais du commit de merge de la &lt;code&gt;feature/1&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;Les branches de release ne sont pas forcé de provenir du commit taggé sur la &lt;code&gt;master&lt;/code&gt; mais je trouve plus clean ainsi.&lt;/p&gt;
&lt;p&gt;Par contre je considère comme une anomalie d’avoir deux &lt;code&gt;release&lt;/code&gt; actives.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Enfin, les branches de release peuvent servir d’environnement de dev, la develop de staging et la master de production.&lt;/p&gt;
&lt;p&gt;A la fois develop et master peuvent accueillir des processus de CD.&lt;/p&gt;
&lt;h3 id=&quot;avantages-3&quot;&gt;Avantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Peut-être automatisé mais ce n’est pas obligé&lt;/li&gt;
&lt;li&gt;Le code peut ne pas être automatisé en test, les vérification humaines sont présentes&lt;/li&gt;
&lt;li&gt;Permet une séparation en environnement&lt;/li&gt;
&lt;li&gt;Fix le problème de gestions d’hotfix en ne les considérant pas comme des cas particuliers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;desavantages-4&quot;&gt;Désavantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Les merge request peuvent-être nombreuses&lt;/li&gt;
&lt;li&gt;Ne gère qu’une version en production à la fois&lt;/li&gt;
&lt;li&gt;Se base activement sur GitLab/Github et ses outils de merge/pull request&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Je n’ai pas la prétention d’avoir révolutionné quoique ce soit.&lt;/p&gt;
&lt;p&gt;Je vous présente un système que j’ai éprouvé et qui m’a semblé pertinent.&lt;/p&gt;
&lt;p&gt;N’hésitez surtout pas à venir dans les commentaires.&lt;/p&gt;
&lt;p&gt;Merci beaucoup de m’avoir lu et à la prochaine pour de nouvelles aventures. 😀&lt;/p&gt;
</content>
        
    </entry>
</feed>
