暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

持续集成:使用SONAR进行代码质量管理

浙金科技无限 2019-08-24
901

众所周知,代码质量管理是软件开发过程中一个很重要的环节,它包括复杂度、重复率和代码风格等要素。烂代码不仅具有破窗效应和传染性,严重的甚至会影响整体开发水准,导致恶性循环。因此,我们希望在建立代码规范与Code Review制度之外,还能采取行之有效的辅助手段进行代码检查,以降低人工Code Review成本,同时提高检查效率。


这里简单介绍一下Snoar,Sonar是一个用于代码质量管理的开源平台,通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,比如pmd-cpd、checkstyle、findbugs等,通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。


好了,废话不多说,下面主要介绍一下如何安装和使用Sonar。

01

服务端安装与运行

安装包,请至官网自行下载,推荐使用长期支持版本。

下载地址:

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账号进行登录。

02

客户端配置

由于我们的工程是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命令进行代码分析。

03

分析结果查看

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是很容易疏漏的。

04

其他

Sonar代码扫描插件除自身支持的插件外,还可引入第三方可信赖插件进行扫描。这里我使用了阿里的p3c插件,同理放置

${SONAR_HOME}/extensions/plugins

目录即可。不仅如此,sonar还支持代码规则自定义添加和质量阈值配置,这个留待后续介绍。

文章转载自浙金科技无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论