亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

SonarQube安裝使用以及自定義規則插件

標簽:
Kubernetes

下载安装

官网下载地址 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.0sonar.web.context=
sonar.web.port=9000

找到上面的三行将#删掉使其生效。

注意,此时已经可以启动sonar服务,但是默认使用的是自带的数据库,如果想要切换到mysql,我们需要将配置文件中的这几行配置进行修改。

webp

修改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


webp

sonar插件目录

重启sonar服务

./sonar.sh restart

webp

查看自定义规则.png

点击 repository 进行筛选,可以看到我们自定义的规则。

创建一个 profiles, 并设置成默认。

webp

创建profiles.png

点击图中active more 按钮,激活我们添加的自定义规则。

webp

激活规则.png



作者:相见无望zxc
链接:https://www.jianshu.com/p/1a1355ae6894


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
移動開發工程師
手記
粉絲
46
獲贊與收藏
145

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消