08 开发SonarQube Java代码检测规则

简述

SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查

  1. 新建java代码检测规则
  2. 通过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:构建项目

08 开发SonarQube Java代码检测规则

第③部分,存放编写规则的示例页面的文件(.html .json _java.json 不可缺少),如需修改文件存放位置,则需修改②中的MyJavaRulesDefinition.java类,规则示例文件的命名需要和规则的关键值相同加上默认_JAVA后缀,后缀也可进行修改。(此处的LoopsMysqlCheck.json 内容同LoopsMysqlCheck_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方法是对变量进行规则,常用的有对变量的修饰符,名称进行规则。

 如图

08 开发SonarQube Java代码检测规则

3.2规则写好了,配置到RuleList,如下图 

08 开发SonarQube Java代码检测规则

3.3新建示例文件.html 和 _java.json,

html根据自己的规则进行友好提示;

.json照搬,是用来定义这个规则所检测出来的问题的Bug级别以及相关属性;

作用如图,这是我的SonarQube服务器里面加载的自定义规则,并检测出问题

 08 开发SonarQube Java代码检测规则

 3.4新建测试类,照模子,如下图

08 开发SonarQube Java代码检测规则

4.运行测试

提醒:以下报错是正常的,打包的时候跳过测试

08 开发SonarQube Java代码检测规则

上面的图说明6,17,20 行不符合规则 

08 开发SonarQube Java代码检测规则

上图说明没有找到错误 ,打包跳过测试: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

08 开发SonarQube Java代码检测规则

7.心得:

①一个规则不一定只重写一个方法,有时可能需要几个重写方法共同完成

②在使用汉字进行提醒时,汉字尽量采用的unicode编码,避免在页面显示乱码

深入理解可参考:https://www.jianshu.com/p/abf44e8c2610

 

8.issues

规则,导入sonarqube plugins之后,启动了,并且配置检测规则,扫描都ok;当我对代码进行优化,重新打包更新插件时,发现无法启动 具体操作:停止SonarQube》删除plugin下面的插件》拷贝插件到plugin》重启SonarQube

错误如下:部分日记-java.lang.IllegalStateException: Name of rule [repository=finger-java-custom-rules, key=LoopsMysqlCheck] is empty.

08 开发SonarQube Java代码检测规则

解决

08 开发SonarQube Java代码检测规则

LoopsMysqlCheck.json 之前没有添加,因为有了LoopsMysqlCheck_java.json我想去掉LoopsMysqlCheck.json试试看,结果忘记还原了,导致规则库加载不起来;由此此类问题肯定是缺少文件,开发的时候严格按照官方的例子,即使开发时候没有问题,集成到SonarQube中也可能出问题;