Passe de performance guidée par la mesure, pas par l'intuition. Porte de qualité (`npm run check`) — la commande qui tourne des dizaines de fois par jour : - Les 5 vérifications sont indépendantes : exécutées en parallèle via scripts/check.mjs au lieu d'un enchaînement `&&` qui imposait la somme des durées ET 7 démarrages npm imbriqués. 14 s → 6 s - Cache ESLint (--cache) et compilation incrémentale tsc. 16 s → 14 s - Chemin critique restant : vitest 4,9 s, dont ~2 s de mise en place jsdom. Tests de mutation : - Config Vitest dédiée en pool `threads` sans ré-isolation. Mesuré sur le dry-run Stryker : overhead d'amorçage 12 844 ms → 1 592 ms, soit ~90 % du cycle par mutant. 5 min 02 → 3 min 40 - Le mode incrémental ramène le profil complet à 12 s après une édition. Pistes mesurées puis REJETÉES (documentées dans README-CI.md pour éviter qu'on les retente) : - Découper la mutation en 5 processus Stryker parallèles : 262 s contre 235 s. Chaque processus repaie son bac à sable et son dry-run. - Monter `concurrency` de 6 à 16 : aucun effet (~8,5 mutants/s partout), le débit est borné par l'orchestration mono-processus de Stryker. - Séparer vitest API/frontend en deux processus : aucun gain, jsdom domine. - Pool `threads` sur la suite complète : 18,8 s contre 3,5 s. Le bon réglage dépend du jeu de fichiers (jsdom ou non) — d'où deux configs distinctes. Le périmètre muté est inchangé (1511 mutants) : un score obtenu en retirant les mutants gênants vaudrait moins que pas de score. Corrections au passage : - scripts/*.mjs n'était couvert par aucune section ESLint - Les deux suites pytest ont chacune un paquet `src` : réunies dans un seul processus, le premier importé masquait l'autre. Séparées (et parallèles). Co-Authored-By: Claude <noreply@anthropic.com>
32 lines
891 B
Bash
32 lines
891 B
Bash
#!/bin/sh
|
|
#
|
|
# Porte de qualité locale — c'est ICI que la CI de ce projet se joue.
|
|
#
|
|
# Le déploiement Coolify se déclenche sur webhook à chaque push : rien ne
|
|
# s'interpose entre `git push` et la mise en ligne. Ce hook est donc le dernier
|
|
# filet avant que du code cassé parte en dev.
|
|
#
|
|
# Installation (une fois par clone) : npm run hooks:install
|
|
# Contournement ponctuel : git push --no-verify
|
|
#
|
|
set -e
|
|
|
|
echo "▶ pre-push : porte de qualité (~6 s)…"
|
|
|
|
start=$(date +%s)
|
|
|
|
if ! npm run --silent check; then
|
|
cat >&2 <<'MSG'
|
|
|
|
✗ La porte de qualité a échoué — push interrompu.
|
|
|
|
Corriger, ou pousser quand même en connaissance de cause :
|
|
git push --no-verify
|
|
|
|
Correction automatique de la plupart des problèmes de style :
|
|
npm run lint:fix && npm run lint:py:fix
|
|
MSG
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ pre-push : tout est vert ($(( $(date +%s) - start ))s)"
|