众所周知,代码质量管理是软件开发过程中一个很重要的环节,它包括复杂度、重复率和代码风格等要素。烂代码不仅具有破窗效应和传染性,严重的甚至会影响整体开发水准,导致恶性循环。因此,我们希望在建立代码规范与Code Review制度之外,还能采取行之有效的辅助手段进行代码检查,以降低人工Code Review成本,同时提高检查效率。
这里简单介绍一下Snoar,Sonar是一个用于代码质量管理的开源平台,通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,比如pmd-cpd、checkstyle、findbugs等,通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
好了,废话不多说,下面主要介绍一下如何安装和使用Sonar。
服务端安装与运行
安装包,请至官网自行下载,推荐使用长期支持版本。
下载地址:
http://www.sonarqube.org/downloads/
为安全起见,Sonar不允许使用root用户运行,因此我们需要创建普通用户进行安装和运行。
安装步骤如下:
1) 创建用户:
useradd sonar –d /home/sonar
2) 设置sonar用户的密码:
passwd sonar
3) 切换到sonar用户,解压缩包
4) 解压后,根据运行平台执行bin下不同目录下的启动脚本。我这里是linux-x86-64,运行bin/linux-x86-64/sonar.sh。
常用命令:
./sonar.sh { console | start | stop | restart | status | dump }
5) sonar默认显示英文,推荐安装中文包,可在线安装,也可离线安装,离线安装将中文包插件放置在
${SONAR_HOME}/extensions/plugins
目录下,重启后生效。
6) sonar默认使用内存数据库H2,数据安全性不能保证,因为推荐使用关系型数据库,sonar支持多种数据库类型。我这里用了mysql,创建mysql用户实例:
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%' IDENTIFIED BY 'sonar' WITH GRANT OPTION;
FLUSH PRIVILEGES;
7) sonar配置mysql,这样在sonar第一次启动的时候会将数据库脚本信息直接刷入到上面所建的sonar数据库中,即初始化数据库。
修改
${SONAR_HOME}/conf/sonar.properties
配置文件
sonar.jdbc.url=jdbc:mysql://ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.sorceEncoding=UTF-8
8) 检查jdk版本,要求1.8以上,若服务器当前默认jdk路径不为1.8,可在安装JDK1.8之后修改
${SONAR_HOME}/conf/wrapper.conf
的配置路径,wrapper.java.command=你的jdk路径
9) soanr默认端口为9000,若9000端口已被其他应用占用,则需更改默认端口。修改
${SONAR_HOME}/conf/sonar.properties
配置文件,更改端口sonar.web.port=你要的端口
10) 以上步骤完毕后,执行./sonar.sh start 启动sonar服务
启动成功之后,浏览器输入http://ip:port/
即可访问sonar。sonar默认使用admin/admin账号进行登录。
客户端配置
由于我们的工程是maven管理的,这里说说如何基于maven进行sonar配置。
● 修改
${MAVEN_HOME}/conf/settings.xml配置文件
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://sonar服务ip:端口
</sonar.host.url>
<sonar.jdbc.username>admin</sonar.jdbc.username> <sonar.jdbc.password>admin</sonar.jdbc.password>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>sonar</activeProfile>
</activeProfiles>
● 执行mvn sonar:sonar命令进行代码分析。
分析结果查看
1、Home页

2、项目总面板视图。显示项目包括程序统计信息、问题统计信息、技术债务、代码复杂度、单元测试覆盖度等。

3、问题视图。点击左侧导航条的“问题”链接,打开问题视图页。

4、问题明细,点击具体问题,进入问题明细页

管理员可对问题进行重新确认和分配。
点击问题简述旁边的按钮,展示问题说明和原因,如下:

查看错误详情会有一行提示:
Neither "Math.abs" nor negation should be used on numbers that could be "MIN_VALUE"。
意思是说代码取绝对值操作可能会超过int类型的最小值。
这里分析下原因:rand.nextInt()所取值范围为-2147483648至2147483647,所以取绝对值的时候就会出现2147483648超出int范围的问题,取Math.abs(-2147483648)值仍为-2147483648。在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE,即-2147483648。
所以,写代码的时候不够仔细或者对int基本数据类型理解不透彻,很容易造成这种问题,而且这类问题靠人工code review是很容易疏漏的。
其他
Sonar代码扫描插件除自身支持的插件外,还可引入第三方可信赖插件进行扫描。这里我使用了阿里的p3c插件,同理放置在
${SONAR_HOME}/extensions/plugins
目录即可。不仅如此,sonar还支持代码规则自定义添加和质量阈值配置,这个留待后续介绍。






