1

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

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

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

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

4

2 回答 2

3

是的,这很有可能,但不是以扩展 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<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";
         }
    }
}

要在两个插件类之间共享配置,您将扩展您的MyPluginClassfrom 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 文件,其中包含特定于构建步骤的果冻代码。希望这能让它更清楚..

于 2014-04-26T10:40:52.527 回答
0

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

相反,请使用GlobalConfiguration为此目的设计的 API。有一个标准原型显示如何使用它。

于 2018-08-21T14:23:15.527 回答