Я разрабатываю пользовательский плагин для сборки Jenkins, в котором некоторые части кода должны работать на ведомом устройстве.Я могу войти из этого кода в мастер Jenkins, однако все данные для регистрации эффективно регистрируются в одном чанке только после завершения выполнения кода в ведомом устройстве.На самом деле я хотел бы, чтобы данные регистрировались сразу после каждой подпрограммы.
Вот мой код для запуска вещей под ведомым устройством на основе механизма Jenkins VirtualChannel / Callable (упрощено):
public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
ServerNode serverNode = new ServerNode(workspace,listener)
Result result = Result.SUCCESS,
VirtualChannel channel = launcher.getChannel();
try {
result = channel.call(serverNode);
}catch(Exception e)
{
}
run.setResult(result);
}
public class ServerNode implements Callable<Result,Exception>{
private final FilePath workspace;
private final TaskListener taskListener;
public ServerNode(FilePath workspace, TaskListener taskListener) throws IOException, InterruptedException {
this.workspace = workspace;
this.taskListener = taskListener;
}
@Override
public Result call() throws Exception
{
//Code executed in the slave
taskListener.getLogger().print("run some code on slave!");
taskListener.getLogger().print("run some more code on slave!");
// Do a lot more, time-consuming stuff....
//We are finally done
return Result.SUCCESS;
}
}
Таким образом, в этом примере мастер записывает:
run some code on slave!
run some more code on slave!
И проблема в том, что он делает это только в одном фрагменте после того, как call()
сделано.