Sonarqube系列03:Java 代码质量扫描
1. 1 如何扫描代码
安装好服务端 Sonarqube server 后,可以开始在本地安装 Scanner 并创建项目了。官方提供多种 Scanner 满足不同场景下的需求:
- Gradle - SonarScanner for Gradle
- . NET - SonarScanner for .NET
- Maven - use the SonarScanner for Maven
- Jenkins - SonarScanner for Jenkins
- Azure DevOps - SonarQube Extension for Azure DevOps
- Ant - SonarScanner for Ant
- anything else (CLI) - SonarScanner 在开始扫描前,需要了解如下内容:
- 对所有支持语言都会对源代码进行静态分析,部分语言会进行编译代码的静态分析(Java . Class、C# . Dll 等)。
- 默认情况下,Sonarqube 不会对所有文件进行分析,只会对当前版本能识别的文件进行分析(例如社区版不支持 C++,将会自动忽略 . Cpp 文件)。
- Scanner 将分析报告发回 Sonarqube 进行异步分析,报告分析是排队顺序处理,因此,分析完成后短时间可能无法查看最新分析内容。
- 由于 Scanner 是基于 Java 编写,当待审查项目太大或太复杂时,可能会引起内存溢出 bug:
java.lang.OutOfMemoryError: GC overhead limit exceeded
.,请适当调大内存。
2. 2 准备工作
2.1. 2.1 创建 Token
Token 是代码分析时上传报告所需的权限认证,虽然官方支持账号名和密码形式,容易暴露敏感信息,所以更建议使用 Token。
Token 的类型有两种:项目 token 和账号 token。两者主要区别是作用域不同,前者只适用于所属项目,后者适用于所属账号权限下的所有项目。
这里使用账号 token,创建需登录 Sonarqube,「右上角头像」-「My Account」-「Security」进入 Token 创建:
关闭页面后无法再查看,所以请妥善保存生成的 Token。
2.2. 2.2 创建项目
Project Key 是项目的唯一标识,后续分析时需要指定,创建后为项目设置 Token。
创建完成后,可通过「Project Settings」对项目进行相关配置,包括不限于「New Code」(新代码)「Quality Profiles」(质量配置)「Quality Gate」(质量门禁)「Permissions」(权限)。
2.3. 2.3 扫描配置
Scanner 需要设定扫描参数,支持多种方式进行设定,一般情况下都支持这两种方式:动态传参、Properties 配置文件。
Properties 文件方式需在项目根目录创建 sonar-project.properties
文件,内容如下:
1 | # 项目标识,项目应当已经在 SonarQube 中创建好; |
动态传参方式在扫描命令后面使用 -D 设置对应参数:
1 | 多个参数用空格隔开 |
具体使用时需要考虑不同语言情况适当调整配置参数和配置方式,更详细参数定义可以查看官方文档。
3. 3 Java 代码扫描
3.1. 3.1 扫描规则
除官方规则外,推荐两个额外规则库:
Findbugs
Findbugs java 代码质量检查 官网
在插件市场搜索栏中搜索
Findbugs
,点击安装
PMD-P3C
PMD 代码质量检查,支持 Java, JavaScript, Salesforce. Com Apex and Visualforce, PLSQL, Apache Velocity, XML, XSL
P3C 是阿里巴巴出品的 Java 编程规范
官方没提供实现,社区整合插件地址见这里
3.2. 3.2 分析代码
Java 代码扫描推荐使用 SonarScanner for Maven 插件,使用之前需要确认满足其运行的基础环境:
- Maven 3.X
- JDK 8
注意:JDK 版本并不是一成不变,而是需根据部署好的 Sonarqube 版本,找到其对应的 Scanner 的 JDK 版本要求
对于单模块项目,直接执行
1 | mvn clean complie |
对于多模块项目有复杂的依赖关系,建议先 install 到本地,再执行扫描
1 | mvn clean install |
4. 4 报告解读
4.1. 4.1 查看报告
4.2. 4.2 问题类型
- Bug: 代码可能包含 bug,代码可能脱离了开发者的本意;
- Vulnerability: 安全性相关的弱点,例如代码中包含了 IP 地址、某环境的用户名密码等;
- Code Smell: 代码规范相关,例如重复代码块、重复常量、过于复杂的嵌套逻辑等;
- Debt: 预估修复所有问题所需时间的总和。
4.3. 4.3 问题解决
- Confirm: 确认这是一个需要解决的问题;
- 修复代码,在下次分析结果中将不会再看到;
- Resolve as Fixed: 标记为已解决,将来 Sonarqube 将不会继续报告问题;
- Resolve as false positive: 标记为误报,此处代码将不会再报告同样问题;
- Resolve as won’t fix: 不会修复。
Sonarqube 自带规则会有相应提示,可以帮助用户更好的理解问题和解决问题。