首页/开发/CI/CD 与发布速查/静态分析门禁(Lint 与类型检查)
质量门禁与回滚51 条

静态分析门禁(Lint 与类型检查)

用 Lint、类型检查与复杂度工具在合并前拦截低级问题;重点是控制信噪比:先清理误报与规则集,再让检查结果成为阻断条件。

CI/CD 与发布速查开发更新于 2026-10-13

静态分析门禁是什么

静态分析门禁指在合并前用 Lint、类型检查、复杂度与缺陷模式扫描拦住低级问题:语法与风格错误、未使用代码、类型不匹配、潜在空引用等。工具在本地 pre-commit 阶段做快速检查,在 CI 里做全量检查并把结果上报代码平台(常用 SARIF 格式做 inline 标注)。门禁成立的先决条件是信噪比:误报多的规则集一上线就会被 ignore 注释和跳过检查绕过;正确做法是先把规则与团队共识对齐、清理存量误报,再让错误级结果成为阻断条件,警告级先观察收集数据。

基本信息

常见工具ESLint、Ruff/Pylint、golangci-lint、mypy/tsc 等
运行时机pre-commit 快速检查 + CI 全量检查
结果上报SARIF 或报告文件,平台内联展示
阻断策略错误级阻断合并,警告级先观察
前置条件规则对齐团队共识,先清存量误报

典型使用场景

  • 新仓库起步:直接把主流工具与推荐规则设为 CI 阻断,从一开始保持干净。
  • 老仓库渐进治理:先在 CI 只报告不阻断,清理一批后再打开错误级阻断,避免一次积压上千条无法推进。
  • 本地快速反馈:pre-commit 跑轻量检查减少 CI 反复失败,CI 全量兜底防止有人跳过本地钩子。
  • 多语言仓库:各语言采用各自生态的主流工具,结果统一汇总为一种报告格式,评审入口只保留一个。
  • 平台内联评审:SARIF 上报后问题直接标注在合并请求的 diff 行上,评审时顺手修。

CI 中上报 SARIF

CI 中上报 SARIF
- name: Lint
  run: eslint -f @microsoft/eslint-formatter-sarif -o eslint.sarif  # 生成 SARIF
- uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: eslint.sarif  # 上传后平台内联展示

分层阻断策略

层级运行位置策略
格式化pre-commit / 编辑器自动修复,不阻断
风格与 Lintpre-commit + CI错误级阻断
类型检查CI阻断(类型错误通常真实存在)
复杂度与坏味道CI 定期或增量先观察,逐步设阈值
避免重复扫描同一个问题:两个工具查同一类问题时取其一,双份报告会让团队直接无视全部告警。
全量扫描与增量治理结合:CI 全量用于趋势观测,阻断判定可以先只针对变更文件,降低老仓库接入门槛。
工具版本与规则集要锁定:不锁版本时升级带来行为漂移,某天可能默默多出几百条报错。

易错点

  • 一次全量开启阻断:存量问题几千条,门禁当天就被要求关掉,改用增量与分级放行。
  • 忽视误报:每个误报都靠 ignore 注释绕过,规则集最终形同虚设,先调规则再阻断。
  • 只在本地跑钩子:有人跳过检查或没装环境,CI 不做全量会放问题长驱直入。
  • 阻断项不稳定:扫描结果受缓存或环境影响的工具要固定版本与配置,避免同代码两次运行结果不同。
  • 把格式化差异当分析问题:风格与语义检查混在一个必过作业里,改动成本高,分层处理。

数据来源与参考

  • GitHub Docs《Uploading a SARIF file to GitHub》
  • ESLint 文档(Formatters)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