可以在同一个hpi中存在两个不同的jenkins构建器并共享相同的全局配置吗?

我需要创建两个不同的Jenkins Builder类。 每个都做不同的事情,每个都需要自己的.jelly,但是,两者都需要相同的全局配置(global.jelly),它指定主机和一些用户凭据。
两个构建器类型的实例在其perform()期间将使用凭据(也在全局配置中指定)连接到主机(在全局配置中指定)。

问题是在Jenkins中,您将每个构建器的资源放在与构建器类名对应的文件夹中,并且该资源文件包含global.config。

如果我将配置复制到两个构建器的资源文件夹,我将获得两个相同的全局配置部分…

有两个Builder类创建一个.hpi,每个类都有自己的config.jelly和帮助.html文件,但两者共享相同的全局配置(global.jelly)?

是的,这是非常可能的,但不是常规扩展Builder的方式。 您需要将其用作JobProperty。 让我们举一个例子来解释如何做到这一点。

您至少有3个课程/套餐。

  • MyPluginClass – 包含所有全局配置的字段。
  • MyBuildStepAClass – 具有构建步骤A的实现。
  • MyBuildStepBClass – 具有构建步骤B的实现。

构建步骤类MyBuildStepAClassMyBuildStepBClass的代码将与通常为具有单个构建步骤的插件编写它的代码相同。 以下是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 { 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"; } } } 

要在两个插件类之间共享配置,您将从JobProperty> (而不是Builder )扩展MyPluginClass并覆盖getDescriptor()方法以使用Jenkins.getInstance().getDescriptor(getclass());返回描述符Jenkins.getInstance().getDescriptor(getclass());

 public class MyPluginClass extends JobProperty> { @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文件。 此果冻文件将包含要在全局配置中呈现/存储的字段。

        

每个Build步骤都有自己的index.jelly文件,其中包含特定于Build步骤的果冻代码。 希望能让它更清晰..

完全避免使用global.jelly 。 这是半弃用的。 JobProperty也适用于您需要按作业配置,而请求是关于全局配置。

而是使用为此目的而设计的GlobalConfiguration API。 有一个标准的原型显示如何使用它。