Automatiser les vérifications de code avec les hooks pre-commit de Git

Tous les développeurs connaissent la frustration de pousser du code pour voir ensuite les pipelines CI/CD échouer à cause de problèmes de formatage ou d’erreurs de linting. Et si vous pouviez détecter ces problèmes avant même qu’ils n’atteignent votre dépôt ? Les hooks pre-commit de Git offrent une solution puissante qui exécute des vérifications automatisées localement, permettant d’économiser du temps et de maintenir une qualité de code cohérente au sein de votre équipe.
Cet article vous guide dans la configuration des hooks pre-commit de git en utilisant le framework pre-commit, la configuration d’outils essentiels comme ESLint, Prettier et Black, et l’implémentation de bonnes pratiques qui maintiennent votre flux de développement fluide et efficace.
Points clés à retenir
- Les hooks pre-commit de Git exécutent des vérifications automatisées avant les commits, empêchant les problèmes courants d’atteindre votre dépôt
- Le framework pre-commit simplifie la gestion des hooks avec une configuration YAML et un support multi-langage
- L’optimisation de la vitesse et l’adoption progressive sont cruciales pour l’acceptation par l’équipe
- Des outils alternatifs comme Husky et Lefthook offrent différentes approches pour des besoins spécifiques
Que sont les hooks pre-commit de Git ?
Les hooks Git sont des scripts que Git exécute avant ou après des événements tels que commit, push et receive. Un hook pre-commit de git s’exécute spécifiquement après que vous ayez mis en stage vos modifications mais avant que Git ne crée le commit. Si le hook se termine avec un statut non-zéro, Git annule le commit, vous donnant une chance de corriger les problèmes en premier.
Bien que vous puissiez écrire des hooks sous forme de simples scripts shell dans .git/hooks/
, leur gestion devient complexe à mesure que votre projet grandit. C’est là que le framework pre-commit excelle—il fournit une façon standardisée de gérer et partager les hooks au sein de votre équipe.
Pourquoi utiliser le framework pre-commit ?
Le framework pre-commit résout plusieurs points douloureux des hooks Git natifs :
- Installation et mises à jour faciles : Les hooks sont versionnés et installés via une simple configuration YAML
- Agnostique au langage : Exécutez des linters Python, des formateurs JavaScript et des scripts shell depuis une seule configuration
- Exécution sélective : Les hooks s’exécutent uniquement sur les fichiers modifiés, gardant les commits rapides
- Cohérence d’équipe : Partagez le même fichier
.pre-commit-config.yaml
dans toute votre équipe
Configuration de pre-commit dans votre projet
D’abord, installez le package pre-commit :
pip install pre-commit
Créez un fichier .pre-commit-config.yaml
à la racine de votre projet. Voici une configuration pratique qui couvre les besoins courants :
repos:
# Basic file fixes
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
# Python formatting with Black
- repo: https://github.com/psf/black
rev: 24.2.0
hooks:
- id: black
files: \.py$
# Python type checking with Mypy
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0
hooks:
- id: mypy
additional_dependencies: [types-all]
files: \.py$
# JavaScript/TypeScript with Prettier
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.1.0
hooks:
- id: prettier
files: \.(js|jsx|ts|tsx|json|css|md)$
# JavaScript/TypeScript linting with ESLint
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.56.0
hooks:
- id: eslint
files: \.(js|jsx|ts|tsx)$
additional_dependencies:
- eslint-config-standard
- eslint-plugin-react
# Run project tests
- repo: local
hooks:
- id: pytest
name: pytest
entry: pytest
language: system
pass_filenames: false
always_run: true
Installez les hooks git :
pre-commit install
Maintenant vos hooks s’exécuteront automatiquement à chaque commit. Pour les exécuter manuellement sur tous les fichiers :
pre-commit run --all-files
Discover how at OpenReplay.com.
Optimisation des performances des hooks
La vitesse compte—des hooks lents découragent les développeurs de commiter fréquemment. Suivez ces pratiques :
Exécutez les hooks uniquement sur les fichiers en stage : Le framework pre-commit fait cela par défaut, mais assurez-vous que vos hooks personnalisés respectent ce modèle.
Utilisez des outils rapides : Choisissez Ruff plutôt que Flake8 pour Python, ou Biome plutôt qu’ESLint pour JavaScript quand la vitesse est critique.
Évitez les vérifications coûteuses localement : Réservez les suites de tests complètes pour CI/CD. Les hooks locaux doivent se concentrer sur des gains rapides comme le formatage et le linting de base.
Parallélisez quand c’est possible : Certains outils supportent l’exécution parallèle. Par exemple, pytest peut exécuter des tests en parallèle avec pytest-xdist
.
Bonnes pratiques d’adoption en équipe
Faire adopter les hooks pre-commit par votre équipe nécessite une implémentation réfléchie :
Commencez petit : Débutez avec des hooks non-intrusifs comme la suppression des espaces en fin de ligne. Ajoutez des vérifications plus strictes progressivement.
Documentez la configuration : Incluez les instructions d’installation dans votre README. Faites-en partie de votre processus d’intégration.
Gérez les différences d’environnement : Utilisez des hooks agnostiques au langage quand c’est possible. Pour les outils spécifiques à un langage, assurez-vous que votre .pre-commit-config.yaml
spécifie des versions compatibles.
Fournissez des échappatoires : Parfois les développeurs ont besoin de contourner les hooks. Le flag --no-verify
ignore tous les hooks :
git commit --no-verify -m "Emergency fix"
Utilisez ceci avec parcimonie et documentez quand c’est approprié.
Approches alternatives
Bien que pre-commit soit le framework le plus populaire, des alternatives existent :
Husky : Populaire dans les projets JavaScript, s’intègre bien avec les scripts npm.
Hooks Git natifs : Des scripts shell directs dans .git/hooks/
offrent un contrôle maximum mais manquent de portabilité.
Lefthook : Alternative rapide et multi-plateforme avec support d’exécution parallèle.
Pour la plupart des équipes, pre-commit offre le meilleur équilibre entre fonctionnalités, performance et support de l’écosystème.
Pièges courants et solutions
Échecs de hooks en CI : Assurez-vous que les environnements CI ont toutes les dépendances nécessaires installées. Considérez l’exécution de pre-commit run --all-files
comme étape CI.
Problèmes spécifiques aux plateformes : Testez les hooks sur toutes les plateformes utilisées par votre équipe. Utilisez Docker pour des environnements cohérents si nécessaire.
Conflits de merge dans les fichiers de configuration : Gardez les modifications de .pre-commit-config.yaml
minimales et atomiques. Mettez à jour les versions des hooks dans des commits séparés.
Conclusion
Les hooks pre-commit de Git transforment la qualité du code d’un processus réactif en processus proactif. En détectant les problèmes avant qu’ils n’entrent dans votre dépôt, vous économisez du temps, réduisez les changements de contexte et maintenez des standards plus élevés dans votre base de code. Commencez avec des hooks de formatage de base, ajoutez progressivement des linters et des vérificateurs de types, et priorisez toujours la vitesse pour maintenir le flux de travail de votre équipe fluide.
La clé d’une adoption réussie réside dans l’équilibre entre exhaustivité et expérience développeur. Des hooks rapides et ciblés qui apportent une valeur immédiate deviendront une partie indispensable du flux de travail de votre équipe.
FAQ
Oui, pre-commit excelle avec les monorepos. Vous pouvez configurer différents hooks pour différents motifs de fichiers et répertoires. Utilisez les clés files et exclude dans votre configuration pour cibler des langages ou dossiers spécifiques dans votre dépôt.
Utilisez des gestionnaires de versions de langage comme nvm ou pyenv avec pre-commit. Alternativement, spécifiez language_version dans votre configuration de hook ou utilisez des hooks basés sur Docker pour assurer des environnements cohérents sur toutes les machines des développeurs.
Sans pre-commit installé, les hooks ne s'exécuteront pas localement mais votre code sera quand même commité. Pour faire respecter les standards, exécutez les vérifications pre-commit dans votre pipeline CI comme filet de sécurité et faites de l'installation de pre-commit une partie de votre documentation de configuration de projet.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.