4. SonarQube 扫描器:SonarScanner 的安装与配置(CLI、Maven、Gradle、Jenkins 插件)
SonarScanner 是 SonarQube 生态中的核心执行组件,负责对源代码进行静态分析并将结果上报至 SonarQube 服务器。根据项目构建工具和 CI 环境的不同,SonarScanner 提供了多种集成方式。本章将系统讲解 CLI 独立扫描器、Maven 与 Gradle 插件、以及 Jenkins 插件的安装与配置方法,帮助你在不同技术栈中快速建立代码质量扫描能力。
http://sonarqube.example.com:9000)以及有效的认证 。
4.1 SonarScanner CLI 安装与配置
CLI 扫描器是最基础的独立运行方式,适用于非 Maven/Gradle 项目、脚本化扫描或快速验证场景。
4.1.1 下载与安装
- 访问 SonarQube 官方下载页面,获取与 SonarQube 服务器版本匹配的 SonarScanner CLI 压缩包。
- 解压至目标目录,例如
/opt/sonar-scanner或C:\sonar-scanner。 - 将
bin目录添加到系统PATH环境变量中。
# Linux / macOS 示例
unzip sonar-scanner-cli-5.0.1.3006-linux.zip -d /opt/
export PATH=$PATH:/opt/sonar-scanner-5.0.1.3006-linux/bin
# 验证安装
sonar-scanner --version
4.1.2 全局配置文件
编辑 conf/sonar-scanner.properties 文件,配置服务器连接信息:
# 服务器地址
sonar.host.url=http://localhost:9000
# 认证 (推荐)或用户名/密码
sonar.login=sqa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 可选:配置 JDK 路径(如果系统默认 JDK 版本不兼容)
# sonar.java.home=/usr/lib/jvm/java-11-openjdk
4.1.3 项目级配置
在项目根目录创建 sonar-project.properties 文件:
# 项目唯一标识
sonar.projectKey=com.example:my-project
sonar.projectName=My Project
sonar.projectVersion=1.0.0
# 源代码目录(相对于项目根目录)
sonar.sources=src
# 编译后的字节码目录(Java 项目必需)
sonar.java.binaries=target/classes
# 语言
sonar.language=java
# 编码
sonar.sourceEncoding=UTF-8
4.1.4 执行扫描
cd /path/to/your/project
sonar-scanner
sonar.login 和 sonar.password 通过环境变量或 CI 密钥管理传递,避免硬编码在配置文件中。
4.2 Maven 插件配置
对于 Maven 项目,SonarScanner 以插件形式集成,无需额外下载 CLI,配置简洁且与构建生命周期无缝衔接。
4.2.1 在 pom.xml 中声明插件
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.11.0.3922</version>
</plugin>
</plugins>
</build>
4.2.2 配置服务器连接(settings.xml 或命令行)
方式一:在 ~/.m2/settings.xml 中配置全局服务器信息:
<settings>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>http://localhost:9000</sonar.host.url>
<sonar.login>sqa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</sonar.login>
</properties>
</profile>
</profiles>
</settings>
方式二:直接在命令行传递参数(适合 CI 环境):
mvn clean verify sonar:sonar \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=sqa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4.2.3 常用参数说明
| 参数 | 说明 | 示例值 |
|---|---|---|
sonar.projectKey |
项目唯一标识 | com.example:my-app |
sonar.projectName |
项目显示名称 | My Application |
sonar.branch.name |
分支名称(需 Developer Edition 及以上) | feature/login |
sonar.coverage.jacoco.xmlReportPaths |
JaCoCo 覆盖率报告路径 | target/site/jacoco/jacoco.xml |
pom.xml 中读取 groupId:artifactId:version 作为默认的 sonar.projectKey,通常无需额外指定。
4.3 Gradle 插件配置
Gradle 项目通过 org.sonarqube 插件集成 SonarScanner,配置方式与 Maven 类似,但更贴合 Gradle 的 DSL 风格。
4.3.1 应用插件
在 build.gradle 中:
plugins {
id "org.sonarqube" version "4.4.1.3373"
}
或使用旧版 buildscript 方式:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373"
}
}
apply plugin: "org.sonarqube"
4.3.2 配置 SonarQube 属性
sonarqube {
properties {
property "sonar.host.url", "http://localhost:9000"
property "sonar.login", "sqa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
property "sonar.projectKey", "com.example:gradle-app"
property "sonar.projectName", "Gradle Application"
property "sonar.sourceEncoding", "UTF-8"
}
}
4.3.3 执行扫描
# 先执行编译和测试,再运行 SonarQube 分析
./gradlew clean test sonarqube
# 或直接指定参数覆盖
./gradlew sonarqube \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=sqa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sonarqube 任务之前,已经运行了 compileJava 和 test 等任务,否则分析可能因缺少字节码而失败。
4.4 Jenkins 插件配置
Jenkins 作为最流行的 CI/CD 引擎,通过 SonarQube Scanner for Jenkins 插件实现与 SonarQube 的深度集成,支持 Pipeline 和 Freestyle 项目。
4.4.1 安装插件
- 进入 Jenkins → 系统管理 → 插件管理 → 可选插件。
- 搜索 SonarQube Scanner 并安装。
- 重启 Jenkins 使插件生效。
4.4.2 配置 SonarQube 服务器
- 进入 Jenkins → 系统管理 → 系统配置。
- 找到 SonarQube servers 区域,点击 Add SonarQube。
- 填写以下信息:
| 字段 | 说明 | 示例值 |
|---|---|---|
| Name | 服务器标识名称 | SonarQube-Prod |
| Server URL | SonarQube 服务器地址 | http://sonarqube.example.com:9000 |
| Server authentication | 在 Jenkins 凭据中创建的 Secret Text 类型 | 选择已配置的凭据 |
4.4.3 配置 SonarScanner 工具
- 进入 Jenkins → 系统管理 → 全局工具配置。
- 找到 SonarQube Scanner 区域,点击 Add SonarQube Scanner。
- 选择 Install automatically,并选择版本(建议与服务器版本匹配)。
4.4.4 Pipeline 集成示例
pipeline {
agent any
tools {
// 引用全局工具配置中定义的 JDK 和 Maven
jdk 'JDK-11'
maven 'Maven-3.9'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build & Test') {
steps {
sh 'mvn clean verify'
}
}
stage('SonarQube Analysis') {
steps {
// 使用配置的 SonarQube 服务器和扫描器
withSonarQubeEnv('SonarQube-Prod') {
sh 'mvn sonar:sonar'
}
}
}
stage('Quality Gate Check') {
steps {
// 等待 SonarQube 分析完成并检查质量阈
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
4.4.5 Freestyle 项目配置
- 在项目配置中,添加构建步骤 Invoke Standalone SonarQube Scanner。
- 在 Analysis properties 中填写项目属性:
sonar.projectKey=com.example:freestyle-app
sonar.projectName=Freestyle Application
sonar.projectVersion=1.0.0
sonar.sources=src
sonar.java.binaries=target/classes
sonar.sourceEncoding=UTF-8
withSonarQubeEnv 会自动注入 sonar.host.url 和 sonar.login 环境变量,无需在命令行中重复指定。waitForQualityGate 步骤可实现质量阈自动门禁,阻断不合格代码进入后续阶段。
4.5 四种集成方式对比
| 集成方式 | 适用场景 | 依赖 | 配置复杂度 | 推荐度 |
|---|---|---|---|---|
| CLI Scanner | 非 Maven/Gradle 项目、脚本化扫描、快速验证 | 需单独下载安装 | 中等 | ⭐⭐⭐ |
| Maven Plugin | Maven 项目、标准 Java 构建 | 仅需 pom.xml 声明 | 低 | ⭐⭐⭐⭐⭐ |
| Gradle Plugin | Gradle 项目、Android 项目 | 仅需 build.gradle 声明 | 低 | ⭐⭐⭐⭐⭐ |
| Jenkins Plugin | CI/CD 流水线、多分支、质量门禁 | 需安装 Jenkins 插件 | 中等 | ⭐⭐⭐⭐ |
4.6 常见问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
扫描失败:Not authorized |
无效或未配置 | 检查 sonar.login 是否正确,或在 SonarQube 中重新生成 |
| 扫描成功但无结果 | 项目 Key 与已有项目冲突 | 使用唯一的 sonar.projectKey,或删除旧项目后重试 |
Maven 扫描报 java.lang.OutOfMemoryError |
JVM 堆内存不足 | 设置 MAVEN_OPTS=-Xmx2g 或 SONAR_SCANNER_OPTS=-Xmx2g |
Jenkins Pipeline 中 waitForQualityGate 超时 |
SonarQube Webhook 未配置 | 在 SonarQube 管理界面配置 Jenkins Webhook URL |
通过本章的学习,你已经掌握了四种主流 SonarScanner 集成方式的安装与配置方法。在实际项目中,应根据团队技术栈和 CI/CD 基础设施选择最合适的方案,并确保扫描器版本与 SonarQube 服务器保持一致,从而为后续的质量门禁与缺陷闭环管理打下坚实基础。