While troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a StackOverflowError.

      How to Reproduce

      Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal Builder and BuilderDescriptor:

      The builder:

      import hudson.tasks.Builder;
      import jenkins.tasks.SimpleBuildStep;
      import org.kohsuke.stapler.DataBoundConstructor;
      import org.kohsuke.stapler.StaplerRequest;
      
      import java.io.Serializable;
      
      public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {
      
          @DataBoundConstructor
          public MyBuilder() {
          }
      
          @SuppressWarnings({"UnusedDeclaration"})
          public static final class DescriptorImpl extends MyBuilderDescriptor {
      
              @Override
              public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                  return super.configure(req, formData);
              }
          }
      }
      

      The descriptor:

      import hudson.Extension;
      import hudson.model.AbstractProject;
      import hudson.tasks.BuildStepDescriptor;
      import hudson.tasks.Builder;
      import jenkins.model.Jenkins;
      import org.jenkinsci.Symbol;
      
      
      @Extension
      @Symbol({"myBuilder"})
      public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {
      
          private String myAttribute = "default";
          private static MyBuilderDescriptor descriptor;
      
          static {
              descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
          }
      
          public MyBuilderDescriptor() {
              super(MyBuilder.class);
          }
      
          public static void setDescriptor(MyBuilderDescriptor descriptor) {
              MyBuilderDescriptor.descriptor = descriptor;
          }
      
          public static MyBuilderDescriptor getDescriptor() {
              return MyBuilderDescriptor.descriptor;
          }
      
          public String getMyAttribute() {
              return myAttribute;
          }
      
          public void setMyAttribute(String myAttribute) {
              this.myAttribute = myAttribute;
          }
      
          @Override
          public boolean isApplicable(Class<? extends AbstractProject> jobType) {
              return false;
          }
      }
      

      The global.jelly:

      <j:jelly xmlns:j="jelly:core"
               xmlns:f="/lib/form">
        <f:section title="My Attribute">
          <f:entry title="My Attribute" field="myAttribute">
            <f:textbox style="width:20em;"/>
          </f:entry>
        </f:section>
      </j:jelly>
      

      When you have this extension, exporting the CasC configuration will yield a SOE:

      [...]
      	at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
      	at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
      	at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
      	at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
      	at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
      	at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
      	at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
      [...]
      

          [JENKINS-75170] JCasC does not ignore static methods

          Allan BURDAJEWICZ created issue -
          Allan BURDAJEWICZ made changes -
          Link New: This issue relates to JENKINS-72567 [ JENKINS-72567 ]
          Allan BURDAJEWICZ made changes -
          Description Original: While looking troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          ### How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}
          New: While looking troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          .h3 How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}
          Mark Waite made changes -
          Description Original: While looking troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          .h3 How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}
          New: While looking troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          h3. How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}
          Allan BURDAJEWICZ made changes -
          Description Original: While looking troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          h3. How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}
          New: While troubleshooting an environment impacted by https://issues.jenkins.io/browse/JENKINS-72567, it seemed that the JCasC base configurator considers static method and may cause unexpected issues - such as in this case a {{StackOverflowError}}.

          h3. How to Reproduce

          Trying to simplify the blazemeter plugin scenario, you can reproduce a SOE with the following minimal {{Builder}} and {{BuilderDescriptor}}:

          The builder:

          {code}
          import hudson.tasks.Builder;
          import jenkins.tasks.SimpleBuildStep;
          import org.kohsuke.stapler.DataBoundConstructor;
          import org.kohsuke.stapler.StaplerRequest;

          import java.io.Serializable;

          public class MyBuilder extends Builder implements SimpleBuildStep, Serializable {

              @DataBoundConstructor
              public MyBuilder() {
              }

              @SuppressWarnings({"UnusedDeclaration"})
              public static final class DescriptorImpl extends MyBuilderDescriptor {

                  @Override
                  public boolean configure(StaplerRequest req, net.sf.json.JSONObject formData) throws FormException {
                      return super.configure(req, formData);
                  }
              }
          }
          {code}

          The descriptor:

          {code}
          import hudson.Extension;
          import hudson.model.AbstractProject;
          import hudson.tasks.BuildStepDescriptor;
          import hudson.tasks.Builder;
          import jenkins.model.Jenkins;
          import org.jenkinsci.Symbol;


          @Extension
          @Symbol({"myBuilder"})
          public class MyBuilderDescriptor extends BuildStepDescriptor<Builder> {

              private String myAttribute = "default";
              private static MyBuilderDescriptor descriptor;

              static {
                  descriptor = Jenkins.get().getDescriptorByType(MyBuilderDescriptor.class);
              }

              public MyBuilderDescriptor() {
                  super(MyBuilder.class);
              }

              public static void setDescriptor(MyBuilderDescriptor descriptor) {
                  MyBuilderDescriptor.descriptor = descriptor;
              }

              public static MyBuilderDescriptor getDescriptor() {
                  return MyBuilderDescriptor.descriptor;
              }

              public String getMyAttribute() {
                  return myAttribute;
              }

              public void setMyAttribute(String myAttribute) {
                  this.myAttribute = myAttribute;
              }

              @Override
              public boolean isApplicable(Class<? extends AbstractProject> jobType) {
                  return false;
              }
          }
          {code}

          The {{global.jelly}}:

          {code}
          <j:jelly xmlns:j="jelly:core"
                   xmlns:f="/lib/form">
            <f:section title="My Attribute">
              <f:entry title="My Attribute" field="myAttribute">
                <f:textbox style="width:20em;"/>
              </f:entry>
            </f:section>
          </j:jelly>
          {code}

          When you have this extension, exporting the CasC configuration will yield a SOE:

          {code}
          [...]
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:330)
          at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:264)
          at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:183)
          [...]
          {code}

            Unassigned Unassigned
            allan_burdajewicz Allan BURDAJEWICZ
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: