L'essentiel de Pre‑Commit - Un guide rapide pour l’installation, les hooks et l’utilisation
Ce guide pratique vous explique comment installer pre-commit, configurer les hooks et les utiliser efficacement. Regorgeant d'exemples concrets et d'extraits de configurations prêtes à l'emploi, il constitue la méthode la plus rapide pour améliorer la qualité de votre code avec un minimum d'effort.
Aperçu
-
La commande « pre-commit » peut être utilisée pour exécuter d'autres programmes qui effectueront des vérifications sur les fichiers d'un dépôt Git, lorsqu'une commande « git commit » est émise.
-
Les vérifications effectuées lors de la validation sont appelées hooks « pre-commit ».
-
La validation sera effectivement effectuée une fois que tous les hooks « pre-commit » auront été exécutés avec succès.
-
Voici une liste de quelques hooks « pre-commit » que nous pouvons utiliser directement dans nos projets : liste des hooks
Installation
Voici un lien vers la page d'installation officielle si nécessaire : installer pre-commit
Utilisation de pip
Pre-commit est développé en Python et peut être installé avec 'pip'.
$ pip install pre-commit
Utilisation du fichier .pyz
Nous pouvons également exécuter directement le fichier « pre-commit-#.#.#.pyz » après en avoir récupéré un sur la page des versions « pre-commit » : ici
$ python pre-commit-#.#.#.pyz ...
Utilisation
Fichier de configuration des hooks
- La commande « pre-commit » recherchera les configurations dans le fichier suivant :
.pre-commit-config.yaml - Un exemple de configuration peut être généré comme suit :
# Generate pre-commit sample configuration file
$ pre-commit sample-config
# Result
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
-
Vous trouverez ici une description de chaque champ disponible dans le fichier de configuration : descriptions des champs de configuration
-
Pour obtenir la liste des hooks « pre-commit » pris en charge, consultez cette page : liste des hooks
-
Pour tester un dépôt « pre-commit » avant de l'utiliser réellement, consultez cette page : hooks en mode dry-run
-
Pour plus d'informations sur la mise à jour automatique de la configuration « pre-commit » (versions des hooks), consultez : mise à jour automatique des versions des hooks
Exécution des hooks
Voici comment configurer 'git' pour exécuter les hooks 'pre-commit' sur les commits :
# Without installing hooks environments.
# Hooks environments will be installed on first run
$ pre-commit install
# With hooks environments installation
$ pre-commit install --install-hooks
Les environnements de hooks contiennent les dépendances nécessaires à l'exécution d'un hook « pre-commit » spécifique. Pour installer uniquement les environnements de hooks, exécutez la commande suivante :
# Only install the necessary for running hooks,
# without telling Git to run pre-commit hooks on commits
$ pre-commit install-hooks
Voici comment exécuter des hooks :
# Run hooks on all files
# Hooks environments will be installed if not already done
$ pre-commit run --all-files
Extraits de configuration
Usage général
---
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
# See https://github.com/pre-commit/pre-commit-hooks/blob/main/.pre-commit-hooks.yaml for more
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
Détection de secrets
repos:
# Detects well-known secrets patterns (AWS access key, Github token, etc)
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.0
hooks:
- id: gitleaks
args: ["protect", "--verbose", "--redact"]
# Detects the presence of private keys
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: detect-private-key
Actuellement, les règles par défaut de GitLeaks ne détectent pas les secrets contenus dans des champs tels que « password », « token », etc. Les secrets suivants, par exemple, ne seront pas détectés :
# File: unencrypted-secrets.yml
password: mysuperpass
token: mytoken
key: mykey
Pour remédier à cela, nous pouvons ajouter une configuration de règles personnalisées pour gitleaks dans le dépôt Git comme suit :
# File: .gitleaks.toml
[[rules]]
id = "generic-secret"
description = "Generic secret assignment"
regex = '''(?i)(password|token|key)\s*[:=]\s*.+'''
Avec la configuration de règles personnalisées ci-dessus, voici le résultat :
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
$ git add unencrypted-secrets.yml
$ git commit -m "commiting a file containing secrets"
Detect hardcoded secrets.................................................Failed
- hook id: gitleaks
- exit code: 1
○
│╲
│ ○
○ ░
░ gitleaks
Finding: REDACTED: mysuperpass
Secret: REDACTED
RuleID: generic-secret
Entropy: 2.750000
File: unencrypted-secrets.yml
Line: 1
Fingerprint: unencrypted-secrets.yml:generic-secret:1
Finding: REDACTED: myREDACTED
Secret: REDACTED
RuleID: generic-secret
Entropy: 2.321928
File: unencrypted-secrets.yml
Line: 2
Fingerprint: unencrypted-secrets.yml:generic-secret:2
Finding: REDACTED: mypreivateREDACTED
Secret: REDACTED
RuleID: generic-secret
Entropy: 1.584962
File: unencrypted-secrets.yml
Line: 3
Fingerprint: unencrypted-secrets.yml:generic-secret:3
7:36PM INF 0 commits scanned.
7:36PM INF scanned ~56 bytes (56 bytes) in 3.72ms
7:36PM WRN leaks found: 3
detect private key.......................................................Passed
CI Gitlab
Générer automatiquement la documentation de Composants Gitlab CI
repos:
- repo: https://github.com/erNail/labdoc
rev: 3.0.2
hooks:
- id: labdoc-generate
args:
- "--repoUrl=$CI_SERVER_FQDN/my-component-path"
- "--outputFile=./README.md"
Helm
Générer automatiquement la documentation de Charts Helm
repos:
- repo: https://github.com/norwoodj/helm-docs
rev: v1.14.2
hooks:
- id: helm-docs
args:
- --chart-search-root=.
Vous devez installer le binaire « helm-docs » avant d'exécuter cette configuration. Instructions d'installation ici : installer helm-docs
Vous pouvez également l'exécuter via Docker en utilisant 'id: helm-docs-container' au lieu de 'id: helm-docs' dans la configuration ci-dessus.
Ansible
Vérifiez vos playbooks Ansible
repos:
- repo: https://github.com/ansible/ansible-lint
rev: v26.4.0
hooks:
- id: ansible-lint
args:
- "--fix" # automatically fix some issues