Outils nécessaires :
- Commitlint + plugin config-conventional
- Husky : Permet d'ajouter un hook sur le commit GIT permettant de déclencher le lint avant de valider le commit
- https://github.com/typicode/husky
- Doc officielle : https://typicode.github.io/husky/
- Commitizen
Installation et utilisation locale
Installation et configuration
On veut une utilisation globale du linter sur le projet, on installera donc la dépendance au niveau du package.json
à a racine (cf. centralisation des fichiers package.json
via les workspaces).
Depuis un terminal, dans dev/
:
npm install --save-dev @commitlint/config-conventional @commitlint/cli
Créer ensuite un fichier de configuration .commitlintrc.json
au même endroit avec la conf suivante :
{ "extends": ["@commitlint/config-conventional"], "rules": { "body-case": [2, "always", "sentence-case"], "body-max-line-length": [1, "always", 72], "header-max-length": [1, "always", 52], "type-enum": [2, "always", [ "build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "security", "style", "test" ] ] } }
Installer ensuite Husky. Cet outil va permettre de créer des hooks sur les commits GIT, et donc va nous permettre de valider le message du commit via commitlint avant que le projet ne soit commité.
Toujours au même endroit, depuis le terminal :
npm install --save-dev husky
Ensuite pour activer les hooks, il faut se rendre à l'endroit où se trouve le dossier de config .git/
soit tout en haut de notre projet (au dessus de dev/
).
Depuis un terminal, se rendre donc à la racine du projet, et exécuter la commande :
npx husky install
Un nouveau dossier .husky/
devrait alors apparaître.
On va alors lui indiquer la commande commitlint à exécuter au moment d'un commit en ajoutant un hook commit-msg :
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit ${1} --config $(dirname -- "$0")/../dev/.commitlintrc.json'
Un fichier commit-msg
devrait apparaître dans le dossier .husky/
contenant la commande commitlint à exécuter à chaque commit.
Utilisation en local
A présent, dès lors que le message de votre commit ne répondra pas au nommage conventionnel, commitlint vous retournera une erreur et le commit ne passera pas.
Exemples de commit qui ne passe pas
Ici, le commit ne passe pas car le type (build, ci, fix, feat...) n'est pas précisé.
Ici, le type précisé (docker:) n'est pas autorisé par la liste des types définis par la convention de Angular.
Ici le commit ne passe pas car le sujet du message ne doit pas commencer par une majuscule.
Exemple de commit qui passe
Utilisation de l'outil commitizen pour faciliter la rédaction des commits
Installer commitizen sur le projet
$ npm install --save-dev commitizen
Ensuite, initialiser commitizen sur le projet, dans dev/
$ npx commitizen init cz-conventional-changelog --save-dev --save-exact
Modifier la conf de commitizen. Éditer le fichier package.json
à la racine :
{ ... "devDependencies": { "cz-conventional-changelog": "^3.3.0" }, "config": { "commitizen": { "path": "./dev/node_modules/cz-conventional-changelog" } } }
Une fois les modifications apportées au code et ajouté à GIT, il suffit d'exécuter la commande suivante :
$ npx cz