Introduction

Les scripts Git hook sont utiles pour identifier des problèmes simples avant la soumission à la revue de code.

Nous exécutons nos hooks sur chaque commit afin de signaler automatiquement les problèmes dans le code tels que les points-virgules manquants, les espaces vides et les instructions de débogage.

En signalant ces problèmes avant la révision du code, cela permet à un réviseur de code de se concentrer sur l'architecture d'un changement sans perdre de temps avec des détails de style insignifiants.

Pre-commit est un outil en ligne de commande qui fait partie de cette gamme d'outils permettant de décaler certains aspects de la sécurité en ajoutant des points de contrôle automatiques après chaque commit.

Cela permet de détecter et de contrôler le plus tôt possible dans le pipeline d'intégration les éventuelles anomalies et donc de les corriger avant la mise en production.

Pour ce faire, trois étapes sont nécessaires :

  • Pre-commit nécessite d'être installé sur votre machine.
  • Un fichier de configuration nommé “.pre-commit-config.yaml” doit être créé à la racine du projet Git et configuré avec les hooks
  • Le projet Git doit être configuré localement pour exécuter automatiquement la commande à chaque commits.

Installer pre-commit

$ pip install pre-commit

Activation pre-commit

Créer un fichier de configuration de pre-commit dans votre dossier git (repository)

Dans l'exemple qui suit, nous allons utiliser pre-commit avec ansible-lint

$ nano .pre-commit-config.yaml

Dans notre fichier, nous allons ajouter la config suivante

---
repos:
- repo: https://github.com/ansible/ansible-lint.git
  rev: v6.4.0
  hooks:
    - id: ansible-lint
      files: \.(yaml|yml)$

Activer pre-commit pour le dépôt git

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

Installer avec

$ echo "pre-commit run -a" > .git/hooks/pre-commit
$ chmod 700 .git/hooks/pre-commit

Test pre-commit

$ pre-commit run --all-files
Ansible-lint.............................................................Passed

Ou simplement avec la commande “git commit

$ git commit 

Hooks Basic

Issus du repo pre-commit-hooks, ce sont des vérifications de texte basiques.

  • Check-added-large-files pour contrôler la taille des fichiers stockés dans vos référentiels
  • Check-merge-conflict pour vérifier les conflits de fusion avant de valider quoi que ce soit.
  • Trailing-whitespace pour nettoyer le code des espaces blancs inutiles
  • End-of-file-fixer pour s'assurer que les fichiers se terminent par une nouvelle ligne et seulement une nouvelle ligne.
  • Yamllint pour identifier les erreurs de formatage de votre code automatiquement avant chaque commit, très important pour standardiser le code et faciliter sa lecture
  • Yamlfix pour automatiser la correction de formatage
  • Checkov pour vérifier la conformité des fichiers de définition Kubernetes selon les meilleures pratiques de développement et les règles personnalisées
  • Detect-secrets pour détecter toute donnée sensible et éviter leur stockage dans le code
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.3.0
    hooks:
      - id: check-added-large-files
      - id: check-merge-conflict
      - //id: check-yaml//
      - //id: detect-aws-credentials//
      - //id: detect-private-key//
      - //id: mixed-line-ending//
      - id: trailing-whitespace
      - id: end-of-file-fixer

Hooks additionnel

- repo: https://github.com/ansible/ansible-lint.git
  rev: v6.4.0
  hooks:
    - id: ansible-lint
      files: \.(yaml|yml)$

Installer le package cfn-lint

pip3 install cfn-lint

Config pre-commit

repos:
- repo: https://github.com/awslabs/cfn-python-lint
  rev: v0.15.0 # The version of cfn-lint to use
  hooks:
    - id: cfn-python-lint
      files: templates/.*\.(json|yml|yaml)$

Si vous utilisez Docker (par exemple pour les constructions reproductibles ou le CI), ce hooks fournit de nombreuses recommandations intéressantes pour les Dockerfiles

- repo: https://github.com/pryorda/dockerfilelint-precommit-hooks
  rev: v0.1.0
  hooks:
    - id: dockerfilelint
- repo: https://github.com/Agilicus/pre-commit-hook-k8svalidate.git
  rev: v0.1.0
  hooks:
    - id: k8svalidate
      files: .yaml$

prettier est un outil Javascript qui peut formater de nombreux types de langage différents. Je trouve qu'il fait un bon travail sur les fichiers Markdown, Javascript, JSON et YAML en particulier.

  - repo: https://github.com/pre-commit/mirrors-prettier
    rev: v2.7.1
    hooks:
      - id: prettier
        files: \.(js|ts|jsx|tsx|css|less|html|json|markdown|md|yaml|yml)$

Quelques contrôles utiles et de qualité de vie pour les scripts shell

- repo: https://github.com/shellcheck-py/shellcheck-py
  rev: v0.8.0.3
  hooks:
    - id: shellcheck
- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: v1.74.1
  hooks:
    - id: terraform_fmt
    - id: terraform_validate
    - id: terraform_tflint
    - id: terraform_tfsec
    - id: terraform_checkov

Annexe

Ce site web utilise des cookies. En utilisant le site Web, vous acceptez le stockage de cookies sur votre ordinateur. Vous reconnaissez également que vous avez lu et compris notre politique de confidentialité. Si vous n'êtes pas d'accord, quittez le site.En savoir plus