SonarQube 常见扫描问题与排查

笔记/CICD/SonarQube代码扫描/SonarQube 常见扫描问题与排查

背景与动机#

SonarQube 扫描失败时,不要先猜规则问题。大多数初次接入问题都发生在更基础的位置:

  • Scanner 连不上 Server。
  • token 没权限。
  • project key 写错。
  • 源码路径不对。
  • CI 主机环境和本地不一致。
  • Quality Gate 还没算完就判断失败。

排查时先确认链路,再看规则和质量结果。

排查主线#

可以按下面顺序排查:

CI 主机能否访问 Server
token 是否有效且有 Execute Analysis 权限
projectKey 是否对应正确项目
sonar.sources 是否指向真实源码目录
Scanner 日志是否有具体错误
Server 日志和后台任务是否正常
Quality Gate 是否计算完成

这条顺序能避免一开始就陷入规则配置细节。

常见问题#

1. token 错误或权限不足#

常见现象:

  • 扫描提示未认证。
  • 提示没有执行分析权限。
  • 本地能登录页面,但 CI 扫描失败。

排查点:

  • token 是否复制完整。
  • token 是否属于正确用户或项目。
  • 用户是否有 Execute Analysis 权限。
  • CI 变量名是否正确注入。

推荐写法:

Terminal window
export SONAR_TOKEN="your-project-token"
sonar-scanner

不要把 token 写进仓库里的 sonar-project.properties

2. project key 不一致#

常见现象:

  • 扫描成功,但页面上看不到结果。
  • 结果出现在另一个项目里。
  • 提示项目不存在或无权限。

排查点:

sonar.projectKey=my-app

它必须和 SonarQube Server 上项目 key 对应。Project Key 应该稳定,不要随意改。

3. 扫描不到文件#

常见现象:

  • 扫描成功但没有问题。
  • 页面显示代码行数很少。
  • 某些目录完全没被分析。

排查点:

sonar.sources=src
sonar.tests=tests

确认这些路径相对的是扫描启动目录。CI 中常见问题是工作目录和本地不一致。

可以在 CI 中先打印:

Terminal window
pwd
ls -la
find . -maxdepth 2 -type d

4. 证书或代理问题#

常见现象:

  • Scanner 无法连接 HTTPS SonarQube。
  • 报证书不受信任。
  • 公司代理环境下连接超时。

排查点:

  • CI 主机能否 curl 到 SonarQube 地址。
  • 证书链是否被 JDK 信任。
  • 代理环境变量是否配置。
  • SonarQube 的 Server Base URL 是否和实际访问地址一致。

优先确认网络连通:

Terminal window
curl -I https://sonarqube.example.com

5. 内存不足或 Scanner 运行慢#

常见现象:

  • 扫描过程中 OOM。
  • 大项目扫描时间很长。
  • CI runner 资源不足。

排查方向:

  • 缩小 sonar.sources,不要扫描依赖目录和构建产物。
  • 检查是否误把 node_modulesdisttarget 纳入扫描。
  • 给 Scanner 增加 JVM 内存。

示例:

Terminal window
export SONAR_SCANNER_OPTS="-Xmx2g"
sonar-scanner

6. Quality Gate 没等到结果#

默认情况下,Scanner 上传报告后,Quality Gate 在 Server 端异步计算。

如果流水线要等待门禁:

Terminal window
sonar-scanner -Dsonar.qualitygate.wait=true

如果项目大或 Server 繁忙,可以增加等待时间:

Terminal window
sonar-scanner \
-Dsonar.qualitygate.wait=true \
-Dsonar.qualitygate.timeout=600

7. 覆盖率一直是 0#

SonarQube 不会自动跑测试,也不会凭空生成覆盖率。

排查点:

  • 测试命令是否在扫描前执行。
  • 覆盖率报告是否真的生成。
  • 报告路径是否被正确配置。
  • 使用的语言和覆盖率格式是否匹配。

这个问题通常不是 Quality Gate 本身的问题,而是覆盖率报告没有被导入。

日志怎么看#

Scanner 侧#

先看 CI 控制台输出。需要更多信息时:

Terminal window
sonar-scanner -X

注意:调试日志可能输出更多环境信息,不要把敏感 token 暴露到公开日志里。

Server 侧#

常见日志:

logs/web.log
logs/ce.log
logs/es.log
logs/sonar.log

其中:

  • web.log:Web 服务和 API 问题。
  • ce.log:后台计算任务问题,Quality Gate 计算也在这个链路里。
  • es.log:搜索引擎组件问题。
  • sonar.log:总入口日志。

容器或 Kubernetes 部署时,也要看容器日志和 Pod 事件。

常见陷阱#

1. 只看 Scanner 成功,不看 Server 后台任务#

Scanner 成功上传报告,不代表 Server 一定完成了计算。页面里的后台任务失败时,也可能导致结果不可用。

2. 在错误目录执行扫描#

sonar.sources=src 是相对扫描启动目录解析的。CI 中 pwd 不同,结果就可能完全不同。

3. 忽略 SCM 信息#

SonarQube 会利用 SCM 信息识别新代码和变更。如果 CI 只拉了浅克隆或缺少分支信息,可能影响新代码判断。

4. 把所有问题都归因于规则太严#

规则确实可能需要调整,但接入初期更常见的是路径、权限、token、覆盖率报告和 CI 工作目录问题。

配图建议#

建议插入在 ## 排查主线 后面。

文件名建议:image/05-sonarqube-troubleshooting-01.png

生图提示词:

画一张 SonarQube 扫描失败排查决策流程图,技术教学风格,浅色背景,竖向或横向流程均可。流程节点依次为:CI 主机能否访问 Server、Token 是否有效、Project Key 是否正确、sonar.sources 是否指向真实源码、Scanner 日志是否报错、Server 后台任务是否失败、Quality Gate 是否计算完成。每个节点用“是/否”分支指向下一步或对应处理建议。中文标签,结构清晰,适合放在技术笔记中,不要使用真实日志截图。

一句话总结#

SonarQube 排查要先走通链路:网络、认证、项目 key、源码路径、Scanner 日志、Server 后台任务,最后再看规则和质量门禁。

文章目录

文章目录