对于自定义监视工具,我需要一个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);
}
但是我没有找到正确的注册来注册我的插件动作。
有关现有插件的提示或指示,我可以查看如何注册吗?
答案 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 {