我正在为SonarQube开发一个插件,该插件将运行自定义的后期分析任务,但仅(如果已向sonar-scanner命令提供了命名的扫描器参数)。我可以做这样的事情吗?
public class MyPlugin implements Plugin {
@Override
public void define(Context context) {
context.addExtension(MyPostAnalysisTask.class);
}
}
public class MyPostAnalysisTask implements PostProjectAnalysisTask, Sensor {
private String param = "";
@Override
public void describe(SensorDescriptor descriptor) {
descriptor.name(getClass().getName());
}
@Override
public void execute(SensorContext context) {
// Get command line param.
Optional<String> param = context.config().get('my.param.name');
if (param.isPresent()) {
this.param = param.get();
}
}
@Override
public void finished(final ProjectAnalysis analysis) {
if (!this.param.isEmpty()) {
// Perform custom post analysis task.
}
}
}
我不了解我的插件对象的范围/生命周期。每个扫描或SonarQube服务器实例它们是唯一的吗?
答案 0 :(得分:2)
传感器是扫描仪侧的扩展点。它会在分析期间在您的构建代理上运行。 PostProjectAnalysisTask是服务器端扩展点,将在分析报告处理结束时实例化/调用。您无法像使用class属性那样共享状态,因为在运行时,两个类将在不同的JVM上实例化。
我认为最好在单独的类中实现两个扩展点,并使用扫描器上下文在扫描器端和服务器端之间传递值:
public class MyPlugin implements Plugin {
@Override
public void define(Context context) {
context.addExtensions(
MySensor.class,
MyPostAnalysisTask.class);
}
}
public class MySensor implements Sensor {
@Override
public void describe(SensorDescriptor descriptor) {
descriptor.name(getClass().getName());
}
@Override
public void execute(SensorContext context) {
// Get command line param.
Optional<String> param = context.config().get("my.param.name");
if (param.isPresent()) {
context.addContextProperty("my.context.key", param.get());
}
}
}
public class MyPostAnalysisTask implements PostProjectAnalysisTask {
@Override
public void finished(final ProjectAnalysis analysis) {
if (getScannerContext().getProperties().containsKey("my.context.key")) {
// Perform custom post analysis task.
}
}
}