文档章节

sonar自定义规则

go4it
 go4it
发布于 2017/03/11 23:47
字数 1118
阅读 207
收藏 0

Sonar并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。

sonarqubue默认的对java的检测规则不一定适合我们,可以自己去自定义rules。

##禁用rules Rules-Quality Profile- Sonar way Java 查看激活的规则,可以禁用,或者更改严重级别(Severity) 输入图片说明

##自定义rules sonar提供XPath或Java方式的扩展,有的语言支持XPath,有的只能支持Java,比如Java语言只支持Java方式的扩展。具体详见Support of Custom Rules by Language

###步骤如下:

  • 创建一个SonarQube插件
  • 增加相关依赖
  • 创建自定义rules
  • 生成插件的jar包
  • 将该jar包放在SONARQUBE_HOME/extensions/plugins目录下
  • 重启SonarQube

##添加maven依赖

<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>

		<sonar-plugin-api.version>5.6</sonar-plugin-api.version>
		<sonar-java-plugin.version>4.2</sonar-java-plugin.version>
		<sonar-packaging-maven-plugin.version>1.17</sonar-packaging-maven-plugin.version>

		<sslr-testing-harness.version>1.20</sslr-testing-harness.version>
		<junit.version>4.12</junit.version>
		<fest-assert.version>1.4</fest-assert.version>
		<logback-classic.version>1.1.3</logback-classic.version>

	</properties>
	<dependencies>
		<dependency>
			<groupId>org.sonarsource.sonarqube</groupId>
			<artifactId>sonar-plugin-api</artifactId>
			<version>${sonar-plugin-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.sonarsource.java</groupId>
			<artifactId>sonar-java-plugin</artifactId>
			<version>${sonar-java-plugin.version}</version>
			<type>sonar-plugin</type>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.sonarsource.java</groupId>
			<artifactId>java-checks-testkit</artifactId>
			<version>${sonar-java-plugin.version}</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.codehaus.sonar.sslr</groupId>
			<artifactId>sslr-testing-harness</artifactId>
			<version>${sslr-testing-harness.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.easytesting</groupId>
			<artifactId>fest-assert</artifactId>
			<version>${fest-assert.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback-classic.version}</version>
			<scope>test</scope>
		</dependency>

		<!--http://stackoverflow.com/questions/35369058/custom-plugin-for-sonarqube-5-2-produces-noclassdeffounderror-->
		<!-- https://mvnrepository.com/artifact/org.codehaus.sonar.sslr-squid-bridge/sslr-squid-bridge -->
		<dependency>
			<groupId>org.codehaus.sonar.sslr-squid-bridge</groupId>
			<artifactId>sslr-squid-bridge</artifactId>
			<version>2.6</version>
            <!--记得exclude掉sonar-plugin-api,才可以加载其他相关依赖-->
			<exclusions>
				<exclusion>
					<groupId>org.codehaus.sonar</groupId>
					<artifactId>sonar-plugin-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.6.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>19.0</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.10</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>


	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
				<artifactId>sonar-packaging-maven-plugin</artifactId>
				<version>${sonar-packaging-maven-plugin.version}</version>
				<extensions>true</extensions>
				<configuration>
					<pluginKey>java-custom</pluginKey>
					<pluginName>Java Custom Rules</pluginName>
					<!-- your plugin class -->
					<pluginClass>com.xixicat.sonar.MySonarPlugin</pluginClass>
					<sonarLintSupported>true</sonarLintSupported>
					<sonarQubeMinVersion>5.6</sonarQubeMinVersion> <!-- allow to depend on API 6.x but run on LTS -->
				</configuration>
			</plugin>
		</plugins>
	</build>

这里的依赖要小心配置,记得exclude掉sonar-plugin-api,才可以加载其他相关依赖,然后显示依赖用到的jar,否则容易报class not found

##编写plugin ###创建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);
    }
}

这个类实现了org.sonar.api.Plugin接口,主要添加两类扩展:

  • server extensions 在sonarqube server启动时实例化,实现org.sonar.api.server.rule.RulesDefinition接口
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("my sonar repo");
        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(AvoidSmallerLengthVariableNameRule.class)
                .build();
    }

    public static List<Class<? extends JavaCheck>> getJavaTestChecks() {
        return ImmutableList.<Class<? extends JavaCheck>>builder()
                .build();
    }
}

  • batch extensions 在分析代码的时候实例化,实现org.sonar.plugins.java.api.CheckRegistrar接口
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 rules to be included here
                AvoidSmallerLengthVariableNameRule.class
        };
    }

    /**
     * Lists all the test checks provided by the plugin
     */
    public static Class<? extends JavaCheck>[] testCheckClasses() {
        return new Class[] {};
    }
}

###创建规则

import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.check.RuleProperty;
import org.sonar.plugins.java.api.JavaFileScanner;
import org.sonar.plugins.java.api.JavaFileScannerContext;
import org.sonar.plugins.java.api.tree.BaseTreeVisitor;
import org.sonar.plugins.java.api.tree.VariableTree;
import org.sonar.squidbridge.annotations.SqaleConstantRemediation;
import org.sonar.squidbridge.annotations.SqaleSubCharacteristic;

