如何导出sonarqube的规则_SonarQube 自定义规则开发

本文详细介绍了在SonarQube中开发自定义Java规则的步骤,包括环境配置、规则模板下载、编译、添加自定义检查规则、验证规则等过程,通过实例展示了如何创建并应用自定义规则来提升代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SonarQube 自定义规则开发

满足一些特定需求的时候,需要自己开发代码规则。

环境

和前文的演示环境一致。

步骤

开发步骤见 Writing Custom Java Rules 101,这是官方提供的 sonar-java 下面的指导文档,简述了怎么开发一个 Java 自定义规则。

文章的开始,给了一个模板地址 java-custom-rules,可以看到这个项目下还有别的语言模板。

把模板下载到本地,开发在 Windows 下面完成

F:\workspace\java-custom-rules

编译

mvn clean package

把生成的文件放在 $SONAR_HOME/extensions/plugins 目录,重启 SonarQube,可以看到 Java 下面多了 MyCompany Custom Repository 仓库,下面有新增的规则。

注意:想要看到这个效果必须已经安装 SonarJava 插件。

我们已经看到了自定义规则,接下来添加一个自定义检查规则,按照文档一步一步走,最终我们添加/修改了以下代码

创建 F:\workspace\java-custom-rules\src\test\files\MyFirstCustomCheck.java 文件,用于单元测试,这将是被扫描的代码

class MyClass {

MyClass(MyClass mc) { }

int foo1() { return 0; }

void foo2(int value) { }

int foo3(int value) { return 0; } // Noncompliant

Object foo4(int value) { return null; }

MyClass foo5(MyClass value) {return null; } // Noncompliant

int foo6(int value, String name) { return 0; }

int foo7(int ... values) { return 0;}

}

创建单元测试代码 F:\workspace\java-custom-rules\src\test\java\org\sonar\samples\java\checks\MyFirstCustomCheckTest.java

package org.sonar.samples.java.checks;

import org.junit.Test;

import org.sonar.java.checks.verifier.JavaCheckVerifier;

public class MyFirstCustomCheckTest {

@Test

public void test() {

JavaCheckVerifier.verify("src/test/files/MyFirstCustomCheck.java", new MyFirstCustomCheck());

}

}

创建检查规则 F:\workspace\java-custom-rules\src\main\java\org\sonar\samples\java\checks\MyFirstCustomCheck.java

package org.sonar.samples.java.checks;

import com.google.common.collect.ImmutableList;

import org.sonar.check.Priority;

import org.sonar.check.Rule;

import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;

import org.sonar.plugins.java.api.semantic.Symbol.MethodSymbol;

import org.sonar.plugins.java.api.semantic.Type;

import org.sonar.plugins.java.api.tree.MethodTree;

import org.sonar.plugins.java.api.tree.Tree;

import org.sonar.plugins.java.api.tree.Tree.Kind;

import java.util.List;

@Rule(

key = "MyFirstCustomCheck",

name = "Return type and parameter of a method should not be the same",

description = "For a method having a single parameter, the types of its return value and its parameter should never be the same.",

priority = Priority.CRITICAL,

tags = {"bug"})

public class MyFirstCustomCheck extends IssuableSubscriptionVisitor {

@Override

public void visitNode(Tree tree) {

if (method.parameters().size() == 1) {

MethodSymbol symbol = method.symbol();

Type firstParameterType = symbol.parameterTypes().get(0);

Type returnType = symbol.returnType().type();

if (returnType.is(firstParameterType.fullyQualifiedName())) {

reportIssue(method.simpleName(), "Never do that! 01!");

}

}

}

@Override

public List nodesToVisit() {

return ImmutableList.of(Kind.METHOD);

}

}

将我们自定义的规则添加到规则列表中,修改 ‪F:\workspace\java-custom-rules\src\main\java\org\sonar\samples\java\RulesList.java 文件

public static List> getJavaChecks() {

return Collections.unmodifiableList(Arrays.asList(

SpringControllerRequestMappingEntityRule.class,

AvoidAnnotationRule.class,

AvoidBrandInMethodNamesRule.class,

AvoidMethodDeclarationRule.class,

AvoidSuperClassRule.class,

AvoidTreeListRule.class,

MyCustomSubscriptionRule.class,

SecurityAnnotationMandatoryRule.class,

MyFirstCustomCheck.class)); # 添加我们的规则

}

再次编译

mvn clean package

把生成的文件放在 $SONAR_HOME/extensions/plugins 目录,重启 SonarQube,可以看到我们添加的规则,自定义规则开发完毕

验证自定义规则

创建新的规则配置,只将我们添加自定义规则设置为检查项,步骤截图

创建项目验证自定义规则,和之前的扫描测试一样,在 Linux 服务器上执行

mkdir -p /usr/local/sonarqube/workspace/custom && cd /usr/local/sonarqube/workspace/custom

项目代码只有一个 MyFirstCustomCheck.java,就是前边用于单元测试的代码

class MyClass {

MyClass(MyClass mc) { }

int foo1() { return 0; }

void foo2(int value) { }

int foo3(int value) { return 0; } // Noncompliant

Object foo4(int value) { return null; }

MyClass foo5(MyClass value) {return null; } // Noncompliant

int foo6(int value, String name) { return 0; }

int foo7(int ... values) { return 0;}

}

创建扫描配置文件 sonar-project.properties

sonar.projectKey=custom

sonar.sources=.

sonar.host.url=http://192.168.10.227:9000

sonar.login=c4765957e5ada82ebe21a7c2e1f56afbff4059d3

sonar.language=java

sonar.java.binaries=.

sonar.sourceEncoding=UTF-8

执行扫描

sonar-scanner

自定义规则生效了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值