• Jenkins插件开发——插件的拓展


    Jenkins插件开发——插件的拓展

    前言

    对于每一次的构建,我们可能希望Jenkins有除了控制台日志以外的其他地方承载构建的结果,这个时候可以对插件进行拓展,本文就用一个简单的样例演示如何拓展自己开发的Jenkins插件。

    创建HelloWorldAction

    本次是基于之前博客中整理的插件工程进行的开发,项目具体的代码目录如下:
    在这里插入图片描述
    首先在MyBuilder构建主类的相同包路径com/yzh下创建HelloWorldAction,该类需要继承hudson.model.Action接口,Action接口中提供了如下几个方法:

    public interface Action extends ModelObject {
        @CheckForNull String getIconFileName();
      
        @Override
        @CheckForNull String getDisplayName();
    
        @CheckForNull String getUrlName();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. getIconFileName 方法表示构建完成后,侧面板的图标。jenkins中有很多内置图标,这边可以直接获取到并使用。
    2. getDisplayName 方法表示侧面板的标签。
    3. getUrlName 方法表示构建完成之后,可以通过该url来进行访问。

    我在HelloWorldAction中,提供了一个成员变量name,并提供了getter以及构造函数:

    public class HelloWorldAction implements Action {
        @Getter
        private final String name;
    
        public HelloWorldAction(String name) {
            this.name = name;
        }
    
        @Override
        public String getIconFileName() {
            return "document.png";
        }
    
        @Override
        public String getDisplayName() {
            return "HelloWorld";
        }
    
        @Override
        public String getUrlName() {
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    通过上面的实现的配置,最终效果就是在侧面板中,会有一个HelloWorld的标签,并且链接到URL http://{jenkins}:{port}/{jobName}/{buildNumber}/hello
    在这里插入图片描述
    之后在MyBuilder构建主类的perform方法中,在构建的任意位置,可以调用hudson.model.AbstractBuild#addAction方法,添加我们创建的action实例:

    @Override
    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
        PrintStream logger = listener.getLogger();
        logger.println("Hello " + name);
        // 添加自定义action
        build.addAction(new HelloWorldAction(name));
    
        boolean printLog = getDescriptor().isPrintLog();
        if (printLog) {
            logger.println("Log is " + getDescriptor().getLog());
        }
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    添加显示视图

    在src/main/resources/com/yzh/目录下,创建一个和HelloWorldAction同名的目录,该目录中就包含了与HelloWorldAction类对应的资源文件。这边和构建的主类Builder类似。
    在这里插入图片描述
    在src/main/resources/com/yzh/HelloWorldAction/目录下,我们创建一个index.jelly文件,这个文件就是构建结束可以通过URL http://{jenkins}:{port}/{jobName}/{buildNumber}/hello 访问到的文件。

    index.jelly文件如下(关于jelly文件的用法可以参考:Apache Commons Jelly):

    
    <j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:st="jelly:stapler">
        <l:layout title="HelloWorld">
            <l:main-panel>
                <h1>
                    Name: ${it.name}
                h1>
            l:main-panel>
        l:layout>
    j:jelly>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中,${it.name}是一个 JEXL 表达式。 it 引用视图所属的Java对象 (类似于Java中的 this),在本例中为 HelloWorldAction实例。 it.name 等同于调用 getName()。

    之后通过 mvn hpi:run 构建插件,最终页面效果像下面这样:
    在这里插入图片描述

    将构建的侧面板添加到视图

    上面的方法调用中,侧面板的视图是空的。对于这种情况,可以将继承的Action接口替换为RunAction2,这个接口新增了两个方法,可以按照如下代码来实现该方法(具体为啥就没细究了,只知道这么写~~~)

    /**
     * 拓展插件2 支持侧面板视图回显
     *
     * @author yuanzhihao
     * @since 2022/7/19
     */
    public class HelloWorldAction2 implements RunAction2 {
        @Getter
        private final String name;
    
        public HelloWorldAction2(String name) {
            this.name = name;
        }
    
        private transient Run run;
    
        @Override
        public void onAttached(Run<?, ?> run) {
            this.run = run;
        }
    
        @Override
        public void onLoad(Run<?, ?> run) {
            this.run = run;
        }
    
        public Run getRun() {
            return run;
        }
    
        @Override
        public String getIconFileName() {
            return "document.png";
        }
    
        @Override
        public String getDisplayName() {
            return "HelloWorld2";
        }
    
        @Override
        public String getUrlName() {
            return "hello2";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    构建中添加HelloWorldAction2实例:

    build.addAction(new HelloWorldAction2(name));
    
    • 1

    src/main/resources/com/yzh/HelloWorldAction2/index.jelly配置如下:

    
    <j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:st="jelly:stapler">
        <l:layout title="HelloWorld2">
            
            <l:side-panel>
                <st:include page="sidepanel.jelly" it="${it.run}" optional="true" />
            l:side-panel>
            <l:main-panel>
                <h1>
                    Name: ${it.name}
                h1>
            l:main-panel>
        l:layout>
    j:jelly>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    通过 mvn hpi:run 构建插件,最终页面效果,可以看到和Jenkins UI 正确的集成:
    在这里插入图片描述

    结语

    本次关于jenkins插件的拓展就整理到这边,这种拓展对于基于jenkins做二次开发还有很有帮助的。

    参考:https://www.jenkins.io/zh/doc/developer/tutorial/extend/

    代码地址:https://github.com/yzh19961031/blogDemo/tree/master/jenkinsPlugin

  • 相关阅读:
    面试突击55:delete、drop、truncate有什么区别?
    Git 的安装和配置
    南大通用数据库-Gbase-8a-学习-20-GBaseGMonitor
    一种基于分子结构的密码算法的设计方案
    <一>Qt斗地主游戏开发:开发环境搭建--VS2019+Qt5.15.2
    TCP IP网络编程(六) 基于UDP的服务器端、客户端
    python基于PHP+MySQL高校资产管理系统
    云原生之使用Docker部署Laverna笔记工具
    代码随想录 Day48 动态规划16 T647 回文子串 T516最长回文子序列
    插入排序 算法
  • 原文地址:https://blog.csdn.net/qq_32238611/article/details/125883451