@Rule(key = "AvoidSmallerLengthLocalVariableName",
        name = "Avoid usage of the smaller length in local variable name",
        description = "This rule detects usage of smaller length local variable name. Variable name should not be smaller than 4 characters.",
        tags = {"coding-guideline"},
        priority = Priority.MINOR)
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.ARCHITECTURE_CHANGEABILITY)
//SQALE全称是Software Quality Assessment based on Lifecycle Expectations,是一套评估代码质量的方法。
@SqaleConstantRemediation("10min") //纠正所需时间
public class AvoidSmallerLengthVariableNameRule extends BaseTreeVisitor implements JavaFileScanner {

    private static final String DEFAULT_VALUE = "SmallerLengthLocalVariable";

    private JavaFileScannerContext context;

    /**
     * Avoid usage of the smaller length in local variable name in Quality profiles.
     * The key
     */
    @RuleProperty(
            defaultValue = DEFAULT_VALUE,
            description = "Avoid usage of the smaller length in local variable name")
    protected String name;

    public void scanFile(JavaFileScannerContext context) {
        this.context = context;
        scan(context.getTree());
    }


    @Override
    public void visitVariable(VariableTree tree) {
        String variableName = tree.simpleName().name();
        System.out.println("Scanning the variable : " + variableName);
        if(variableName.length() < 4) {
            context.reportIssue(this,tree, "Variable length is less than 4 characters");
        }
        super.visitVariable(tree);
    }
}

##打包plugin

mvn clean package sonar-packaging:sonar-plugin

拷贝到plugins

cp target/sonar-rule-demo-0.0.1-SNAPSHOT.jar ~/sonar/extensions/plugins

##run

docker run --rm  \
 -e JAVA_OPTS='-Xmx1g' \
  -v /Users/xixicat/sonar/data:/opt/sonarqube/data \
  -v /Users/xixicat/sonar/extensions:/opt/sonarqube/extensions \
  -p 9000:9000 -p 9092:9092 \
  -e SONARQUBE_JDBC_USERNAME=sonar \
  -e SONARQUBE_JDBC_PASSWORD=sonar \
  sonarqube:lts-alpine

##查看自定义的规则 输入图片说明

##doc

© 著作权归作者所有

go4it
粉丝 91
博文 1216
码字总数 1133425
作品 0
深圳
私信 提问
SonarQube安装使用以及自定义规则插件

下载安装 官网下载地址 https://www.sonarqube.org/downloads/ 本文章使用 sonar5.6版本,下载链接: https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.zip 修改配置文......

相见无望zxc
2018/08/29
0
0
细说Sonar之——前端接入篇

1、sonar是什么 sonar是一个代码质量管理的开源平台,用于管理源代码的质量,通过插件形式,可以支持包括java、C#、JavaScript等二十余种编程语言的代码质量管理与检测。 sonar是从七个维度检...

快狗打车前端团队
2019/06/13
0
0
Sonar 2.4 发布,支持 Maven 3

该版本支持自定义面板,直接从浏览器管理插件以及定义规则架构,同时增加对 Maven 3 的支持。 Sonar是一个开源平台,用于管理Java源代码的质量。从 Sonar 1.6 版本开始,Sonar从一个质量数据...

红薯
2010/12/16
1K
0
SonarQube代码质量管理平台的配置与使用 吴水成

一、SonarQube的配置(前提,先用admin用户登录) 1、 安装中文汉化包: Setting >> Update Center >> AvailablePlugins >> LOCALIZATION >> Chinese Pack >> Install 安装完汉化包之后需要重......

牛角尖
2016/04/11
21
0
持续集成篇-- SonarQube代码质量管理平台的配置与使用

样例视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 一、SonarQube的配置(前提,先用admin用户登录) 1、 安装中文汉化包: Setting >> Update Center >> ......

赵蕊
2017/06/16
221
0

没有更多内容

加载失败,请刷新页面

加载更多

iStatistica Pro for Mac(系统监控工具) v1.1.2

iStatistica Mac破解版推荐给大家!iStatistica Pro Mac是一款功能强大的系统监控工具,实时监控CPU,内存,网络,磁盘卡,帮你轻松删除不需要的文件和文件夹,释放电脑内存,提升运行速度。...

云不若
18分钟前
4
0
Vim和Ctags提示和技巧[关闭]

我刚刚使用我的Vim(或者更确切地说是gVim)安装了Ctags (以帮助进行C ++开发),并希望找到您最喜欢的命令,宏,快捷方式,以及随之而来的提示...... 分享你最好的武器库。 在Vim开发中你会...

技术盛宴
21分钟前
6
0
tensorlfow安装

系统环境 nv-jetson-nano-sd-card-image-r32.3.1.zip 1 基本工具安装 默认安装了python 3.6.8,需要安装如下基本软件 sudo apt updatesudo apt install curlcurl https://bootstrap.pyp...

JosiahMg
22分钟前
3
0
彻底修改maven项目工程的名称

1

观海562
40分钟前
5
0
整数反转(力扣)

整数反转 一、题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 ...

迪迪迪王
50分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部