Articles
Aug 23, 2024

Blinder son code avec Husky

L'outil Husky permet d'améliorer la qualité du code en ajoutant des hooks Git tels que pre-commit et pre-push.

Blinder son code avec Husky

Introduction à Husky pour les Hooks de Pre-Commit et Pre-Push

L'outil Husky permet d'améliorer la qualité du code en ajoutant des hooks Git tels que pre-commit et pre-push. Ces hooks automatisent l'exécution de scripts à des étapes spécifiques du cycle de vie Git, comme vérifier la qualité du code ou lancer des tests avant de committer ou pusher les modifications.

Dans cet article, nous allons expliquer comment configurer et utiliser Husky pour mettre en place des hooks de pre-commit et pre-push, avec des exemples concrets de code.

Installation de Husky

Tout d'abord, installez Husky comme une dépendance de développement dans votre projet en utilisant npm ou yarn.

yarn add --dev husky
# Ajouter pinst uniquement si votre repo n'est pas privé
yarn add --dev pinst 

Ensuite, il suffit de lancer

npx husky init

Mise en place des hooks

pre-commit

Vous constaterez qu'un dossier .husky a été ajouté à votre projet et à l'interieur un fichier pre-commit. Ouvrez ce fichier.

Il contient pour le moment seulement "npm". A vous de l'éditer pour y mettre n'importe quelle commande que vous souhaitez voire exécutée avant un commit.

De mon côté je mets juste un

yarn lint

ET VOILÀ !

Plus qu'à tester en faisant

git commit

La commande lint devrait se lancer automatiquement avant de commit.

pre-push

Si vous souhaitez executer des commandes avant de push, il vous suffit de créer un fichier pre-push et d'y mettre ce que vous souhaitez.

Chez moi j'ai

yarn lint
yarn test
yarn type-check
# reject push if your branch is main or staging
branch=`git branch --show-current`
if [ "$branch" = "staging" ] || [ "$branch" = "main" ]
then  
echo "You're trying to push on "${branch}"!\nIf this is intentional, then rerun you command and add --no-verify flag."  
exit 1
fi

La deuxième partie du script empêche de pusher trop rapidement sur main (la prod) ou staging (en fonction de votre cas). Vous devrez pusher en utilisant --no-verify

Voici le contenu de mon package.json où sont renseignés mes scripts

"scripts": {
  "type-check": "tsc --project tsconfig.json --pretty --noEmit",
  "lint": "eslint --ext .ts,.tsx,.js,.jsx --fix .",
  "test": "jest --passWithNoTests",
},

type-check

  • tsc : Commande pour exécuter le compilateur TypeScript.
  • --project tsconfig.json : Spécifie le fichier de configuration TypeScript (tsconfig.json) à utiliser.
  • --pretty : Rend le retour d'erreur plus lisible avec des couleurs.
  • --noEmit : Empêche le compilateur TypeScript de générer des fichiers JavaScript, vérifiant uniquement les types sans produire de sortie.

lint

  • --ext .ts,.tsx,.js,.jsx : Spécifie les extensions de fichiers à inclure dans la vérification.
  • --fix : Tente de corriger automatiquement les erreurs de linting.
  • . : Spécifie le répertoire actuel comme scope, ce qui signifie que ESLint va vérifier toutes les extensions spécifiées dans le répertoire de projet courant.

test

  • jest : Commande pour exécuter Jest, un framework de test pour JavaScript.
  • --passWithNoTests : Permet au processus de test de passer même s'il n'y a pas de tests détectés.
Pourquoi relancer yarn lint au push si on le lance déjà au commit ?

Imaginez la chose suivante :

Vous pouvez choisir de ne pas lancer les hooks husky en utilisant l'option --no-verify à la suite de git commit. Cela peut arriver si vous êtes sur une feature branch et que vous souhaitez vite tester un résultat en déploiement ou juste sauvegarder rapidement votre travail en fin de journée. Le linter ne sera donc pas passé sur tous les commits. Ce risque est encore plus grand si vous êtes plusieurs à travailler sur même branche.

Cela ne prend que 2 ou 3 sec à lancer et au moins vous êtes tranquilles.

Vous avez plein d'autres possibilités de hooks comme vous pouvez le voir dans le contenu du dossier .husky/_

A vous de paramétrer husky en fonction de vos besoins.

Conclusion

En utilisant Husky, vous pouvez facilement automatiser l'exécution de scripts pour garantir la qualité de votre code avant les commandes git les plus courantes. Que ce soit pour exécuter des linters, lancer des tests ou tout autre script personnalisé, Husky offre une solution flexible et efficace pour gérer vos hooks Git. Adopter cette pratique contribue à maintenir un codebase propre et sans erreurs, augmentant ainsi la productivité de toute l'équipe de développement.