L'art du changelog
En tant que Release Manager, j’ai la charge de générer un changelog lisible des features, bugs fixes, améliorations et autres devs entre chaque release. Ce changelog est ensuite réécrit par la team marketing pour le rendre user-friendly.
Pour réaliser ce changelog, je me base sur le log de Git qui, si les devs ont bien fait leur travail ;-), contient toutes les informations utiles. À la base je le faisais manuellement, autant vous dire que c’était une tâche fastidieuse et peu intéressante. Le jour où j’en ai vraiment eu marre, j’ai commencé à chercher un moyen de le générer automatiquement. J’ai alors regardé du côté des libraries open-source très connues comme AngularJS. Ils ont tous un beau changelog qui, de toute évidence, est tout droit sorti des entrailles d’un générateur automatique… En creusant je me suis rendu compte que ce changelog était aussi généré à partir du log de Git, mais chaque commit avait l’air de suivre une règle bien précise.
Voici donc la recette pour générer un changelog tout beau tout propre si, comme moi, vous utilisez Git, NPM et Gulp :
Tout d’abord, il faut faire chier les développeurs ^^, et tout le monde sait qu’ils détestent qu’on change leurs habitudes. Mais c’est pour la bonne cause et, au final, ils vont vite se rendre compte que c’est quand même plus clair et surtout très utile. Je les ai donc obligé, dans chacun de nos repository, à respecter une convention de nommage pour les commits. Pour cela, j’ai utilisé un petit package NPM au doux nom de angular-precommit
.
Ce plugins s’ajoute directement à Git via les hooks. Si vous ne connaissez pas, je vous conseille d’aller faire un tour sur la doc de Git.
Voici comment on l’utilise :
Juste avant de créer le commit, Git va lancer le petit script qui va bien. Celui-ci va vérifier le format du commit, afficher un message s’il est incorrect et, si besoin, annuler la création commit. Pour être sûr que le script soit installé sur la machine de chaque développeur, je l’ai ajouté en postinstall
du fichier package.json
.
Ainsi, quand le développeur lance un npm install
, le hook Git s’ajoute automatiquement.
Voici à quoi doit ressembler un commit : <type>(<scope>): <subject>
- Où
type
est un mot clé au choix parmisamend
,feat
,fix
,docs
,style
,refactor
,perf
,test
,chore
ourevert
. scope
correspond au module auquel le commit fait référence (voire “module/sous-module” dans certains cas).- Et
subject
, la description habituelle du développement effectué.
Au bout de quelques semaines on a commencé à avoir un Git log propre et uniforme, c’était donc le moment de mettre en place la génération automatique du changelog. Pour cela j’ai utilisé le module gulp-conventional-changelog
qui, en une seule commande, génère un changelog à partir des commits entre deux releases. Ce plugin gère différentes conventions de nommage dont celle d’Angular, ça tombe bien, c’est celle qu’on utilise ;-).
Voici comment on l’implémente :
Ensuite, vous n’avez plus qu’à créer un commit de release (en modifiant par exemple la clé version
du fichier package.json).
Puis taper gulp changelog
dans votre terminal et le tour est joué !
Le plugin va prendre tous les commits depuis la dernière release (à priori le dernier tag, mais j’avoue ne pas avoir regardé en détail comment ça fonctionne), les ordonner, les reformuler puis réécrire le fichier CHANGELOG.md
. Et voilà le résultat (tiré du changelog de gulp-conventional-changelog
) :
Et voilà le secret pour sortir un super changelog de manière automatisé et, par la même occasion, donner quelque bonnes habitudes à vos développeurs pour bien nommer et typer leurs commits !
Happy coding!