Jenkins 是一个广泛使用的持续集成和持续交付平台,可帮助开发人员自动化构建、测试和部署软件。Jenkins 的强大之处在于其插件系统,它允许开发人员扩展其功能以满足特定需求。本文将引导读者进入 Jenkins 插件开发的世界。您将了解如何创建自定义插件,并探索一些常见插件开发场景和最佳实践
一、前期准备
Jenkins基于Java开发并使用 Maven 进行构建和管理依赖项,开发Jenkins插件前需要安装JDK和Maven。
二、创建插件项目
新建Jenkins插件项目的目录并打开命令行,执行如下命令:
mvn -U archetype:generate -Dfilter=io.jenkins.archetypes:
执行命令将生成与 Jenkins 有关的几个项目原型,选择 hello-world 原型,版本 1.20。执行完成后会在新建的Jenkins插件项目目录下上创建一个demo-plugin目录。
说明:如果执行命令后无法找打Jenkins相关插件,原因是没有找到archetype-catalog.xml文件,将archetype-catalog.xml下载到本地maven仓库目录,重新执行。
三、运行插件
插件开发完成后可以构建和打包安装到Jenkins上运行,也可以本地运行插件,方便用户调试。进入生成的插件目录,执行如下命令即可运行该插件。
mvn hpi:run
插件运行成功后,将在本地8080端口启动Jenkins实例,浏览器打开该链接,在 Jenkins 创建一个自由风格的项目,并给它任意起一个名称,然后添加构建步骤,如下所示:
输入名称,保存项目并开始新的构建。找到页面上的构建,然后单击查看构建日志,可看到刚刚配置的构建步骤输出的内容:
四、扩展插件
上面使用的插件仅仅是个示例插件,如果用户需要按需使用插件,需要在该插件的基础上按需扩展。下面在示例插件的基础上开发一个API接口插件,能实现一种方法远程在资源池内执行ssh命令的接口,因此需要定义开发一个API接口。具体步骤如下:
1. 继承Plugin类,并重写其getApi方法,方法中返回一个自定义的Api实例
public class JenkinsApiPlugin extends Plugin {
public Api getApi() {
return new JenkinsApi(this);
}
}
2. 自定义一个Api类,创建一个方法,并为这个方法添加注解
public class EadpJenkinsApi extends Api {
@WebMethod(name = "ssh")
@RequirePOST
public HttpResponse ssh(@QueryParameter(value = "label", fixEmpty = true) String label,
@QueryParameter(fixEmpty = true) String host,
@QueryParameter(fixEmpty = true) String username,
@QueryParameter(fixEmpty = true) String password,
@QueryParameter(fixEmpty = true) Integer port,
@QueryParameter(fixEmpty = true) String command,
@QueryParameter(fixEmpty = true) Long timeout) {
String check = checkParameters(label, host, username, command);
if (check != null) {
return HttpResponses.errorWithoutStack(400, check);
}
if (port == null) {
port = 22;
}
if (null == timeout || timeout == 0) {
timeout = 3L;
}
Node node = RemoteUtils.getNodeByLabel(label);
if (node == null) {
String msg = "Can't find node by label [" + label + "]";
LOGGER.warning(msg);
return HttpResponses.errorJSON(msg);
}
VirtualChannel channel = node.getChannel();
if (channel == null) {
String msg = "Can't open channel for node [" + label + "]";
LOGGER.warning(msg);
return HttpResponses.errorJSON(msg);
}
try {
Map<String, Object> result = channel.call(new SshCommand(host, port, username, password, command, timeout));
return HttpResponses.okJSON(result);
} catch (Exception e) {
return HttpResponses.errorJSON(e.getMessage());
}
}
}
到此为止,一个接口就开发完成了。插件开发完成后需要编译并手动上传到Jenkins上安装。编译命令如下:
mvn clean install
编译完成后会生成一个hpi文件,手动上传到jenkins安装即可。安装如下图所示:
五、总结
从上面的插件的开发过程可以发现,Jenkins插件开发并不复杂,其中的关键点在于找到相关的API作为切入点,开发过程中可以根据实际需求在任何扩展点进行扩展。