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

作者: 无妄zxc | 来源:发表于2018-08-29 21:01 被阅读4次

    下载安装

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

    相关文章

      网友评论

        本文标题:SonarQube安装使用以及自定义规则插件

        本文链接:https://www.haomeiwen.com/subject/zuzkwftx.html