我正在开发一个SonarQube插件,以便从.xml文件导入规则。到目前为止,这已经完成,它们确实被导入SonarQube实例并显示在" Rules"下。虽然正在创建质量配置文件,但所有导入的规则都没有添加到它中,我无法理解原因。
我不想一个一个地手工添加它们;我正在寻找一种方法,一旦从.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);
}
}
}
}
}
提前致谢。
答案 0 :(得分:1)
编辑注释:将规则实际添加到质量配置文件中的所述过程可视为解决方法,因为当时SonarQube引擎上存在一个未允许访问的未解决问题一次性所有规则,以便轻松添加到所需的质量配置文件(可以查看此问题here)。因此对于5.6版本,可以这样做:
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));
获取所有规则(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 类加载包含规则的.XML文件,方法为 load 强>喜欢这样:
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的知识较少或没有,就像我一样)或命令提示符(在这种情况下需要install Curl)。 邮递员:
将请求设置为“发布”并添加URL(假设SonarQube位于本地计算机并侦听默认端口):http://localhost:9000/api/qualityprofiles/restore
设置“授权”。默认为“admin”/“admin”;
在“正文”中,将一个参数设置为“key”=“backup”,将“value”设置为文件(选择向下箭头),然后选择创建的第二个文件(具有规则的文件)和个人资料的额外标签)。
发送请求,如果一切顺利,您应该能够在底部窗口中看到成功导入规则的数量!