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