跳转到内容
getnextpdf.com

工程质量

NextPDF 的每次推送与每个拉取请求都会运行构建阻断的 CI 门禁,涵盖静态分析、 变更行覆盖率、变异得分与带标签输出验证。

每次推送与每个拉取请求都会运行三道 PHPStan 门禁:

门禁范围是否阻断
Level 10src/
Level max(严格配置)src/
SARIF 注释src/建议性

CI 将 src/ 中的 PHPStan Level 10 发现视为构建阻断项。两项设置使标准高于默认的 Level 10 运行:

  • treatPhpDocTypesAsCertain —— PHPStan 将 PHPDoc 注解视为可信的事实来源, 而不是重新放宽为原生类型;因此,与静态分析所能推导结果相矛盾的收窄注解会被作为发现报告出来。
  • reportUnmatchedIgnoredErrors —— 每条抑制规则都必须匹配一个当前实际报告的错误,否则构建失败。

src/ 的每条 ignoreErrors 条目都固定到一个 PHPStan 标识符、一个精确的文件路径,并在相关情况下固定到精确的出现次数——同一标识符在其他任何位置出现新实例, 或在同一文件中出现第二个实例,都会导致构建失败。

CI 对每个拉取请求所变更的代码行强制执行 90% 覆盖率阈值,使用 PCOV 相对基准分支度量。低于阈值的拉取请求会导致构建失败。

变异测试检验测试是否真正对行为作出断言:CI 对代码进行变异,并要求必须有测试因此失败。三项变异得分指标设有单调不降的下限:

指标强制下限
raw_msi88.9%
effective_msi89.0%
covered_msi88.9%

任何会使任一指标跌破其下限的拉取请求都会被拒绝。CI 在将某次运行与下限比较之前,会先应用一项有文档记录的波动容差。

CI 在带标签输出语料库上以 pdfua.strict 配置文件运行 veraPDF 1.30.1,作为构建阻断门禁。