Перейти к содержимому
getnextpdf.com

Инженерное качество

Каждый push и pull request в NextPDF проходит блокирующие сборку CI-гейты: статический анализ, покрытие изменённых строк, мутационный балл и валидацию тегированного вывода.

На каждом push и pull request выполняются три гейта PHPStan:

ГейтОбластьБлокирующий
Level 10src/Да
Level max (строгий профиль)src/Да
SARIF-аннотацияsrc/Консультативный

CI считает находки PHPStan Level 10 в src/ блокирующими сборку. Две настройки поднимают планку выше запуска Level 10 по умолчанию:

  • treatPhpDocTypesAsCertain — PHPStan доверяет аннотации PHPDoc как истине, вместо того чтобы заново расширять её до нативного типа, поэтому сужающая аннотация, противоречащая тому, что может вывести статический анализ, становится репортуемой находкой.
  • reportUnmatchedIgnoredErrors — каждое подавление обязано соответствовать реально репортуемой в данный момент ошибке, иначе сборка падает.

Каждая запись ignoreErrors для src/ закреплена за идентификатором PHPStan, точным путём к файлу и, где уместно, точным числом вхождений — новое вхождение того же идентификатора в любом другом месте или второе вхождение в том же файле роняет сборку.

CI применяет порог покрытия 90% на строках, изменяемых каждым pull request, с измерением через PCOV относительно базовой ветки. Pull request ниже порога роняет сборку.

Мутационное тестирование проверяет, что тесты действительно делают утверждения о поведении: CI мутирует код и требует, чтобы тест упал. Три показателя мутационного балла несут монотонно неубывающие нижние пороги:

МетрикаПринудительный минимум
raw_msi88.9%
effective_msi89.0%
covered_msi88.9%

Pull request, который опустил бы любую метрику ниже её порога, отклоняется. Перед сравнением запуска с порогами CI применяет задокументированный допуск на разброс.

CI запускает veraPDF 1.30.1 с профилем pdfua.strict как блокирующий сборку гейт на корпусе тегированного вывода.