如何拆分Sonar Scanner为代码分析与代码覆盖率两阶段执行
方案可行性结论
该拆分方案完全可行。核心逻辑是把SonarQube扫描拆成两个独立环节:无任何外部依赖的静态代码分析环节,以及必须等测试执行完成才能拿到数据的覆盖率统计上报环节。拆分后静态分析可以和测试任务并行启动,不需要等全量测试跑完就能先输出代码异味、漏洞、规范问题这类静态检查结果,通常能把流水线Sonar环节的反馈周期压缩40%左右,具体收益取决于测试任务的整体耗时。
前置依赖要求
- Maven Sonar Scanner插件版本 ≥ 3.7,低版本不支持分步提交扫描结果、跳过静态分析复用缓存的能力
- GitLab Runner配置跨任务可访问的制品/缓存存储,用来在不同流水线任务间传递静态分析中间产物、测试覆盖率报告
- SonarQube服务端版本 ≥ 8.9 LTS,支持增量接收扫描上报的分片数据
具体配置步骤
1. 调整GitLab流水线阶段编排
首先修改.gitlab-ci.yml的阶段定义,把静态分析和测试放到同一个并行阶段,覆盖率上报放到测试完成后的后置阶段:
stages: - build # 原有的代码编译、依赖拉取阶段保持不变 - static-scan-and-test # 并行执行静态扫描、测试任务 - sonar-coverage-merge # 测试完成后合并上报覆盖率数据
2. 配置并行执行的两个任务
(1)静态代码分析任务
这个任务不执行任何测试逻辑,只遍历源码做静态规则检查,生成中间扫描缓存,配置示例:
sonar-static-scan: stage: static-scan-and-test script: - mvn sonar:sonar -Dmaven.test.skip=true -Dsonar.skipTests=true -Dsonar.analysis.mode=preview -Dsonar.report.export.path=sonar-static-report.json -Dsonar.scanner.keepReport=true artifacts: paths: - .scannerwork/ # Sonar扫描生成的中间工作目录,必须留存 - sonar-static-report.json expire_in: 1 hour # 缓存留存时间覆盖后续覆盖率任务执行窗口即可
(2)测试执行任务
保持你原有的测试执行逻辑不变,只需要额外把测试生成的覆盖率报告(比如JaCoCo生成的exec、xml报告)配置为制品留存,供后续任务使用:
test-run: stage: static-scan-and-test script: # 这里替换成你原有的测试执行命令,正常跑单元、集成测试,生成覆盖率报告 - mvn test jacoco:report artifacts: paths: - target/site/jacoco/ # JaCoCo生成的覆盖率报告目录,按你实际的报告路径调整 expire_in: 1 hour
3. 配置覆盖率合并上报任务
这个任务会拉取前两个并行任务产出的静态扫描缓存、覆盖率报告,不重复跑全量静态分析,直接合并数据后上报给SonarQube服务端,配置示例:
sonar-coverage-report: stage: sonar-coverage-merge dependencies: - sonar-static-scan - test-run # 拉取前两个任务的所有制品 script: - mvn sonar:sonar -Dsonar.skipStaticAnalysis=true -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml -Dsonar.scanner.useCachedReport=true -Dsonar.projectVersion=$CI_COMMIT_SHORT_SHA
配置注意事项
- 首次上线前建议在测试分支验证2-3次,对比拆分前后的静态问题检出数、覆盖率数值,和原全量执行的结果偏差不超过1%即为配置生效
- 静态扫描阶段可以加
-Dsonar.exclusions=src/test/**参数跳过测试目录扫描,如果有测试代码规范检查的需求,把这部分检查放到覆盖率上报阶段执行即可 - 不同分支的扫描缓存要按分支名做隔离,不要跨分支复用
.scannerwork目录的内容,否则会出现报告匹配失败、数据串线的问题 - 不要在覆盖率上报任务里重新执行编译命令,否则会改变class文件的哈希校验值,导致之前缓存的静态分析报告和当前代码不匹配,上报失败
内容的提问来源于stack exchange,提问作者digital-h
相关产品推荐
相关产品推荐

