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

问题描述 投票:1回答:1

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

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

我已经有了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);
    }

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

现有插件的任何提示或指针,我可以检查如何注册?

jenkins plugins
1个回答
0
投票

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

事实证明,我需要做的就是编写2个非常简单的类

由Jenkins调用并在相关对象上注册操作的“动作工厂”(在我的例子中是“构建”或“运行”)

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 {
© www.soinside.com 2019 - 2024. All rights reserved.