我需要创建两个不同的Jenkins Builder类。每个都做不同的事情,每个都需要自己的.jelly,但是,两者都需要相同的全局配置(global.jelly),它指定主机和一些用户凭证。
两个构建器类型的实例在其perform()期间将使用凭据(也在全局配置中指定)连接到主机(在全局配置中指定)。
问题是在Jenkins中,您将每个构建器的资源放在与构建器类名对应的文件夹中,并且该资源文件包含global.config。
如果我将配置复制到两个构建器的资源文件夹,我会得到两个相同的全局配置部分......
是否有两个Builder类创建一个.hpi,每个类都有自己的config.jelly和help .html文件,但两者共享相同的全局配置(global.jelly)?
答案 0 :(得分:3)
是的,这是非常可能的,但不是常规扩展Builder的方式。您需要将其用作JobProperty。让我们举一个例子来解释如何做到这一点。
您至少会有3个课程/包。
MyPluginClass
- 包含所有全局配置的字段。MyBuildStepAClass
- 是否已实施构建步骤A. MyBuildStepBClass
- 执行构建步骤B。构建步骤类MyBuildStepAClass
和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
(而不是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
如何帮助您在不同的构建步骤中访问单个配置。
更新以包含有关果冻文件的信息。
MyPluginClass
包中有一个global.jelly文件。此果冻文件将包含要在全局配置中呈现/存储的字段。
<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>
每个Build步骤都有自己的index.jelly文件,其中包含特定于Build步骤的果冻代码。希望能让它更清晰......
答案 1 :(得分:0)
完全避免使用global.jelly
。这是不推荐使用的。 JobProperty
也仅适用于您需要每个职位配置,而请求是关于全局配置的。
相反,请使用为此目的而设计的GlobalConfiguration
API。 standard archetype显示了如何使用它。