SonarQube 插件 Post 仅在扫描仪参数设置时分析任务

SonarQube Plugin Post Analysis Task only when Scanner Parameter set

我正在为 SonarQube 开发一个插件,它将 运行 自定义 post 分析任务,但只有 如果将命名的扫描器参数提供给声纳扫描仪命令。我可以做这样的事情吗?

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.
        }
    }
}

我不熟悉我的插件对象的 scope/lifecycle。它们在每次扫描或每个 SonarQube 服务器实例中是唯一的吗?

传感器是扫描仪端的扩展点。它将 运行 在分析您的构建代理期间。 PostProjectAnalysisTask 是服务器端扩展点,将在分析报告处理结束时 instantiated/called。您不能像使用 class 属性那样共享状态,因为在 运行 时两个 classes 将在不同的 JVM 上实例化。

我认为最好在单独的 classes 中实现两个扩展点,并使用扫描器上下文在扫描器端和服务器端之间传递值:

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 (analysis.getScannerContext().getProperties().containsKey("my.context.key")) {
            // Perform custom post analysis task.
        }
    }
}