微服务架构和实践Jenkins+Sonar使用Jenkins & Linux

SonarQube安装使用以及自定义规则插件

2018-08-29  本文已影响4人  无妄zxc

下载安装

官网下载地址 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
上一篇下一篇

猜你喜欢

热点阅读