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.

L'essentiel de Pre‑Commit - Un guide rapide pour l’installation, les hooks et l’utilisation
Photo par Garrett Parker / Unsplash

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

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