searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Jenkins插件开发介绍

2023-11-15 08:56:37
26
0

      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作为切入点,开发过程中可以根据实际需求在任何扩展点进行扩展。

0条评论
0 / 1000
方****新
1文章数
0粉丝数
方****新
1 文章 | 0 粉丝