背景与动机
SonarScanner CLI 是最通用的扫描方式。它不绑定 Maven、Gradle、Jenkins 或 GitLab CI,只要项目目录里有配置,CI 主机能访问 SonarQube Server,就可以执行扫描。
它适合三类场景:
- 项目没有统一构建工具。
- 想先用最小方式验证 SonarQube。
- CI/CD 平台还没整理好,但需要先跑通扫描链路。
核心原理拆解
1. Scanner CLI 做了什么
Scanner CLI 会读取项目配置,分析本地源码,然后把分析报告发送到 SonarQube Server。
它不会直接决定 Quality Gate 是否通过。Quality Gate 的计算在 Server 侧完成。Scanner 可以通过参数等待门禁结果,并让 CI 步骤失败。
2. 配置文件位置
通用配置文件名是:
sonar-project.properties通常放在项目根目录:
my-app/├─ src/├─ tests/└─ sonar-project.properties执行扫描时,在项目根目录运行:
sonar-scanner3. 最小配置
最小配置示例:
sonar.projectKey=my-appsonar.projectName=my-appsonar.sources=srcsonar.host.url=http://sonarqube.example.com:9000认证 token 不建议写进文件,而是通过环境变量传入:
export SONAR_TOKEN="your-project-token"sonar-scanner官方文档中 sonar.token 已经替代旧的 sonar.login 和 sonar.password。
4. 常用参数说明
sonar.projectKey:
- 项目唯一标识。
- 必须稳定。
- 应和 SonarQube Server 中项目 key 对应。
sonar.projectName:
- 页面展示名称。
- 可以比 project key 更适合人读。
sonar.sources:
- 主源码目录。
- 可以写相对路径,例如
src。 - 多个目录用逗号分隔。
sonar.tests:
- 测试代码目录。
- 如果不设置,测试代码不会按测试范围识别。
sonar.host.url:
- SonarQube Server 地址。
- CI 主机必须能访问这个地址。
sonar.token:
- Scanner 认证用 token。
- 推荐用
SONAR_TOKEN环境变量传入。
sonar.qualitygate.wait:
- 是否等待 Quality Gate 结果。
- 设置为
true后,门禁失败会让扫描步骤失败。
5. 参数优先级
常见优先级从低到高可以理解为:
全局 UI 配置项目 UI 配置scanner 配置文件命令行 -D 参数命令行参数适合 CI 临时覆盖,项目长期配置更适合放在 UI 或配置文件里。
最小实践示例
1. 普通项目
sonar.projectKey=my-appsonar.projectName=my-appsonar.sources=srcsonar.tests=testssonar.host.url=http://sonarqube.example.com:9000sonar.sourceEncoding=UTF-8运行:
export SONAR_TOKEN="your-project-token"sonar-scanner2. 等待 Quality Gate
export SONAR_TOKEN="your-project-token"sonar-scanner -Dsonar.qualitygate.wait=true这个写法适合 CI/CD。门禁失败时,扫描步骤会失败,流水线可以停止。
3. 命令行覆盖配置
sonar-scanner \ -Dsonar.projectKey=my-app \ -Dsonar.sources=src \ -Dsonar.host.url=http://sonarqube.example.com:9000 \ -Dsonar.qualitygate.wait=true命令行覆盖适合流水线动态传参,但不要把 token 明文写在命令历史或日志里。
常见陷阱
1. 把 token 写进仓库
不要在 sonar-project.properties 中写:
sonar.token=真实token更推荐:
export SONAR_TOKEN="your-project-token"2. projectKey 和服务端项目不一致
如果 sonar.projectKey 写错,扫描结果可能进入错误项目,或者提示项目不存在、无权限。
3. sources 指到错误目录
sonar.sources=. 看起来省事,但可能把构建产物、依赖目录、临时文件也纳入扫描范围。更稳妥的是明确写源码目录。
4. 以为 scanner 会自动跑测试
Scanner 负责代码分析,不等于自动执行单元测试。覆盖率报告通常要先由测试工具生成,再配置给 SonarQube 读取。
5. 在日志里暴露敏感信息
开启 sonar.verbose=true 或打印环境变量时,注意不要把 token、数据库密码、代理密码暴露到 CI 日志里。
一句话总结
SonarScanner CLI 的核心是:用 sonar-project.properties 定义项目和扫描范围,用环境变量传 token,再把分析报告提交给 SonarQube Server。