Pour moi, on a clairement 2 problèmes différents et spécifiques en fait :
Version pré-v1.0
État
Tant qu'on a pas réussi à stabiliser une version v1.0, on a des corrections gigantesques (plusieurs centaines de lignes modifiées) qui sont à peu près impossibles à merger (vers dev) sans risques de conflits. On a aussi une grosse masse de corrections qui arrivent.
Conséquence : on a pas les ressources pour merger tout ce bordel en permanence dans dev
, qui du coup prends un retard monstrueux et devient de fait inutilisable (la moindre feature risque de provoquer de gros conflits avec les corrections massives).
Proposition de workflow
L'idée est en fait de ne travailler que sur master, en tant que branche de release.
- On stabilise une v1.0 sur
master
le plus vite possible.
- Le scope de la v1.0 correspond uniquement aux issues de la milestone v1.0 sur Github
- On ne merge rien sur
dev
tant que la v1.0 n'est pas stabilisée. Le développement de features non prioritaire est autorisé, mais elles attendront. Les développeurs sont mis au courant de cet état de fait.
- Il est interdit de corriger sur
dev
des problèmes corrigés sur la branche de relase master
(pour prévenir les conflits)
- Une fois la v1.0 stabilisée, on merge les modifs sur prod (facile) et sur dev (merge sale à prévoir, mais pas trop si on s'interdit de trop modifier
dev
– en particulier les corrections parallèles)
- On MEP la v1.0
- On supprime
master
(sisi, cf infra) et on passe au workflow suivant
Avantages / Pourquoi ça devrait marcher
- On corrige le plus urgent
- On évite le travail sur des branches parallèles donc les conflits
- On décourage la dispersion du travail sur des fonctionnalités non prioritaires
- On évite de perdre du temps à faire des merges dans tous les sens
Inconvénients
- Il y a un côté frustrant à ne pas pouvoir faire avancer des fonctionnalités non urgentes
- Ça implique d'être intraitable au niveau du merge des issues : si une issue ne concerne pas un ticket v1.0, elle n'est pas mergée, point barre
Versions > v1.0
État
Là normalement, on est dans un état "suffisamment stable". Conséquences :
- On peut se permettre d'utiliser une workflow de MEP à base de releases et de QA en préprod comme décrit ici
- On ne devrait plus avoir de bugs tellement importants qu'ils nécessitent d'énormes modifications (on a par contre des fonctionnalités pour lesquelles c'est le cas).
Proposition de workflow
L'idée est de suivre le Git Flow. Très exactement le Git Flow, pas notre version modifiée bâtarde qu'on suit actuellement. La seule modification serait le nom des branches.
C'est-à-dire :
- Les arrivées fonctionnalités et corrections de gros bugs hors release se font via des PR.
- Ces PR sont d'une taille raisonnable autant que possible (mieux vaut plusieurs PR compréhensibles qu'une PR géante)
- Ces PR sont mergées dans
dev
(develop
dans le standard), après une QA légère. dev
ne devrait contenir que des merge de PR, aucun commit direct.
- Quand on a assez de nouveautés dans
dev
(mais pas trop), on décide de faire une release. L'idée est de pouvoir vérifier et corriger les problèmes de cette release rapidement, disons en 2 semaines max entre le lancement de la release et sa MEP :
- On crée une nouvelle branche de release (contrairement à aujourd'hui où on utilise
master
), typiquement du nom de la version (ex : release-v1.2
)
- La branche est balancée en préprod, avec un dump des données de prod. On teste un max sur la préprod.
- Si on en a les ressources, les correctifs de la branche de release sont remontés sur
dev
. Sinon, tant pis.
- Une fois la branche de release bien stabilisée, on la met en prod :
- On merge la branche de release dans
dev
. Si on a pas pu merger les correctifs indépendamment, tant pis : ils devrait y en avoir peu, plutôt petits, et la procédure de release devrait être assez courte pour que ça ne pose pas de vrai problème de merge (contrairement à aujourd'hui).
- On merge la branche de relase dans
prod
(master
dans le standard) (cf infra)
- On taggue
- On MEP
- On supprime la branche de release, qui est devenue inutile
On a donc un workflow a 2 branches (dev
– qui devient la branche principale et prod
), 3 pendant les périodes de release.
Pour que ça fonctionne, l'important est de choisir le contenu des releases de façon à conserver un cycle de stabilisation court.
Pourquoi je propose de garder la branche prod
Théoriquement on pourrait la supprimer, en conservant les branches de release et en les tagguant.
Je propose néanmoins de garder la branche prod
pour les raisons suivantes :
- Facilité de faire des hotfix urgents sur la prod, même pendant la période de stabilisation (on peut s'en sortir sans, mais ça nécessite de repartir de tags et de réfléchir à des trucs pas nets)
- Principe de moindre surprise : le workflow suppose que cette branche existe
- Elle ne coûte rien à maintenir, puisque aucun merge dans cette branche n'est sensé poser de problème
- On peut benner les branches de stabilisation sans scrupule ni risque de perdre des commits
- On a en permanence seulement 2 ou 3 branches (sur le dépôt principal, les branches de features sont sur les fork) au lieu de (nombre de releases + 2) ou de (1 ou 2 mais avec les tags sur
dev
)
Avantages / Pourquoi ça devrait marcher
- Aucune surprise sur le workflow : il est connu et documenté de partout. Et on sait qu'il fonctionne.
- Le cycle de release court devrait nous éviter les problèmes actuels (merges invraisemblables muliples et coûteux, branche
dev
bloquée pendant 107 ans donc inutilisable, etc)
- Il permet d'alléger la QA : on peut se contenter d'une QA légère sur les PR quand on les merge dans
dev
, puisqu'on a une vraie QA complète au moment de la release.
- Ca aide le fonctionnement en releases (cf cette proposition et ci-dessous)
Inconvénients
- Si jamais on découvre qu'une fonctionnalité nécessite une grosse correction au moment de la stabilisation, on peut avoir un merge dans
dev
assez douloureux
- Tout le monde doit respecter le workflow : tout ajout de fonctionnalité sauvage dans la branche de stabilisation risque de provoquer des conflits
- La stabilisation peut être délicate si les PR qu'on a sélectionnées pour la release s'avèrent bugguées.
Pourquoi il est important de faire des releases et d'éviter la rolling-release
Principalement parce que la qualité est une grosse attente de la part de notre public. Les mises en production en mode "on met ce qu'on a en prod et on corrige vite fait les gros bugs" ont été tentées par un autre site, avec le résultat que l'on sait. Il nous a explicitement été demandé de ne pas fonctionner selon ce mode dans les différents topics : un fonctionnement par releases / QA sur préprod devrait permettre d'éviter les plus gros bugs.
Alors je sais, "le mode web" serait plutôt de mettre à jour souvent et de considérer qu'on est jamais 100% finis.
Mais pour moi ce n'est pas incompatible, puisque :
- Les releases ne correspondent pas à un état "fini" mais à un état "suffisamment stable pour être mis à la disposition du public".
- On ne parle pas de faire des gigantesques releases tous les 2 ans, mais des petites releases fréquentes, ce qui du point de vue utilisateur nous rapproche de la rolling release, le contrôle qualité sur l'ensemble de l'application en plus.