文章目录

  • 如何保存配置
  • 如何显示后台数据
  • 如何在页面执行js
  • 如何提示错误,并中断build


如何保存配置

上一篇HelloWorld生成的项目中默认包含了一个Build的扩展,Jenkins任务的配置页可以看到如下图。

jenkins 开发插件 jenkins插件开发实例_jenkins


我们复制一下url,修改configure为``````config.xml

我们按提示输入名字"Victor刘",然后保存,再打开刚才复制修改的xml地址。如下图:

jenkins 开发插件 jenkins插件开发实例_ide_02


这些都是基本的,过往的文章都说了,我就不多说了,我说说原理:

这样的扩展包括一个jelly页面和后台类,后台类的变量对应一个页面输入值,如下:

<f:entry field="name">
        <f:textbox />
    </f:entry>
@DataBoundSetter
    public void setName(String name) {
        this.name = name;
    }

上面的一个标签,会转化为name="_name"的input表单,传给后台,后台类中的成员变量接收此值,然后在setter方法上使用DataBoundSetter注解,就可以保存到xml中。
tips:构造函数可以是空的,全用setter也可以。

如何显示后台数据

默认生成的后台类大致如下,内部类DescriptorImpl就负责传输数据,我们增加一个get方法getClusterList

public class HelloWorldBuilder extends Builder implements SimpleBuildStep {
    String name;
...略...
    @Symbol("greet")
    @Extension
    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {
        public String[] getClusterList() {
            return new String[]{"青岛","北京"};
        }
    }
}

比如我们显示一个下拉框,页面上这样取值:

<f:entry title="选个名字">
        <select name="_.name">
            <j:forEach var="item" items="${descriptor.clusterList}">
                <f:option>${item}</f:option>
            </j:forEach>
        </select>
    </f:entry>

当然select也可以换成他自己的标签f:select,但是jelly的文档不好查,我就没用。实际我觉得跟jsp、freemarker比较像,搜不到可以搜搜这些是怎么写的,基本差不多。

如何在页面执行js

就是html的写法,如下:

<script>console.log("hi")</script>

安装了jQuery3的插件后,还可以引入:

<st:adjunct includes="io.jenkins.plugins.jquery3"/>

有个比较坑的是,第一次添加的时候,也就是点“Add build step”的时候,dom和jq都是动态引入的,你在自己的jelly页面去获取元素是找不到的。
我后来找到一种办法,就是监听dom的改变:

<script>
        var targetNode = document.getElementById('page-body');
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function(mutationsList) {
            mutationsList.forEach(function(item,index){
                if (item.type == 'childList') {
                    console.log(document.getElementById("aa"));
                }
            });
        };
        var observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    </script>

这样在回调中就可以获取自己页面上的元素,但是比较麻烦。

如何提示错误,并中断build

我们在后台类的方法中,添加我们要做的处理,如下:

@Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
    ...
    }

上面是默认生成的,已经方法废弃了,现在用:

@Override
    public void perform(@NonNull Run<?, ?> run, @NonNull FilePath workspace, @NonNull EnvVars env, @NonNull Launcher launcher, @NonNull TaskListener listener) throws InterruptedException, IOException {
    ...
    }

其实就是参数不同,注意,可以使用Jenkins的环境变量,在env中,比如:

env.get("WORKSPACE")

如何中断呢:

listener.error(msg);
run.getExecutor().doStop();
return;