最近看了 ai-agent-plugin 的源码,想自己实现一个可复用的 Pipeline 自定义步骤插件。
自定义步骤的入口是下面这个 perform 方法。本篇承接上一篇,说明 TaskListener 和 Launcher 的用法,以及 Action 的作用。
@Override
public void perform(Run<?, ?> run, FilePath workspace, EnvVars env, Launcher launcher, TaskListener listener)
throws InterruptedException, IOException {
// 在这里实现步骤逻辑
}
TaskListener 的用法
listener 主要用于打印日志:先通过 getLogger() 拿到日志对象,再把想要输出的内容写入构建控制台。
如下面两张图所示,代码中只有用 listener.getLogger().println() 打印的内容才会出现在控制台,作用类似 Pipeline 里的 echo:
listener.getLogger().println("start say Action");

Launcher 的用法
launcher 用于在 node 端启动进程、执行任务。它是节点感知的:会自动把工作目录、环境变量等设置到正确的构建节点上。
如果不使用 Launcher,而是直接调用 ProcessBuilder 或 Runtime.exec(),进程只会在当前 JVM 所在的机器上运行,且环境变量、工作目录都不受 Jenkins 管控,容易出现 sh 找不到、目录不存在等问题。
如下代码的执行结果如下图
// 方式一:Launcher 启动进程执行命令(等价于 shell: echo 'hello-from-command')
int launchExitCode = launcher.launch()
.cmds("pwd")
.envs(env)
.stdout(listener.getLogger())
.stderr(listener.getLogger())
.pwd(workspace)
.join();
listener.getLogger().println("[launcher] exitCode=" + launchExitCode);
listener.getLogger().println("[demo-plugin] " + message);
// 方式二:直接执行命令(ProcessBuilder,不经过 Launcher),用于对比
Process process = new ProcessBuilder("/bin/sh", "-c", "pwd")
.directory(new File(workspace.getRemote()))
.start();
int directExitCode = process.waitFor();
String directOut = new String(process.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
String directErr = new String(process.getErrorStream().readAllBytes(), StandardCharsets.UTF_8);
listener.getLogger().println("[direct] exitCode=" + directExitCode);
listener.getLogger().println(directOut);

Action 的作用域
Action 的作用域是整个 Pipeline:同一次 Pipeline 里多次调用自定义步骤时,可以共享同一个 Action 对象,让执行结果里显示「一个对象的多次执行记录」,而不是「多个对象各自的记录」。
public static SayAction getOrCreate(Run<?, ?> run) {
SayAction existing = run.getAction(SayAction.class);
if (existing != null) {
System.out.println("Existing action found: " + existing);
return existing;
}
System.out.println("Creating new action for run: " + run);
SayAction created = new SayAction();
run.addAction(created);
created.onAttached(run);
return created;
}
如下图对比两次build的构建结果最直接了


网硕互联帮助中心


评论前必须登录!
注册