简述
SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查
- 新建java代码检测规则
- 通过Jenkins打包规则代码,发布到SonarQube,并重启
1:下载
https://codeload.github.com/tigerge000/sonar-java-custom-rules/zip/master
基于该代码演示demo
官方demo:https://github.com/SonarSource/sonar-custom-rules-examples
官方操作文档:https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101
2:构建项目
第③部分,存放编写规则的示例页面的文件(.html .json _java.json 不可缺少),如需修改文件存放位置,则需修改②中的MyJavaRulesDefinition.java类,规则示例文件的命名需要和规则的关键值相同加上默认_JAVA后缀,后缀也可进行修改。(此处的*Check.json 内容同*_java.json)
第④部分测试类
- MyJavaRulesPlugin 定义一个插件类,引入规则登记和规则属性
- MyJavaFileCheckRegistrar 规则登记处、注册
- MyJavaRulesDefinition规则属性定义(规则的名字定义,以及相关引用资源.html .json的地址配置)
- RulesList自定义规则集合 我们主要用到这个类,每写一个规则就需要添加进集合
3:自定义规则类
用AbstractClassNameCheck(抽象类命名检查) 里面定义好的,举例
- 3.1新建一个类:public class AbstractClassNameCheck extends BaseTreeVisitor implements JavaFileScanner 具体的参照demo;
- 实现接口JavaFileScanner
- 展开看一下BaseTreeVisitor方法,选择性重写,可重写多个
-
visitMethodInvocation
visitMethodInvocation方法是指对类中调用方法进行规则,通过它可以对项目中禁止使用的方法进行检测,对调用的方法进行检测。
- 重点注意:重写visitClass可以打个断点看一下ClassTree对象,再试一下重写visitMethod,看一下MethodTree对象的值
是如何把被检测转换为一个Tree的,看懂这个Tree以及里面的其他子集,就很容易上手了;(类似 JDT AST的结构)
具体如下图: - visitClass
- visitClass方法主要是对类进行规则时使用,通过ClassTree可以得到类相关的属性。一般来说,我们根据它获取到扫描文件的类名。
- visitMethod
- visitMethod方法主要是对类里面的方法进行规则,常用的有对方法名进行规则,对方法是否抛出异常进行规则
- visitVariable
- visitVariable方法是对变量进行规则,常用的有对变量的修饰符,名称进行规则。
-
如图
3.2规则写好了,配置到RuleList,如下图
3.3、新建示例文件.html 和 _java.json,
html根据自己的规则进行友好提示;
.json照搬,是用来定义这个规则所检测出来的问题的Bug级别以及相关属性;
作用如图,这是我的SonarQube服务器里面加载的自定义规则,并检测出问题
3.4新建测试类,照模子,如下图
4.运行测试
提醒:以下报错是正常的,打包的时候跳过测试
上面的图说明6,17,20 行不符合规则
上图说明没有找到错误 ,打包跳过测试:mvn package -Dmaven.test.skip=true
5.手动打包到SonarQube插件包
把Jar添加到SonarQube插件中
#以下具体路径为实际安装目录
拷贝到:/usr/local/src/sonarqube-7.3/extensions/plugins
重启:cd /usr/local/src/sonarqube-7.3/bin/linux-x86-64
./sonar.sh start
6.Jenkins自动打包
Jenkins打包的代码非上面的代码,是后来写的规则(禁止嵌套循环调用指定的方法)
代码地址:https://github.com/ImTravis/sonar_cus_rules
7.心得:
①一个规则不一定只重写一个方法,有时可能需要几个重写方法共同完成
②在使用汉字进行提醒时,汉字尽量采用的unicode编码,避免在页面显示乱码
8.issues
规则,导入sonarqube plugins之后,启动了,并且配置检测规则,扫描都ok;当我对代码进行优化,重新打包更新插件时,发现无法启动 具体操作:停止SonarQube》删除plugin下面的插件》拷贝插件到plugin》重启SonarQube
错误如下:部分日记-java.lang.IllegalStateException: Name of rule [repository=finger-java-custom-rules, key=LoopsMysqlCheck] is empty.
解决
LoopsMysqlCheck.json 之前没有添加,因为有了LoopsMysqlCheck_java.json我想去掉LoopsMysqlCheck.json试试看,结果忘记还原了,导致规则库加载不起来;由此此类问题肯定是缺少文件,开发的时候严格按照官方的例子,即使开发时候没有问题,集成到SonarQube中也可能出问题;