文章目录
- 如何保存配置
- 如何显示后台数据
- 如何在页面执行js
- 如何提示错误,并中断build
如何保存配置
上一篇HelloWorld生成的项目中默认包含了一个Build的扩展,Jenkins任务的配置页可以看到如下图。
我们复制一下url,修改configure为``````config.xml
。
我们按提示输入名字"Victor刘",然后保存,再打开刚才复制修改的xml地址。如下图:
这些都是基本的,过往的文章都说了,我就不多说了,我说说原理:
这样的扩展包括一个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;