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

          There are no comments yet on this issue.

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

              Created:
              Updated: