搭建本地SonarQube服务

部门需要对代码质量和风格进行统一,提高开发效率和质量。本篇主要对搭建sonar服务过程中碰到的问题做一个简单的复习记录。

SonarQube介绍

SonarQube是基于docker搭建的一个代码检测工具,内置了包括js,xml,java,c#等主流编程语言的代码检测规则。我们也可以通过sonarqube去添加自定义的检测规则。给予阿里巴巴开发手册尝试添加一个自定义的规则。

cmd-markdown-logo

搭建本地SonarQube服务

可以通过sonarqube官网下载一个sonarqube。我本地安装的版本是6.7.1。下载之后直接解压就行,我们可以将这个理解为tomcat类似的服务器。下面会分析这个项目的结构。

sonarqube目录结构

cmd-markdown-logo

我们进入到目录下,可以通过extensions目录增加自定义规则,后续会介绍,我们可以将自定义的代码规则打包这个目录下。

bin目录可以启动sonarqube服务,找到对应macos的版本我们可以尝试启动,注意这边启动的时候有个很诡异的地方,我们输入./sonar.sh status

可能会弹出提示,sonarqube is running,但是可能实际上服务可能是stopped未启动的状态,我们可以进入到日志文件tail -f logs/sonar.log查看具体的服务器启动状态。

conf目录下sonar.properties记录sonarqube的配置。我们可以配置访问端口以及本地数据库配置,sonarqube默认会链接到一个临时数据库,数据库主要记录扫描检测代码的结果。

配置本地数据库

sonarqube可以配置本地连接mysql数据库,我们先创建本地mysql数据库账号,注意开启mysql本地服务。

cmd-markdown-logo

maven配置打包自定义规则代码

sonarqube可以将自定义规则打包到extensions文件夹下,首先我们需要将自己写的自定义规则打包成jar包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>

那么我们通过mvn sonar:sonar可以打包成功,然后在target目录下获取到打包好的jar包。

sonarqube设置使用规则

我们登录到sonarqube创建一个自定义规则组。

cmd-markdown-logo

我们可以启用规则。

我们可以在idea中下载插件,sonarlink配置到我们的sonarqube代码检测平台,将对应的代码检测结果下载到本地代码中注释。本地代码会在对应行的位置报错,不同的代码规则会给到不同的提示。这里需要保证本地代码的版本和远程分析代码的版本一致,不然可能部分的报错没办法正常显示在正确的位置。

cmd-markdown-logo

如何添加自定义代码规则

大家可以移步到我的github,根据readme.md中的demo进行开发自定义规则。这里记录下自己开发过程中碰到的部分问题:

1.context.reportissue()调用过程需要指定对应的tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Rule(
key = "SaasParamStartCheck",
name = "POJO 类中布尔类型的变量,都不要加 is",
description = "定义为基本数据类型Boolean isSuccess;的属性,它的方法也是isSuccess(),RPC 框架在反向解析的时候,“以为”对应的属性名称是 success,导致属性获取不到,进而抛出异常。",
priority = Priority.CRITICAL,
tags = {"bug"})
public class SaasParamStartCheck extends BaseCheck {

@Override
public void visitClass(ClassTree tree){
//1.获取类信息
//2.获取属性元素
List<Tree> treeList=tree.members();
//3.判断属性命名
for(Tree oneTree:treeList){
if(oneTree instanceof VariableTree){
VariableTree variableTree=(VariableTree) oneTree;
if(variableTree.type()!=null && variableTree.type().symbolType().name().equals("boolean")){
String name=variableTree.simpleName().name();
if(checkStartWithIS(name)){
context.reportIssue(this,oneTree,"属性名不能以is开头");
// System.out.println("命名错误"+"属性名不能以is开头");
}
}
}
}
super.visitClass(tree);
}
Boolean checkStartWithIS(String name){
if(name.startsWith("is")){
return true;
}
return false;
}
}

执行测试用例之后报错:

cmd-markdown-logo

因为错将tree打出,所以在报错的时候找错了行。抛出了异常。

碰到的问题

1.从本地访问localhost:9000会访问到空白页,一直没办法定位,一开始以为是数据库配置的问题,后面删除了本地数据库所有的表,sonarqube重启之后正常。

2.从本地访问localhost:9000空白页,上面提到过通过./sonar.sh status访问到的状态是sonarqube is running但是实际上sonarqube并没有启动成功。

3.从本地访问localhost:9000空白页,可能是本地数据库服务没打开,我们cd到mysql的目录下启动服务。