Aller au contenu

Hooks Git

Quelques mots de vocabulaire d’abord (glossaire complet) : Git est le système de contrôle de version qui enregistre l’historique du code ; un commit est un enregistrement daté de modifications accompagné d’un message ; une branche est une ligne de travail parallèle dans l’historique, sur laquelle on accumule des commits sans toucher à la branche principale main ; un push envoie ses commits vers GitHub ; une pull request propose le merge (la fusion) d’une branche dans main, c’est-à-dire l’intégration de ses commits dans la branche principale, après revue.

Un hook Git est un petit script que Git lance automatiquement à certains moments du cycle de vie d’un commit (avant un commit, au moment de rédiger le message, avant un push…). Atlas s’en sert pour vérifier en local — sur la machine du contributeur — ce qui sera vérifié de toute façon en CI. Avantage : on découvre les erreurs immédiatement, sans attendre 3 min de pipeline pour une virgule oubliée.

L’outil qui orchestre les hooks dans Atlas est lefthook. Sa configuration est dans lefthook.yml.

Lefthook s’installe automatiquement quand on lance pnpm install à la racine du dépôt — le script prepare du package.json appelle lefthook install. Aucune action manuelle requise.

Fenêtre de terminal
pnpm install # Installe les dépendances + active les hooks

Pour vérifier que les hooks sont actifs :

Fenêtre de terminal
ls -la .git/hooks/
# Doit lister pre-commit, commit-msg, pre-push

Déclenché à chaque git commit, avant que le commit ne soit créé. S’exécute sur les fichiers modifiés uniquement — donc rapide même sur un gros dépôt.

HookOutilRôle
check-branch(script intégré)Interdit les commits directs sur main
gitleaksgitleaksDétecte les secrets accidentellement écrits dans le code
formatPrettierFormatage cohérent du code
lintESLintRègles de style, fonctionnelles et sécurité
typecheckTypeScriptVérification de types
svelte-checksvelte-checkValidation des fichiers .svelte

Si gitleaks n’est pas installé localement, le hook continue avec un avertissement et délègue le scan à la CI (gitleaks.yml).

Déclenché à la rédaction du message de commit. Vérifie le format Conventional Commits :

type(scope): description courte
[corps optionnel sur plusieurs lignes]
[footer optionnel]

Outil : commitlint. Configuration : commitlint.config.js.

Un script strip-email-line (intégré à lefthook) supprime aussi les lignes contenant des adresses email du message de commit, et nettoie les doubles lignes vides. Cela évite que des emails personnels se retrouvent dans l’historique public.

Déclenché à chaque git push, avant l’envoi au remote (le dépôt distant hébergé sur GitHub). S’exécute sur l’ensemble du dépôt, donc plus lent (~30 s à 2 min selon la machine).

HookCommandeRôle
check-branch(script intégré)Interdit les push directs sur main
check-sync(script intégré)Avertit si la branche n’est pas à jour avec origin/main
check-auditpnpm audit:securityVulnérabilités npm connues
check-licensespnpm audit:licensesCompatibilité des licences
check-structurepnpm audit:structureRespect des règles de structure du monorepo (8 catégories, nommage, dépendances interdites, cycles)
check-dep-versionspnpm audit:dep-versionsCohérence des spécificateurs de version dans le workspace (seulement si un package.json change)
check-lockfilepnpm install --frozen-lockfileCohérence entre package.json et pnpm-lock.yaml (uniquement si touchés)
testpnpm test:coverageSuite de tests complète avec couverture
coverage-reportpnpm coverage:report 40Vérifie que chaque paquet a un rapport de couverture présent et au-dessus de la cible (40 %)
test-scriptspnpm test:scriptsTests des scripts d’outillage du dépôt
dataopspnpm dataops:checkQualité de la catégorie dataops/ (Python : ruff, pytest, manifestes — seulement si dataops/** change)
docs-generatepnpm docs:generate:checkLa carte des paquets est à jour vis-à-vis du code (seulement si un package.json ou un README change)
audit-docspnpm audit:docsCohérence de la documentation : présence, liens internes, ADR référencés, pages orphelines (si la doc change)
cpdpnpm audit:duplicatesDétection de duplication de code (jscpd)
knippnpm audit:unusedDétection de code mort (knip)

Atlas refuse par défaut de contourner les hooks. Les flags --no-verify et équivalents sont à proscrire — un hook qui échoue indique un problème réel.

Si vraiment nécessaire (incident, hotfix), corriger d’abord la cause racine, puis créer un nouveau commit propre. Ne pas committer avec --no-verify pour repousser le problème.

Les hooks pre-commit s’exécutent uniquement sur les fichiers modifiés — leur durée est proportionnelle à la taille de la PR. Si la lenteur vient d’un hook pre-push :

  • test dépend de la couverture du code modifié — un changement dans un paquet très testé prend plus longtemps. Possible de lancer pnpm test:coverage avant le push pour anticiper.
  • cpd et knip sont lents par construction (parcourent tout le dépôt). Ils ne peuvent pas être accélérés sans risque ; ils restent en pre-push pour garantir que rien ne passe à la trappe.