Continuous merge
avec git-octopus

Alexandre Dubreuil

Une histoire de transformation vers le continuous delivery

  • 2012 : 12 releases en sprint scrum mensuel
  • 2013 : 45 releases en sprint scrum hebdo
  • 2014 : 208 releases
  • 2015 : 225 releases en kanban daily delivery
  • 2016 : 260 releases avec release 2 heures

Chez LesFurets.com, le continuous delivery est un process

Une partie importante de ce process est le continuous merge : il nous permet de travailler en feature branching

feature branching : on part d'un master

feature branching : création d'une branche de développement features/f1

feature branching : création d'une branche de développement features/f2

Merge pre-build : merge de master sur la branche avant le build. Les outils IC permettent de faire le merge simple automatique.

Avec une code base en feature branching, chaque feature est sur une branche dédiée, la prochaine release est la fusion du master et des features, les développements avancent en isolation, et on livre une branche lorsqu'elle est prête.

On perd l'intégration continue et la gestion des conflits

On veut une code base en feature branching (pour sa flexibilité) et on veut faire du continuous delivery (pour sa valeur ajoutée), sans perdre l'intégration continue.

Autrement dit, comment réconcilier feature branching et intégration continue ?

On fait du continuous merge !

Continuous merge

Réconcilier feature branching et intégration continue,
et détecter les conflits rapidement.

Feature branching : historiques indépendants de features/f1 et features/f2

Continuous merge : merge de features/f1 et features/f2 avec master

continuous merge : nouveau commit sur features/f1

continuous merge : fusion automatique


# Fusion plusieurs branches avec pattern
git merge features/*
        

Mais le merge de plusieurs branches à partir d'un pattern n'existe pas dans git...

LesFurets git-octopus :
https://github.com/lesfurets/git-octopus

On garde l'intégration continue

On livre ce qui est prêt grâce au feature branching

Peu d'investissements pour mettre en place (git, jenkins, git-octopus)

Facile de passer à l'echelle

On constitue facilement les environnements dev avec toutes les features, stage pour la validation, preprod pour les tickets validés

Et comment gérer les conflits ?

gestion des conflits

gestion des conflits : une nouvelle branche sauvage features/new apparaît

gestion des conflits : git-octopus merge KO

gestion des conflits : git merge simple master et features/new OK

gestion des conflits : git merge simple features/f1 et features/new OK

gestion des conflits : git merge simple features/f2 et features/new KO

Gestion de conflits

L'utilisation de git-octopus dans l'intégration continue permet de détecter tôt les conflits

On défini le risque d'une résolution de conflit lorsqu'on ajoute une dépendance entre deux branches

Une dépendance entre deux branches nous enlève la possibilité de livrer une branche dès qu'elle est prête

Éviter le conflit au niveau du code

Avoir des conventions de code communes, éviter les binaires, avoir un code modulaire, évoluer par abstraction

RISQUE : faible

Enlever la branche de l'octopus

Si deux branches sont en conflits, on peut souvent en enlever une en attendant que l'autre soit dans le master

Règle générale, éviter les branches de longue durée

RISQUE : faible

Fusionner la branche

On peut merger l'historique des deux branches pour résoudre le conflit : on perd alors la possibilité de livrer séparément

On peut aussi utiliser une branche partagée pour du code commun

RISQUE : danger

Rebaser la branche

On garde alors une certaine flexibilité dans la livraison

Utile pour livrer des branches par étape, ou lorsqu'on sait qu'une branche partira avant une autre

RISQUE : danger

git-conflict : résolution de conflit partagé

git-conflict est livré avec git-octopus et permet de persister la résolution de conflit à l'extérieur d'une branche

Permet l'évolution indépendantes des branches

Nécessite de valider le contenu des résolutions de conflit

RISQUE : attention

git-conflict : git-octopus features/* KO à cause de features/new

git-conflict : dépôt résolution de conflit situé sous conflict/resolutions

git-conflict : git merge simple features/f2 et features/new KO

git-conflict : git-octopus regarde s'il y a une résolution de conflit disponible

git-conflict : git-octopus features/* OK

Continuous delivery chez LesFurets.com

L'objectif est de trouver les conflits le plus rapidement possible, de pouvoir les corriger le plus tôt possible, et de pouvoir livrer une feature dès qu'elle est prête

La détection des conflits pour tous

git octopus peut être utilisé par n'importe quelle équipe pour valider le conflit entre les branches

git octopus pour valider les conflits entre vos
pull requests

Ajoutez git-octopus à votre CI dès maintenant !

        
# Linux & Cygwin
git clone git@github.com:lesfurets/git-octopus.git
cd git-octopus && make install
# Mac
brew update
brew install git-octopus
        
      

Références

Code source git octopus sur github
https://github.com/lesfurets/git-octopus

Forum git octopus sur Google Groups
https://groups.google.com/forum/#!forum/git-octopus

Blog technique sur git octopus
https://beastie.lesfurets.com/projets/

Ces slides
https://github.com/lesfurets/lesfurets-conferences

FIN