Aller au contenu
getnextpdf.com

Qualité d'ingénierie

Chaque push et chaque pull request sur NextPDF exécutent des contrôles CI bloquants couvrant l’analyse statique, la couverture des lignes modifiées, le score de mutation et la validation des sorties balisées.

Trois contrôles PHPStan s’exécutent sur chaque push et chaque pull request :

ContrôlePérimètreBloquant
Niveau 10src/Oui
Niveau max (profil strict)src/Oui
Annotation SARIFsrc/Indicatif

La CI traite les signalements PHPStan de niveau 10 dans src/ comme bloquants pour le build. Deux réglages relèvent la barre au-dessus d’une exécution niveau 10 par défaut :

  • treatPhpDocTypesAsCertain — PHPStan considère l’annotation PHPDoc comme la vérité de référence plutôt que de ré-élargir vers le type natif ; une annotation restrictive qui contredit ce que l’analyse statique peut dériver constitue donc un signalement.
  • reportUnmatchedIgnoredErrors — chaque suppression doit correspondre à une erreur effectivement signalée, faute de quoi le build échoue.

Chaque entrée ignoreErrors pour src/ est épinglée à un identifiant PHPStan, à un chemin de fichier exact et, le cas échéant, à un nombre d’occurrences exact — une nouvelle occurrence du même identifiant ailleurs, ou une seconde occurrence dans le même fichier, fait échouer le build.

La CI applique un seuil de couverture de 90 % sur les lignes que chaque pull request modifie, mesuré avec PCOV par rapport à la branche de base. Une pull request sous le seuil fait échouer le build.

Les tests de mutation vérifient que les tests portent des assertions sur le comportement : la CI mute le code et exige qu’un test échoue. Trois indicateurs de score de mutation portent des planchers monotones non décroissants :

MétriqueMinimum appliqué
raw_msi88,9 %
effective_msi89,0 %
covered_msi88,9 %

Une pull request qui ferait passer l’une de ces métriques sous son plancher est rejetée. La CI applique une tolérance de variance documentée avant de comparer une exécution aux planchers.

La CI exécute veraPDF 1.30.1 avec le profil pdfua.strict comme contrôle bloquant sur le corpus de sorties balisées.