【问题标题】:SonarQube how to create Profile and import new rules to itSonarQube 如何创建配置文件并向其导入新规则
【发布时间】:2016-07-03 15:22:46
【问题描述】:

我正在为 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);
            }
        }
    }
}
}

提前致谢。

【问题讨论】:

    标签: plugins sonarqube user-profile sonarqube-web


    【解决方案1】:

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

    • 自己实现了一个扩展ProfileDefinition的类;
    • 重写方法public RulesProfile createProfile(ValidationMessages messages)并创建配置文件对象RulesProfile profile = RulesProfile.create();
    • 在那个方法上,通过Collection&lt;Rule&gt; 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,因为其余列出的字段是强制性的。您必须确保此处使用的密钥与用于添加质量配置文件的 相同 相同(我将在接下来展示)。这个键在类extending 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 的知识很少或根本不了解)或命令提示符(在这种情况下需要 install Curl)。 在邮递员中:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 2016-06-30
      • 2016-05-19
      • 1970-01-01
      • 2011-08-02
      • 2021-08-19
      • 1970-01-01
      • 2015-12-26
      相关资源
      最近更新 更多