我正在开发 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 的引擎存在一个未解决的问题,不允许立即访问所有规则以便轻松添加到所需的质量简介(此问题可以查看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 APIdocs.sonarqube.org/display/DEV/Web+Service+API。我用于向 API 发送请求/从 API 接收请求的客户端是Postman。可用的命令也记录在nemo.sonarqube.org.
经过一番失败后我发现这个过程似乎有一些使用限制。为了让这个工作我必须:
-
首先,在我在问题中给出的插件代码中,我必须使用类加载包含规则的 .XML 文件规则定义XmlLoader用方法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>
这里主要关心的是存储库密钥因为其余列出的字段是强制性的。您必须确保此处使用的密钥是same用于添加质量配置文件(我将在接下来展示)。该键在类中定义扩展规则定义(我在问题中提供了最重要的代码)创建存储库时.
If it helps, you can also use a request to the Web API in order to list all the repositories, so you can make sure the key used is the right one:
-
创建一个与前一个文件类似的 .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 的了解较少或根本不了解,就像我一样)或命令提示符(在这种情况下需要安装卷曲)。
在邮递员中:
将请求设置为“Post”并添加 URL(假设 SonarQube 在本地计算机中并侦听默认端口):http://localhost:9000/api/qualityprofiles/restore
设置“授权”。默认为“管理员”/“管理员”;
在“Body”处,设置一个参数“key”=“backup”,将“value”设置为文件(选择向下箭头),然后选择创建的第二个文件(带有配置文件规则和额外标签的文件).
发送请求,如果一切顺利,您应该能够在底部窗口中看到成功导入的规则的数量!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)