Skip to content
阅读进度

MR 门禁怎样只拦截增量问题? ​

返回 构建与质量门禁 目录

标准回答 ​

我把 Android Lint 和自定义规则接入 MR 流程,目标是在合入前拦截新增的高风险问题,同时避免历史告警把所有新提交都阻塞住。首月拦截了 20 多个高风险问题,并按规则、仓库和严重级别做分析。

这项工作的关键是增量归属。一个文件被修改,不代表文件里所有告警都是本次引入的。例如只修改第 20 行,第 200 行一直存在的历史告警,不应该简单归到这次提交。因此门禁需要结合变更范围和基线策略判断,而不是把整文件检查结果全部当作新增问题。

规则也需要分级。高风险且信号稳定的规则适合阻断,噪声较大的规则更适合先报告和治理。还要区分真正没有问题与检查执行失败:报告没有生成,不能被误判成零告警后直接放行。

增量策略有边界,例如一行改动可能在另一处引出问题,纯行范围判断就可能漏掉。这类情况需要根据实际方案考虑基线差分或规则级归属。20 多个拦截是工具发现并阻止合入的问题数,不等于已经证明避免了同样数量的线上事故。

关键机制 ​

  • 比较基准通常涉及目标分支与 merge-base,重命名、行号漂移、跨文件影响与无位置问题要有策略;实际实现范围需如实说明。
  • 规则按风险和信号质量分级,保留可追踪豁免;报告生成失败和真正没有问题不能混为一谈。
  • Lint 不能覆盖所有 Java 空指针和并发风险。新增检测器需要明确规则语义和验证样例,不能把 IDE 检查能力全部归给 Lint。

通俗例子 ​

只改了文件中的第 20 行,历史第 200 行仍有旧问题。如果门禁按整文件阻断,就会把旧债错误归给本次提交。

追问与回答 ​

为什么不直接打开 warningsAsErrors? ​

如果仓库有较多历史告警,全量阻断会让与历史问题无关的提交也无法合入,团队可能最终只能整体关闭检查。我采用增量治理的目的,是先守住新增问题,再逐步处理存量。规则本身仍要分级,不能把所有 warning 都当成同等风险;全量质量趋势与本次提交是否可合入,是两个相关但不同的判断。

一行改动引起另一行的问题怎么办? ​

这正是纯行范围过滤的局限。检测器可能把错误报在使用处,而根因在另一处定义或配置。更完整的方案要比较基线与当前问题集合,或根据规则判断变更关联,但也会增加复杂度。我会明确当前门禁的实际覆盖范围,不把“做了增量”说成不会漏报;重要的是让局限可见,并逐步补齐高风险场景。

易混淆点 ​

材料未列实现中的问题指纹、全部规则或漏报率。首月 20+ 是拦截数,不等于已证明避免 20+ 个线上故障。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。