SonarQube安装使用以及自定义规则插件
下载安装
官网下载地址 https://www.sonarqube.org/downloads/
本文章使用 sonar5.6版本,下载链接:
https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.zip
wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.zip
tar -zxvf sonarqube-5.6.zip
修改配置文件,在conf文件夹下的sonar.properties
sonar.web.host=0.0.0.0
sonar.web.context=
sonar.web.port=9000
找到上面的三行将#删掉使其生效。
注意,此时已经可以启动sonar服务,但是默认使用的是自带的数据库,如果想要切换到mysql,我们需要将配置文件中的这几行配置进行修改。
修改jdbc连接.png进去 sonar的bin目录,选择对应的操作系统,
./sonar.sh start
Sonar 日志在 log目录下。
打开浏览器,输入http://ip:9000 进行访问。
Sonar使用(maven)
在pom文件中添加如下插件
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在maven的setting 文件中添加如下配置信息
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
#sonar服务器的地址
<sonar.host.url>http://192.168.16.128:9000</sonar.host.url>
</properties>
</profile>
#执行 下面命令进行代码扫描
mvn clean sonar:sonar
扫描成功后程序会将扫描结果上传至sonar服务器,我们访问sonar页面,登录即可查看,默认账号/密码 admin/admin.
自定义规则插件
一般情况下sonar服务器会带有默认规则,如sonar way,供我们使用,我们可以选择针对其中的每一条进行激活或者关闭来自定义我们自己的规范。但是有些情况下,sonar提供的规则并不能满足我们的需求,所以我们需要进行代码规范的自定义。
例:
规则如下:抽象类命名使用 Abstract或 Base开头
我们需要实现上面代码扫描规则编写。
首先我们编写 规则 类
@Rule(key = "interfaceRule", name = "抽象类命名约束",
description = "【强制】抽象类命名使用 Abstract或 Base开头",
priority = Priority.MAJOR)
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.ARCHITECTURE_CHANGEABILITY)
//SQALE全称是Software Quality Assessment based on Lifecycle Expectations,是一套评估代码质量的方法。
@SqaleConstantRemediation("10min") //纠正所需时间
public class InterfaceRule extends BaseTreeVisitor implements JavaFileScanner {
private JavaFileScannerContext context;
@Override
public void scanFile(JavaFileScannerContext context) {
this.context = context;
scan(context.getTree());
}
@Override
public void visitClass(ClassTree tree) {
//查看是否是抽象类
boolean flag = tree.symbol().isAbstract();
if(flag) {
//获取抽象类的类名
String name = tree.simpleName().name();
//如果是抽象类,但不是Abstract开头也不是Base,则不符合规范
if(!name.startsWith("Abstract") && !name.startsWith("Base")) {
context.reportIssue(this,tree, "抽象类命名使用 Abstract或 Base开头");
}
}
super.visitClass(tree);
}
}
定义plugin入口
public class MySonarPlugin implements Plugin {
public void define(Context context) {
// server extensions -> objects are instantiated during server startup
context.addExtension(MyJavaRulesDefinition.class);
// batch extensions -> objects are instantiated during code analysis
context.addExtension(MyJavaFileCheckRegistrar.class);
}
}
public class MyJavaRulesDefinition implements RulesDefinition {
public static final String REPOSITORY_KEY = "myRepo";
public void define(Context context) {
NewRepository repository = context.createRepository(REPOSITORY_KEY, Java.KEY);
repository.setName("xxxxx代码规则仓库");
AnnotationBasedRulesDefinition.load(repository, "java", RulesList.getChecks());
repository.done();
}
}
public class RulesList {
private RulesList() {
}
public static List<Class> getChecks() {
return ImmutableList.<Class>builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build();
}
public static List<Class<? extends JavaCheck>> getJavaChecks() {
return ImmutableList.<Class<? extends JavaCheck>>builder()
// .add(NameRule.class)
.add(InterfaceRule.class)
// .add(ExceptionRule.class)
.build();
}
public static List<Class<? extends JavaCheck>> getJavaTestChecks() {
return ImmutableList.<Class<? extends JavaCheck>>builder()
.build();
}
}
public class MyJavaFileCheckRegistrar implements CheckRegistrar {
public void register(RegistrarContext registrarContext) {
// Call to registerClassesForRepository to associate the classes with the correct repository key
registrarContext.registerClassesForRepository(MyJavaRulesDefinition.REPOSITORY_KEY,
Arrays.asList(checkClasses()), Arrays.asList(testCheckClasses()));
}
/**
* Lists all the checks provided by the plugin
*/
public static Class<? extends JavaCheck>[] checkClasses() {
return new Class[] { // List of rulesto be included here
// NameRule.class,
InterfaceRule.class,
// ExceptionRule.class
};
}
/**
* Lists all the test checks provided by the plugin
*/
public static Class<? extends JavaCheck>[] testCheckClasses() {
return new Class[] {};
}
}
#执行命令进行打包
mvn clean package
将打好的包放到 sonar此目录下/extensions/plugins
sonar插件目录
重启sonar服务
./sonar.sh restart
查看自定义规则.png点击 repository 进行筛选,可以看到我们自定义的规则。
创建一个 profiles, 并设置成默认。
创建profiles.png点击图中active more 按钮,激活我们添加的自定义规则。
激活规则.png