云计算百科
云计算领域专业知识百科平台

二:从零上手 Jenkins 插件开发:做一个可复用 Pipeline 自定义步骤插件

最近看了 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的构建结果最直接了
在这里插入图片描述
在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 二:从零上手 Jenkins 插件开发:做一个可复用 Pipeline 自定义步骤插件
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!