samedi 26 septembre 2026

À propos

Contact

Tests

Avant de fusionner une pull request : la checklist de revue automatisée

Les tests unitaires ne suffisent pas à eux seuls à protéger une branche principale. Voici ce qu'un pipeline doit bloquer systématiquement avant tout merge.

Par Clément Hadrot • 1 mars 2023 • 5 min de lecture • Aucun commentaire
Avant de fusionner une pull request : la checklist de revue automatisée

Après un incident de production causé par une variable d’environnement mal configurée — le build passait, les tests unitaires passaient, mais l’application plantait au démarrage faute d’une clé de configuration absente du fichier d’exemple versionné — notre équipe a formalisé une checklist explicite de ce qu’un pipeline doit vérifier avant d’autoriser la fusion d’une pull request sur une branche principale. Les tests unitaires, aussi solides soient-ils, ne couvrent qu’une partie du risque réel.

Cette checklist n’est pas figée dans le marbre : elle s’adapte à chaque projet, mais son ossature reste commune à la plupart de nos chantiers WordPress d’agence.

1. Les tests automatisés, sans exception de branche

Le socle attendu : suite PHPUnit, suite Jest si des blocs ou des scripts sont concernés, et tests d’acceptation si le projet en dispose. Aucune de ces étapes ne doit pouvoir être ignorée par un [skip ci] laissé sur une branche destinée à la production.

2. Le linting de style, bloquant et non simplement informatif

Un rapport PHPCS ou ESLint qui se contente d’un avertissement dans les logs, sans faire échouer le pipeline, finit toujours par être ignoré au bout de quelques semaines. Le linting doit produire un code de sortie non nul en cas de violation des règles définies pour le projet :

vendor/bin/phpcs --standard=WordPress --error-severity=1 --warning-severity=8 src/
npx eslint src/ --max-warnings=0

3. Le build, exécuté dans les mêmes conditions qu’en production

Un build qui fonctionne uniquement en local, avec des dépendances de développement absentes du pipeline, ne prouve rien sur ce qui sera réellement déployé. Le pipeline doit reproduire une installation propre, sans cache local, avant de lancer la compilation des assets :

rm -rf node_modules vendor
composer install --no-dev --optimize-autoloader
npm ci
npm run build
L'essentiel à retenir : Les tests unitaires ne sont qu'une étape parmi d'autres ; Le lint et le build doivent bloquer au même titre que les tests ; Une checklist versionnée évite les oublis au fil des projets

4. L’analyse statique, séparée du linting de style

PHPStan ou Psalm détectent une classe d’erreurs différente du style de code : des incohérences de type, des appels à des méthodes inexistantes, des variables potentiellement non définies. Cette étape mérite sa propre place dans la checklist, distincte du simple linting, avec un niveau de rigueur défini explicitement pour le projet plutôt que le niveau maximal par défaut, souvent trop strict pour une base de code existante.

5. Une vérification de sécurité de base

  • Scanner les dépendances Composer et npm à la recherche de vulnérabilités connues (composer audit, npm audit).
  • Vérifier qu’aucun secret (clé API, mot de passe) n’a été committé par erreur, via un outil de détection de secrets dans les diffs.
  • S’assurer qu’aucune fonction dangereuse (eval, extract sur une entrée utilisateur non filtrée) n’a été introduite, via une règle de lint dédiée.

6. La cohérence de la configuration entre les environnements

C’est précisément l’étape qui manquait lors de l’incident évoqué en introduction. Un script simple compare les clés présentes dans le fichier d’exemple versionné (.env.example) à celles réellement utilisées dans le code, pour repérer une variable oubliée avant qu’elle ne cause un incident en production :

#!/usr/bin/env bash
set -euo pipefail

grep -oP "getenv\('\K[A-Z_]+" src/ -r | sort -u > /tmp/variables-utilisees.txt
grep -oP "^[A-Z_]+(?==)" .env.example | sort -u > /tmp/variables-declarees.txt

comm -23 /tmp/variables-utilisees.txt /tmp/variables-declarees.txt > /tmp/manquantes.txt

if [ -s /tmp/manquantes.txt ]; then
  echo "Variables utilisées mais absentes de .env.example :"
  cat /tmp/manquantes.txt
  exit 1
fi

Un pipeline qui ne bloque que sur les tests unitaires protège contre les régressions de comportement, mais laisse passer toutes les régressions d’infrastructure — configuration, dépendances, style — qui causent, dans notre expérience d’agence, au moins autant d’incidents en production.

Ce que cette checklist ne remplace pas

Ces six vérifications automatisées ne dispensent jamais d’une revue de code humaine sur la logique métier et l’architecture des changements proposés — l’organisation de cette revue humaine, qui l’effectue et selon quels critères, relève d’un sujet distinct déjà traité par ailleurs, indépendant de l’outillage du pipeline lui-même.

Adapter la checklist sans la diluer

Ajouter une septième ou huitième vérification est toujours tentant, mais chaque étape supplémentaire ralentit le retour d’information aux développeurs. La règle que nous appliquons : une nouvelle vérification n’entre dans la checklist qu’après avoir causé, au moins une fois, un incident qu’elle aurait empêché — jamais par simple prudence théorique.

Pour aller plus loin

Versionner cette checklist directement dans le dépôt, sous forme de configuration de pipeline plutôt que de document externe, garantit qu’elle évolue avec le projet et reste appliquée de façon identique par tous les contributeurs, sans dépendre de la mémoire individuelle de chacun.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi