繁体   English   中英

SonarQube 如何创建配置文件并向其导入新规则

[英]SonarQube how to create Profile and import new rules to it

我正在为 SonarQube 开发一个插件,以便从 .xml 文件中导入规则。 到目前为止,这已经完成,它们确实被导入到 SonarQube 实例中并显示在“规则”下。 尽管正在创建质量配置文件,但并未将所有导入的规则添加到其中,我不明白为什么。

不想一一添加; 我正在寻找一种方法,将它们从 .xml 文件导入后直接添加到创建的配置文件中。 配置文件只是通过以下方式创建的:

public class MyProfile extends ProfileDefinition {
    @Override
    public RulesProfile createProfile(ValidationMessages validation) {
        return RulesProfile.create("QP", "Java");
    }
}

这是我怀疑会发生这种情况的一些方法代码:

public class MyRules extends RulesDefinition {

public void define(Context context) {
    List<RulePack> rulePacks = this.rulePackParser.parse();
    parseXml(context);                                                      
    parseRulePacks(context, rulePacks);
    for (NewRepository newRepository : newRepositories.values()) {
        newRepository.done();
    }
}

private void parseXml(Context context) {
    for (Language supportedLanguage : languages.all()) {
        InputStream rulesXml = this.getClass().getResourceAsStream("/rules-TESTE.xml");
        if (rulesXml != null) {
            NewRepository repository = getRepository(context, supportedLanguage.getKey());
            xmlLoader.load(repository, new BufferedReader(new InputStreamReader(rulesXml)));
            repository.done();
        }
    }
}

private void parseRulePacks(Context context, List<RulePack> rulePacks) {
    for (RulePack rulePack : rulePacks) {
        for (AppScanRule rule : rulePack.getRules()) {
            String sqLanguageKey = convertToSQ(rulePack.getRuleLanguage(rule));
            if (this.languages.get(sqLanguageKey) != null && isAnInterestingRule(rule)) {
                processRule(context, rulePack, rule, sqLanguageKey);
            }
        }
    }
}
}

提前致谢。

编辑说明:实际将规则添加到质量配置文件的描述过程可以被视为一种解决方法,因为当时 SonarQube 的引擎存在一个未解决的问题,不允许一次访问所有规则以便轻松添加到所需的质量配置文件(可以在此处查看此问题)。 所以对于 5.6 的版本,它可以像这样完成:

  • 自己实现了一个扩展ProfileDefinition的类;
  • 覆盖方法public RulesProfile createProfile(ValidationMessages messages)并创建配置文件对象RulesProfile profile = RulesProfile.create();
  • 在该方法中,通过Collection<Rule> rules = ruleFinder.findAll(RuleQuery.create().withRepositoryKey(key-of-the-repository-with-the-desired-rules));获取所有规则Collection<Rule> rules = ruleFinder.findAll(RuleQuery.create().withRepositoryKey(key-of-the-repository-with-the-desired-rules)); (findAll 是被破坏的方法)
  • 使用以下命令激活配置文件上的规则:

    for(Rule rule : rules) { profile.activateRule(rule, null); }

  • 最后,可以设置一些定义,例如配置文件的语言或其名称。 之后返回新创建的配置文件对象:

    profile.setLanguage("Java"); profile.setName("My Profile"); return profile;


所以我能够解决这个问题,但采用了一种非常不同的方法。 为了用我的新规则添加质量配置文件,我使用了 SonarQube 的 REST Web API docs.sonarqube.org/display/DEV/Web+Service+API 我用于向/从 API 发送/接收请求的客户端是Postman nemo.sonarqube.org中也记录了可用的命令。

经过一些失败,我发现这个过程似乎有一些使用限制。 为了让这个工作,我必须:

  • 首先,在我在问题中给出的插件代码中,我必须使用类RulesDefinitionXmlLoader和方法load 加载包含规则的 .XML 文件,如下所示:

     xmlLoader.load(repository, new BufferedReader(newInputStreamReader(rulesXml)));
  • 这个过程我真的很甜蜜,你可以很容易地加载你的规则。 您所要做的就是确保包含规则的 .XML 文件遵循以下标准模板:

     <rules> <rule> <repositoryKey>java-key</repositoryKey> <key>1</key> <internalKey> da-rule-name-1</internalKey> <name> da-rule-name </name> <description>da-description </description> </rule> </rules>

这里主要关注的是repositoryKey,因为其余列出的字段是强制性的。 您必须确保此处使用的密钥用于添加质量配置文件的密钥相同(我接下来将展示)。 这个键是在创建存储库时扩展 RulesDefinition (我在问题中提供的最重要的代码)的类中定义的。

如果有帮助,您还可以使用对 Web API 的请求来列出所有存储库,这样您就可以确保使用的密钥是正确的: 在此处输入图片说明

  • 创建一个与上一个类似的 .XML 文件,但包含以下信息。 这是 REST Web API 将用于创建质量配置文件的文件:

     <profile> <name>da-profile-name</name> <language>java</language> <rules> <rule> <repositoryKey>java-key</repositoryKey> <key>1</key> <internalKey> da-rule-name-1</internalKey> <name> da-rule-name </name> <description>da-description </description> </rule> </rules> </profile>
  • 最后,您所要做的就是使用创建的第二个文件将请求发送到 Web API。 为此,您可以像我说的那样使用 Postman(如果您对使用 REST API 的知识较少或没有知识,就像我一样)或命令提示符(在这种情况下需要安装 Curl )。 在邮递员中:

    1. 将请求设置为“发布”并添加 URL(假设 SonarQube 在本地机器中并侦听默认端口): http://localhost:9000/api/qualityprofiles/restore

    2. 设置“授权”。 默认为"admin"/"admin" ;

    3. 在“正文”中,将一个参数设置为“key”=“backup”,将“value”设置为一个文件(选择向下箭头),然后选择创建的第二个文件(带有规则和额外标签的文件)

请求配置

发送请求,如果一切顺利,您应该能够在底部窗口中看到成功导入规则的数量!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM