我正在尝试创建一个据称很简单的 Jenkins 插件,它将与 IP 电源板设备进行通信,但我遇到了一些问题。我对文档进行了深入研究,但充其量似乎很少。
我的理论是创建一个带有相关描述符的发布者。描述符将通过 bean 对象(参数)采用可重复的形式,然后使其可用于记录器。
实际上似乎发生的是:
Caused by: net.sf.json.JSONException: Error while setting property=data type interface java.util.List
at net.sf.json.JSONObject.toBean(JSONObject.java:577)
at net.sf.json.JSONObject.toBean(JSONObject.java:383)
at net.sf.json.JSONObject.toBean(JSONObject.java:250)
at hudson.tools.JDKInstaller$JDKList.toList(JDKInstaller.java:612)
at hudson.tools.JDKInstaller$DescriptorImpl.getInstallableJDKs(JDKInstaller.java:588)
... 237 more
Caused by: java.lang.NullPointerException
at net.sf.json.JSONObject$MethodProperty.isWritable(JSONObject.java:311)
at net.sf.json.JSONObject.toBean(JSONObject.java:429)
... 241 more
这是参数类
package com.mb;
import hudson.Extension;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import java.io.Serializable;
@ExportedBean
public class PlugParamters extends AbstractDescribableImpl<PlugParamters> implements Serializable {
private final String buildState;
private final String plugId;
private final int plugAction;
@DataBoundConstructor
public PlugParamters(String buildState, String plugId, int plugAction) {
this.buildState = buildState;
this.plugId = plugId;
this.plugAction = plugAction;
}
@Exported
public String getBuildState() {
return buildState;
}
@Exported
public String getPlugId() {
return plugId;
}
@Exported
public int getPlugAction() {
return plugAction;
}
@Extension
public static class DescriptorImpl extends Descriptor<PlugParamters> {
public DescriptorImpl() {
super(PlugParamters.class);
}
@Override
public String getDisplayName() {
return "";
}
}
}
最后:
package com.mb;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.*;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import hudson.util.FormValidation;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class IPPowerPublisher extends Recorder {
public IPPowerPublisher() {
}
@Override
public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) {
return true;
}
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.NONE;
}
private boolean oneOrMoreBuildsFailing(List<Project> projects) {
boolean oneOrMoreBuildsFailing = false;
for (Project project : projects) {
Result projectLatestBuildResult = project.getLastBuild().getResult();
if (!(projectLatestBuildResult.isBetterOrEqualTo(Result.SUCCESS) || !projectLatestBuildResult.equals(Result.NOT_BUILT))) {
oneOrMoreBuildsFailing = true;
break;
}
}
return oneOrMoreBuildsFailing;
}
@Extension
public final static class DescriptorImpl extends BuildStepDescriptor<Publisher> {
public List<PlugParamters> getPlugParamters() {
return plugParamters;
}
public void setPlugParamters(List<PlugParamters> plugParamters) {
this.plugParamters = plugParamters;
}
private List<PlugParamters> plugParamters = new ArrayList<PlugParamters>();
private String host = "";
public FormValidation doCheckHost(@QueryParameter String value) throws IOException, ServletException {
if (value != null && value.length() == 0)
return FormValidation.error("Please set a host name or IP address");
return FormValidation.ok();
}
@Override
public String getDisplayName() {
return "Continuous Integration Feedback";
}
@Override
public boolean configure(StaplerRequest req, JSONObject formData) throws hudson.model.Descriptor.FormException {
host = formData.getString("host");
//plugParamters = req.bindParametersToList(PlugParamters.class, "");
save();
return super.configure(req, formData);
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
}
}