1. 概述
本文将介绍如何使用开源代码质量检测平台 SonarQube 进行静态源代码分析。核心问题来了:为什么要分析源代码?简单来说,是为了确保项目在整个生命周期中的质量、可靠性和可维护性——糟糕的代码库维护成本总是更高。
2. 本地运行SonarQube
本地运行 SonarQube 有两种方式:
通过 Docker 容器运行
执行以下命令启动服务器:docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
3. 生成 SonarQube Token
启动 SonarQube 服务器后,使用初始默认凭据 admin:admin 登录(首次登录会要求修改密码)。
要在项目中使用扫描器,需从 SonarQube 界面生成访问令牌。登录后进入账户页面(http://localhost:9000/account),选择 Security 标签页,可生成三种项目令牌:
- 项目分析令牌(Project Analysis Token)—— 仅适用于单个项目
- 全局分析令牌(Global Analysis Token)—— 在所有项目间共享
- 用户令牌(User Token)—— 基于用户权限,决定可访问的项目
4. 分析源代码
在 pom.xml 中定义插件:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.4.0.905</version>
</plugin>
</plugins>
</pluginManagement>
</build>
插件最新版本可在这里获取。
在项目根目录执行以下命令扫描代码:
mvn clean verify sonar:sonar -Dsonar.projectKey=PROJECT_KEY
-Dsonar.projectName='PROJECT_NAME'
-Dsonar.host.url=http://localhost:9000
-Dsonar.token=THE_GENERATED_TOKEN
⚠️ 需替换:
project_key
和project_name
为项目信息the-generated-token
为步骤 3 生成的令牌
本文使用的示例项目可在这里查看。
命令执行后,结果将显示在项目仪表盘(http://localhost:9000)。其他可选参数可参考[官方文档](https://docs.sonarqube.org/latest/analysis/analysis-parameters/),注意各语言插件有特定的分析规则。
5. 分析结果
访问 http://localhost:9000 刷新页面,即可看到报告摘要:
发现问题分为五类:
- Bug(缺陷)
- Vulnerability(漏洞)
- Code Smell(代码异味)
- Coverage(覆盖率)
- Duplication(重复率)
每类问题都标注了数量或百分比,严重程度分为五级:阻断(Blocker)、严重(Critical)、主要(Major)、次要(Minor) 和 提示(Info)。项目名称前的图标显示质量门状态:✅ 通过(绿色)或 ❌ 失败(红色)。
点击项目名称进入专用仪表盘,可深入查看项目详情。项目仪表盘包含三个标签页:
- 代码(Code)
- 活动(Activity)
- 管理(Administration)
问题标签页显示:
- 问题类别
- 严重程度
- 标签
- 修复所需工时(按时间计算)
支持分配问题、添加评论、修改严重程度。左侧的筛选器可快速定位问题。如何判断代码库是否适合生产部署?这就需要质量门(Quality Gate)。
6. SonarQube 质量门
6.1 什么是质量门?
质量门是一组条件,项目必须满足这些条件才能发布到生产环境。核心问题:当前代码能否直接部署?
通过持续修复旧问题并确保新代码质量,可长期维护健康的代码库。质量门为每次新增代码设置验证规则,规则同样影响未修改的代码段。防止新问题产生,最终消除所有问题。
这类似于从源头修复漏水。引出关键概念——泄漏期(Leak Period):指两次分析/版本之间的时间段。
重新分析同一项目后,项目仪表盘的概览标签页会显示泄漏期结果:
在 Web 界面的 Quality Gates 标签页可管理所有质量门。默认预装了 SonarQube way 质量门,其失败条件包括:
- 新代码覆盖率 < 80%
- 新代码重复率 > 3%
- 可维护性/可靠性/安全性评级低于 A
基于此,我们可以创建自定义质量门。
6.2 添加自定义质量门
操作步骤:
- 点击 Quality Gates 标签页 → Create 按钮(页面左侧)
- 输入名称(如 baeldung)
- 设置条件:
从 Add Condition 下拉菜单选择 Blocker Issues,立即显示在条件列表中:
- 操作符(Operator)设为 is greater than
- 错误值(Error)设为 0
- 勾选 Over Leak Period(仅限泄漏期)
点击 Add 保存。按相同流程添加第二个条件:
- 从 Add Condition 选择 issues
- 勾选 Over Leak Period
- 操作符设为 is less than
- 错误值设为 1
此规则含义:若新增代码问题数小于1,则质量门失败(仅作演示用)。点击 Add 保存。
最后一步:将项目关联到自定义质量门。滚动到页面底部的 Projects 部分:
- 点击 All
- 勾选目标项目
- 可在页面右上角设为默认质量门
重新扫描项目(使用之前的 Maven 命令),刷新项目标签页。此时质量门将失败——因为我们设置了“无新问题则失败”的规则。
回到 Quality Gates 标签页,将 issues 条件的操作符改为 is greater than,点击 Update。再次扫描,质量门将通过。
7. 集成到 CI 流程
可将 SonarQube 集成到持续集成(CI)流程中,当代码分析不满足质量门时自动使构建失败。
我们将使用云端版 SonarQube——SonarCloud:
- 注册账号:https://sonarcloud.io/sessions/new
- 在 My Account > Organizations 获取组织密钥(格式如 xxxx-github)
- 在 My Account > Security 生成令牌(同本地版)
本文以 Travis CI 为例:
- 用 GitHub 账号注册:https://travis-ci.org/
- 激活目标项目的 CI 开关
- 添加 SonarCloud 令牌到 Travis 环境变量:
- 进入项目页面 → More Options → Settings
- 滚动到 Environment Variables
添加新条目:
- 名称:
SONAR_TOKEN
- 值:SonarCloud 生成的令牌
- Travis 会自动加密隐藏
最后,在项目根目录创建 .travis.yml 文件:
language: java
sudo: false
install: true
addons:
sonarcloud:
organization: "your_organization_key"
token:
secure: "$SONAR_TOKEN"
jdk:
- oraclejdk8
script:
- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.sonar/cache'
替换
your_organization_key
为实际组织密钥。提交代码并推送到 GitHub 仓库将自动触发 Travis CI 构建和 Sonar 扫描。
8. 总结
本文介绍了如何本地部署 SonarQube 服务器,以及使用质量门定义项目生产就绪标准。更多平台功能细节可参考 SonarQube 官方文档。