是的,这很有可能,但不是以扩展 Builder 的常规方式。您需要将其用作 JobProperty。让我们举一个例子来解释这是如何完成的。
您至少将有 3 个课程/课程。
-
MyPluginClass
- 具有所有全局配置的字段。
-
MyBuildStepAClass
- 已实施构建步骤 A。
-
MyBuildStepBClass
- 已实施构建步骤 B。
构建步骤类的代码MyBuildStepAClass
and MyBuildStepBClass
将与您通常为具有单个构建步骤的插件编写的代码相同。下面是一个示例MyBuildStepAClass
..
public class MyBuildStepAClass {
private String name;
.....
@DataBoundConstructor
public MyBuildStepAClass(String name, ....) {
this.name = name;
....
}
public String getName() {
return name;
}
public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) {
//logic for perform.
............
return true;
}
@Extension
public static class Descriptor extends BuildStepDescriptor<Builder> {
public Descriptor() {
load();
}
@Override
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
req.bindJSON(this, formData);
save();
return super.configure(req,formData);
}
@Override
public String getDisplayName() {
return "My Build Step A";
}
}
}
要在两个插件类之间共享配置,您将扩展您的MyPluginClass
from JobProperty<Job<?,?>>
(代替Builder
)并覆盖getDescriptor()
方法返回描述符使用Jenkins.getInstance().getDescriptor(getclass());
public class MyPluginClass extends JobProperty<Job<?, ?>> {
@Override
public MyPluginClassDescriptor getDescriptor() {
return (MyPluginClassDescriptor)Jenkins.getInstance().getDescriptor(getClass());
}
public static MyPluginClassDescriptor getMyPluginClassDescriptor() {
return (MyPluginClassDescriptor)Jenkins.getInstance().getDescriptor(MyPluginClass.class);
}
@Extension
public static final class MyPluginClassDescriptor extends JobPropertyDescriptor {
private String globalField1 = "";
public MyPluginClassDescriptor() {
super(MyPluginClass.class);
load();
}
@Override
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
req.bindJSON(this, formData);
save();
return super.configure(req,formData);
}
@DataBoundConstructor
public MyPluginClassDescriptor(String globalField1, ....) {
this.globalField1 = globalField1;
}
@Override
public String getDisplayName() {
return "IIBCI Plugin Configuration";
}
public getGlobalField1() {
return globalField1;
}
}
每个构建步骤的 global.jelly 和单独的 config.jelly 文件的内容将是正常的,就像您引用它们一样。希望这可以帮助您了解如何JobProperty
帮助您在不同的构建步骤中访问单一配置。
已更新以包含有关果冻文件的信息。
包中将有一个 global.jelly 文件MyPluginClass
。该果冻文件将包含您想要在全局配置中渲染/存储的字段。
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<f:section title="MyPlugin configuration">
<f:entry title="Global field1" field="globalField1">
<f:textbox />
</f:entry>
</f:section>
</j:jelly>
每个构建步骤都将有自己的 index.jelly 文件,其中包含特定于构建步骤的 jelly 代码。希望这能让它更清楚..