Sonarqube系列03:Java 代码质量扫描

1. 1 如何扫描代码

安装好服务端 Sonarqube server 后,可以开始在本地安装 Scanner 并创建项目了。官方提供多种 Scanner 满足不同场景下的需求:

  • 对所有支持语言都会对源代码进行静态分析,部分语言会进行编译代码的静态分析(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
2
3
4
5
6
7
8
# 项目标识,项目应当已经在 SonarQube 中创建好;
sonar.projectKey=myproject
# SonarQube 服务器地址;
sonar.host.url=http://192.168.1.2
# Token;
sonar.login=tokenvalue
# 代码分支,需安装 Community Branch 插件
sonar.branch.name=develop

动态传参方式在扫描命令后面使用 -D 设置对应参数:

1
2
# 多个参数用空格隔开
-Dsonar.host.url=http://192.168.1.2 -Dsonar.login=tokenvalue -Dsonar.projectKey=myproject -Dsonar.branch.name=develop

具体使用时需要考虑不同语言情况适当调整配置参数和配置方式,更详细参数定义可以查看官方文档

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
2
mvn clean complie
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar -Dsonar.host.url=http://192.168.1.2 -Dsonar.login=tokenvalue -Dsonar.projectKey=myproject -Dsonar.branch.name=develop

对于多模块项目有复杂的依赖关系,建议先 install 到本地,再执行扫描

1
2
mvn clean install
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar -Dsonar.host.url=http://192.168.1.2 -Dsonar.login=tokenvalue -Dsonar.projectKey=myproject -Dsonar.branch.name=develop

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 自带规则会有相应提示,可以帮助用户更好的理解问题和解决问题。

5. 5 参考资料