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();
}
- getIconFileName 方法表示构建完成后,侧面板的图标。jenkins中有很多内置图标,这边可以直接获取到并使用。
- getDisplayName 方法表示侧面板的标签。
- 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";
}
}
通过上面的实现的配置,最终效果就是在侧面板中,会有一个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;
}
添加显示视图
在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):
<?jelly escape-by-default='true'?>
<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>
其中,${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";
}
}
构建中添加HelloWorldAction2实例:
build.addAction(new HelloWorldAction2(name));
src/main/resources/com/yzh/HelloWorldAction2/index.jelly配置如下:
<?jelly escape-by-default='true'?>
<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>
通过 mvn hpi:run 构建插件,最终页面效果,可以看到和Jenkins UI 正确的集成:
结语
本次关于jenkins插件的拓展就整理到这边,这种拓展对于基于jenkins做二次开发还有很有帮助的。
参考:https://www.jenkins.io/zh/doc/developer/tutorial/extend/
代码地址:https://github.com/yzh19961031/blogDemo/tree/master/jenkinsPlugin