Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-60045

JCasC export doesn't work with Custom Tools installed and configured

    Details

    • Similar Issues:

      Description

      When the Custom Tools plugin is installed and a Custom Tool is configured and JCasc 'View Configuration' button is clicked and the following error results in the Casc output:

      ```customTool:
      installations: |-
      FAILED TO EXPORT
      com.cloudbees.jenkins.plugins.customtools.CustomTool$DescriptorImpl#installations: java.lang.IllegalArgumentException: argument type mismatch
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423)```

       

      I attempted this with the following versions:

      Configuration as Code Plugin version 1.32
      Configuration as Code Support Plugin version 1.19
      Custom Tools version .6
      Jenkins version 2.190.1

       

        Attachments

          Issue Links

            Activity

            Hide
            kon Kalle Niemitalo added a comment -

            FWIW, the syntax for configuring custom tools via JCasC appears to be like this:

            tool:
              customTool:
                installations:
                - name: "DocFx"
                  home: ""
                  properties:
                  - installSource:
                      installers:
                      - zip:
                          label: "windows"
                          url: "https://github.com/dotnet/docfx/releases/download/v2.39.2/docfx.zip"
            
            Show
            kon Kalle Niemitalo added a comment - FWIW, the syntax for configuring custom tools via JCasC appears to be like this: tool: customTool: installations: - name: "DocFx" home: "" properties: - installSource: installers: - zip: label: "windows" url: "https://github.com/dotnet/docfx/releases/download/v2.39.2/docfx.zip"
            Hide
            kon Kalle Niemitalo added a comment - - edited

            A longer stack trace from Jenkins 2.190.3, Custom Tools Plugin 0.7, Configuration as Code Plugin 1.34, Configuration as Code Support not installed:

            FAILED TO EXPORT
            com.cloudbees.jenkins.plugins.customtools.CustomTool$DescriptorImpl#installations: java.lang.IllegalArgumentException: argument type mismatch
              at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
              at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
              at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
              at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
              at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.describe(DataBoundConfigurator.java:299)
              at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:264)
              at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:239)
              at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:162)
              at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:106)
              at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.lambda$describe$3(GlobalConfigurationCategoryConfigurator.java:99)
              at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator$$Lambda$286.0000000000000000.accept(Unknown Source)
              at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
              at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
              at java.util.Iterator.forEachRemaining(Iterator.java:116)
              at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
              at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:497)
              at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487)
              at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
              at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
              at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241)
              at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:485)
              at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:99)
              at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:30)
            
            Show
            kon Kalle Niemitalo added a comment - - edited A longer stack trace from Jenkins 2.190.3, Custom Tools Plugin 0.7, Configuration as Code Plugin 1.34, Configuration as Code Support not installed: FAILED TO EXPORT com.cloudbees.jenkins.plugins.customtools.CustomTool$DescriptorImpl#installations: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.describe(DataBoundConfigurator.java:299) at io.jenkins.plugins.casc.Attribute._describe(Attribute.java:264) at io.jenkins.plugins.casc.Attribute.describe(Attribute.java:239) at io.jenkins.plugins.casc.Configurator.describe(Configurator.java:162) at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:106) at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.lambda$describe$3(GlobalConfigurationCategoryConfigurator.java:99) at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator$$Lambda$286.0000000000000000.accept(Unknown Source) at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.Iterator.forEachRemaining(Iterator.java:116) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:497) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:485) at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:99) at io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator.describe(GlobalConfigurationCategoryConfigurator.java:30)
            Hide
            kon Kalle Niemitalo added a comment -

            I wonder if the error is triggered by com.cloudbees.jenkins.plugins.customtools.CustomTool$DescriptorImpl overriding setInstallations with a concrete type but not getInstallations.  Might be related to this comment in io.jenkins.plugins.casc.BaseConfigurator#describe:

                    // Resolve the methods and merging overrides to more concretized signatures
                    // because the methods can to have been overridden with concretized type
                    // TODO: Overloaded setters with different types can corrupt this logic
            
            Show
            kon Kalle Niemitalo added a comment - I wonder if the error is triggered by com.cloudbees.jenkins.plugins.customtools.CustomTool$DescriptorImpl overriding setInstallations with a concrete type but not getInstallations .  Might be related to this comment in io.jenkins.plugins.casc.BaseConfigurator#describe : // Resolve the methods and merging overrides to more concretized signatures // because the methods can to have been overridden with concretized type // TODO: Overloaded setters with different types can corrupt this logic
            Hide
            kon Kalle Niemitalo added a comment - - edited

            The exception was thrown during the newInstance call at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.describe(DataBoundConfigurator.java:299):

            T ref = (T) constructor.newInstance(args);
            

            The type being constructed should be CustomTool, and I think it is. If the type had been CustomTool[] or ToolInstallation[] or ToolInstallation, then DataBoundConfigurator.getDataBoundConstructor would have returned null, and DefaultConfiguratorRegistry.internalLookup would not have created an instance of DataBoundConfigurator.

            So, it seems to be a matter of incorrect arguments being generated for the CustomTool constructor.

            Perhaps the error is triggered by the @CheckForNull LabelSpecifics[] labelSpecifics parameter of that constructor. If CustomTool.getLabelSpecifics returns an array, then the type of this array does not implement java.util.Collection, so DataBoundConfiguration.describe assigns args[i] = Collections.singletonList(converted), which is not acceptable to the constructor.

            If this theory is correct, then the error could be fixed either by changing CustomTool to use a collection type instead of the array type, or by changing DataBoundConfigurator to check for array types as well. I cannot currently test these changes myself.

            Show
            kon Kalle Niemitalo added a comment - - edited The exception was thrown during the newInstance call at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.describe( DataBoundConfigurator.java:299 ): T ref = (T) constructor.newInstance(args); The type being constructed should be CustomTool , and I think it is. If the type had been CustomTool[] or ToolInstallation[] or ToolInstallation , then DataBoundConfigurator.getDataBoundConstructor would have returned null, and DefaultConfiguratorRegistry.internalLookup would not have created an instance of DataBoundConfigurator . So, it seems to be a matter of incorrect arguments being generated for the CustomTool constructor . Perhaps the error is triggered by the @CheckForNull LabelSpecifics[] labelSpecifics parameter of that constructor. If CustomTool.getLabelSpecifics returns an array, then the type of this array does not implement java.util.Collection , so DataBoundConfiguration.describe assigns args [i] = Collections.singletonList(converted) , which is not acceptable to the constructor. If this theory is correct, then the error could be fixed either by changing CustomTool to use a collection type instead of the array type, or by changing DataBoundConfigurator to check for array types as well. I cannot currently test these changes myself.
            Hide
            kon Kalle Niemitalo added a comment -

            Fixed in configuration-as-code-plugin 1.35 with <https://github.com/jenkinsci/configuration-as-code-plugin/pull/1234/>.

            Show
            kon Kalle Niemitalo added a comment - Fixed in configuration-as-code-plugin 1.35 with < https://github.com/jenkinsci/configuration-as-code-plugin/pull/1234/ >.

              People

              • Assignee:
                ewel Ewelina Wilkosz
                Reporter:
                tisaroo55 TJ Rue
              • Votes:
                4 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: