在jenkins插件开发的过程中,每一次build构建插件的时候,可能某些参数一直是固定的,对于这些固定的配置,可以通过jenkins插件中提供的全局参数功能来进行配置。本次就简单梳理下jenkins插件开发时如何进行全局参数的配置。
插件工程maven依赖配置jenkins提供了一个父pom文件,它帮我们集成了开发jenkins插件所有需要的组件,同时我们需要在properties中指定jenkins的版本以及java的版本,具体的pom文件如下:
测试插件流程4.0.0 org.jenkins-ci.plugins plugin 4.4 org.example jenkinsPlugin 1.0-SNAPSHOT hpi repo.jenkins-ci.org https://repo.jenkins-ci.org/public/ repo.jenkins-ci.org https://repo.jenkins-ci.org/public/ UTF-8 1.8 1.8 2.303.1 8
本次提供的demo案例中,可以通过全局配置的一个开关设置是否打印对应的日志。
代码首先,新增构建的主类,通过@DataBoundConstructor注解绑定页面参数:
public class MyBuilder extends Builder {
private final String name;
@DataBoundConstructor
public MyBuilder(String name) {
this.name = name;
}
}
之后新增一个内部类DescriptorImpl继承BuildStepDescriptor,注意这个类的访问级别需要是public的,同时设置@Extension注解(详细可参考jenkins源码):
@Extension public static class DescriptorImpl extends BuildStepDescriptor{}
在DescriptorImpl中,我们需要重写isApplicable和getDisplayName两个方法,分别表示插件是否可见以及插件默认显示名称:
@Override
public boolean isApplicable(Class extends AbstractProject> jobType) {
return true;
}
// 插件任务在jenkins上面的显示名称
@NonNull
@Override
public String getDisplayName() {
return PLUGIN_NAME;
}
还需要重写DescriptorImpl中的config方法,该方法提供了一个JSONObject类型的参数,可以通过该参数获得页面传过来的全局参数,同时需要调用save方法,该方法是将当前的全局配置持久化到磁盘,jenkins默认保存的是xml格式:
@Extension public static class DescriptorImpl extends BuildStepDescriptor{ @Getter @Setter private boolean printLog; @Getter @Setter private String log; @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { // 获取页面参数 printLog = json.getBoolean("printLog"); log = json.getString("log"); // 将配置写入磁盘 save(); return super.configure(req, json); } }
这边的两个成员变量printLog,log和全局参数进行的绑定,具体可以看下下面的global.jelly参数文件。
完整构建主类代码如下:
public class MyBuilder extends Builder {
private final String name;
@DataBoundConstructor
public MyBuilder(String name) {
this.name = name;
}
@Override
public boolean perform(AbstractBuild, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
PrintStream logger = listener.getLogger();
logger.println("Hello " + name);
boolean printLog = getDescriptor().isPrintLog();
if (printLog) {
logger.println("Log is " + getDescriptor().getLog());
}
return true;
}
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
@Extension
public static class DescriptorImpl extends BuildStepDescriptor {
@Getter
@Setter
private boolean printLog;
@Getter
@Setter
private String log;
private static final String PLUGIN_NAME = "MyPlugin";
public DescriptorImpl() {
load();
}
@Override
public boolean isApplicable(Class extends AbstractProject> jobType) {
return true;
}
// 插件任务在jenkins上面的显示名称
@NonNull
@Override
public String getDisplayName() {
return PLUGIN_NAME;
}
@Override
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
printLog = json.getBoolean("printLog");
log = json.getString("log");
// 将配置写入磁盘
save();
return super.configure(req, json);
}
}
}
配置
在resources目录配置对应的页面文件:
-
构建的主类
-
jelly文件存放的目录,要和主类保持一致
-
config.jelly文件中配置通过@DataBoundConstructor注解绑定的页面参数,本次配置具体如下:
-
global.jelly文件中配置了全局参数,本次配置如下:
-
index.jelly需要放到resources目录下面,这个文件中配置了插件的描述:
My First Jenkins Plugin!
执行mvn hpi:run 命令,启动一个本地的jenkins,通过默认的路径http://localhost:8080/jenkins,可以访问默认安装开发插件的jenkins,之后可以验证我们开发的插件。
启动完成之后,在jenkins的配置页面http://localhost:8080/jenkins/configure,可以看到我们新增的全局参数配置:
新增一个Job任务,选择我们开发的插件,添加参数:
构建任务,可以发现全局参数已经生效:
参考链接:http://www.jenkins.io/zh/doc/developer/plugin-development/
代码地址:https://github.com/yzh19961031/blogDemo/tree/master/jenkinsPlugin



