简介

Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。

Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。

支持Java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。
Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

  1. 不遵循代码标准
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
  2. 潜在的缺陷
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。
  3. 糟糕的复杂度分布
    文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
  4. 重复
    显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
  5. 注释不足或者过多
    没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
  6. 缺乏单元测试
    sonar可以很方便地统计并展示单元测试覆盖率。
  7. 糟糕的设计
    通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测藕合。

安装

SonarQube 版本很多,对JDK版本要求也不同,这里以7.3 Community版本为例。

基于CentOS系统安装

环境信息

工具/环境 版本
CentOS 7.4
SonarQube 7.3
MySql 5.7
JDK 1.8
  1. 官网下载对应操作系统的安装包,官网下载链接:https://www.sonarqube.org/downloads/

  1. 安装

注意事项:

  • SonarQube安装使用依赖JDK,需提前安装配置好JDK相关信息

  • SonarQube安装使用依赖数据库和ElasticSearch,故需要提前准备好数据库和ElasticSearch相关资源

注意:SonarQube 7.3 版本要求MySQL版本不能低于5.6且提前创建好名为sonar的数据库

  • 启动SonarQube和ElasticSearch不可使用root账户,故需要提前创建好新的用户组和用户,被赋予SonarQube文件夹可操作权限

第一步: 上传并解压安装包至任意工作目录,这里以/home为例

第二步:新建用户组sonar和用户sonar并分配sonar目录可操作性权限

第三步: 切换至sonar用户启动SonarQube

启动过程中可进入logs目录查看相关服务启动日志,启动成功之后浏览器访问:http://IP:9000 即可

第四步: 安装必要插件

因官网下载安装的系统界面语言为英文,且不可导出pdf报告,简单介绍如下安装插件

中文插件包下载链接

导出pdf插件包下载链接

上传插件包到sonarqube安装目录下的extensions/plugins/目录下,然后重启系统即可。

第五步: 登录系统

登录Web系统,确实账号密码为admin/admin

使用

结合Maven如何利用Sonar分析代码

在工程根目录执行如下命令分析代码质量

mvn sonar:sonar -Dsonar.host.url=http://180.8.2.99:9000 -Dsonar.login=c3e9b746e26f0fef387a0e8eb4ccfc0d6c6a94b0

注意:最后面的login参数可在Web系统页面获取

  1. 进入创建token页面

  1. 手动生成一个token

  1. 通过maven命令分析代码质量

  1. 分析结束,在登录Web系统查看及下载分析报告

常见问题

SonarQube 解决代码误判的问题

SonarQube 解决误判有两个方式

  1. 第一种是通过注释

在被误判的代码行后面加上注释://NOSONAR

// 这里的user被sonar认为可能会为null
String name = user.getName(); //NOSONAR

注意:注释一定要写在代码的同一行后面。

  1. 第二种是使用注解 @SuppressWarnings

在类或方法上面加上 @SuppressWarnings 注解

@SuppressWarnings("squid:S1309")
public class Example {
	...

	@SuppressWarnings("all")
	public void example(){
	}
}

@SuppressWarnings(“all”) // 忽略全部规则
@SuppressWarnings(“squid:S2259”) // 忽略指定规则
@SuppressWarnings({“squid:S2259”, “squid:S1309”}) // 忽略多条指定规则

指定规则需要写规则的id,规则id的查找方法:

点击进去规则详情,在右上角可以看到规则的id

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

版权声明:本文为feifuzeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/feifuzeng/p/14717802.html