La qualité du code est essentielle dans chaque projet. Cette qualité passe également par des messages de commits explicites. On a beau définir une convention de nom de commit qui commence par le ticket JIRA, il y a toujours un collègue qui l'oublie ou aime un peu trop commencer ses messages par les "fix" , "fix test" ou "add test". Cela rend l'historique des modifications moins lisible et complexifie les releases notes.
Automatiser la vérification des conventions de nommage est la meilleure solution pour éviter et surtout anticiper les erreurs. GIT fournit un outil pour mettre en place cette automatisation : Git Hooks
Qu'est Git Hooks ?
Un hook est un script qui va s'exécuter automatiquement avant ou après des événements Git, tels que <span class="css-span">commit</span>, <span class="css-span">push</span> ou <span class="css-span">receive</span>. Il existe deux types de GIT HOOKs:
- Client : Les scripts sont déclenchés par des événements locaux, par exemple lors d'un commit
- Serveur : Les scripts sont déclenchés par des événements sur le serveur distant, par exemple après un push
Lors de l'initialisation de GIT dans vos projets, il y a à disposition 12 exemples. Pour les activer, il suffit de retirer le <span class="css-span">.sample</span> du nom de fichier.
<pre><code># Contenu du répertoire .git/hooks
applypatch-msg.sample
commit-msg.sample
fsmonitor-watchman.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-merge-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
pre-receive.sample
update.sample</code></pre>
La liste ne se résume pas à ces 12 événements. La commande <span class="css-span">man githooks</span> ainsi que la documentation de Git donneront plus de détails. Les exemples de ces scripts sont principalement écrit en shell ou perl , mais il est possible d'utiliser Ruby, Perl et Python ou même Node, en fonction de ses préférences.
Partager ses hooks
Le problème majeur des Git hooks est qu'ils sont dans un répertoire non versionné par Git, et donc impossible à partager avec son équipe. La solution la plus simple est de créer un répertoire <span class="css-span">.githook</span> à la racine du projet et de venir modifier la variable de configuration des Git Hooks via la commande <span class="css-span">git config core.hooksPath.githooks</span>. Cette action sera à reproduire à chaque clone du projet.
Exécution du CI en local
La plus grande utilisation des Git hooks est principalement une vérification de naming pour les branches ou commit.
On peut également s'en servir comme une sorte de CI locale. Par exemple, avant un commit, on peut :
- Vérifier la qualité du code avec des outils comme ESLint, Prettier ou Stylelint
- Exécuter les tests
- Builder le projet
Avoir une CI en local permet d'éviter une mauvaise habitude de développement qui consiste à commiter son projet avant d'avoir réalisé un build et les tests localement, et déléguer cela à une CI sur un serveur. Les avantages de faire une vérification locale avant un commit sont :
- Se rendre compte plus rapidement de ses erreurs
- Ne pas encombrer les serveurs avec un workflow qui va échouer.
- Réduire les coûts d'utilisation dans le cas d'utilisation d'une solution SAAS
Exemple pour un projet Angular
Ce script s'exécutera avant un commit et vérifiera le nom de la branche ainsi qu'une CI locale afin de vérifier la qualité de code avant de commit.
<pre><code>#.githook/pre-commit
#!/bin/sh
local_branch="$(git rev-parse --abbrev-ref HEAD)"
regex="^main$|^(feature|bugfix|improvement|library|prerelease|release|hotfix)\/[a-z0-9._-]+$"
if [[ ! $local_branch =~ $regex ]]
then
echo "The branch name must respect the format regex: $regex"
exit 1
fi
echo "RUN CI"
npm ci
echo "RUN BUILD"
npm run build
echo "RUN TEST"
npm run test --coverage
echo "RUN LINT"
npm run lint
exit 0</code></pre>
Bypasser un hook
Il y a toujours une exception qui nous contraint de contourner la règle. Dans ce cas, il faut utiliser la commande :
<pre><code>git commit --no-verify -m "commit message"</code></pre>
En résumé
L'automatisation des conventions de code est un moyen qui permet de garder ou d'augmenter la qualité de code d'un projet. Les Git hooks répondent parfaitement à ce besoin en permettant cette automatisation personnalisée à différentes étapes, le tout sans l'utilisation de librairies ou de surcouche.
Un bon café dès le matin et la journée peut commencer pour Aymeric ! Saxophoniste, lillois et fier de l’être et toujours de bonne humeur.
Grand aficionado de Zsh (comme il dit toujours “l’essayer, c’est l’adopter”), c’est aussi un grand fan de TypeScript. C’est tellement plus simple de faire le front et le back avec le même langage !