Jenkins API以块的形式检索构建日志

时间:2017-12-31 09:22:18

标签: jenkins plugins

对于自定义监视工具,我需要一个API(REST)来以块的形式获取Jenkins构建的控制台日志。

我知道/ consoleText和/ logText / progressive {Text | HTML} API,但问题是有时候,我们的构建日志变得非常庞大(最多几GB)。我没有找到任何方法使用那些现有的API来避免整个日志的获取和传输。这通常会使詹金斯大师失去记忆。

我已经有了Java代码来高效地从文件中获取块,我有一个基本的Jenkins插件可以正确加载。

我缺少的是正确的扩展点,以便我可以通过REST调用我的插件,例如

http://.../jenkins/job/<jobname>/<buildnr>/myPlugin/logChunk?start=1000&size=1000

或者,如果这更容易

http://.../jenkins/myPlugin/logChunk?start=1000&size=1000&job=<jobName>&build=<buildNr>

我尝试用类似的东西注册我的插件(下面的代码不起作用!!)

@Extension
public class JobLogReaderAPI extends TransientActionFactory<T> implements Action {

    public void doLogChunk(StaplerRequest req, StaplerResponse rsp) throws IOException {
        LOGGER.log(Level.INFO, "## doLogFragment req: {}", req);
        LOGGER.log(Level.INFO, "## doLogFragment rsp: {}", rsp);
    }

但是我没有找到正确的注册来注册我的插件动作。

有关现有插件的提示或指示,我可以查看如何注册吗?

1 个答案:

答案 0 :(得分:0)

这确实比我预期的更简单:-)它一如既往:一旦理解了插件系统,它只需要几行代码。

原来我需要做的就是写2个非常简单的类

Jenkins调用的“动作工厂”并在相关对象上注册一个动作(在我的例子中是“build”或“run”

public class ActionFactory extends TransientBuildActionFactory {

    public Collection<? extends Action> createFor(Run target) {
        ArrayList<Action> actions = new ArrayList<Action>();
        if (target.getLogFile().exists()) {
            LogChunkReader newAction = new LogChunkReader(target);
            actions.add(newAction);
        }
        return actions;
    }

实现逻辑的类

public class LogChunkReader implements Action {
    private Run build;

    public LogChunkReader(Run build) {
        this.build = build;
    }

    public String getIconFileName() {
        return null;
    }

    public String getDisplayName() {
        return null;
    }

    public String getUrlName() {
        return "logChunk";
    }

    public Run getBuild() {
        return build;
    }

    public void doReadChunk(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {