Par Anonyme (non vérifié) , 29 avril 2026

Le cas pour les tests pre-push

Un push cassé gaspille le temps de tout le monde. Un hook pre-push qui lance la suite de tests attrape le problème avant que le push ne quitte votre machine.

Le hook pre-push le plus simple

# .git/hooks/pre-push
#!/usr/bin/env bash
set -e
npm test --silent

Lire ce qui est poussé

#!/usr/bin/env bash
while read local_ref local_sha remote_ref remote_sha; do
  if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then
    continue
  fi
  git checkout "$local_sha" -- .
  npm test
done

Lancements sélectifs de tests

changed=$(git diff --name-only origin/main...HEAD)
affected=$(./scripts/find-affected-tests.sh "$changed")
npx jest $affected

Application consciente de la branche

protected_branches=("main" "release")
branch=$(git symbolic-ref --short HEAD)
if [[ " ${protected_branches[*]} " =~ " $branch " ]]; then
  echo "Refus de push direct vers $branch" >&2
  exit 1
fi

Utiliser Husky pour des hooks pre-push partagés

# .husky/pre-push
npm test --silent
npm run typecheck --silent

Conseils de performance

  • Lancez les tests en parallèle.
  • Sautez les tests qui n'ont pas changé.
  • Cachez les transformations.
  • Réservez les tests d'intégration lourds pour CI.

Contourner

git push --no-verify

Hooks côté serveur

# /srv/git/repo.git/hooks/pre-receive
#!/usr/bin/env bash
while read old new ref; do
  if ! gitleaks detect --redact --no-banner --staged 2>/dev/null; then
    echo "Push rejeté : secrets détectés" >&2
    exit 1
  fi
done

La bonne frontière

  • Pre-commit : vérifications instantanées (lint, format, typecheck).
  • Pre-push : tests unitaires, lint complet.
  • CI : tests d'intégration, smoke tests, deploy preview.