Skip to content

Can't export configuration successfully without getting stack traces #832

@mglazer

Description

@mglazer

Your checklist for this issue

🚨 Please review the guidelines for contributing to this repository.

  • Jenkins version

  • Plugin version

  • OS

Description

  • Jenkins Version: 2.164.1
  • CASC Version: 1.11

Attempting to export the current configuration from the CASC Plugin Landing Page leads to YAML file that looks like the following (abridged):

jenkins:
  agentProtocols:
  - "JNLP4-connect"
  - "Ping"
  authorizationStrategy:
    globalMatrix:
      grantedPermissions:
      - "Permission[class hudson.model.Hudson,Administer]:anonymous"
  disableRememberMe: false
  markupFormatter: "FAILED TO EXPORT hudson.model.Hudson#markupFormatter: \njava.lang.NullPointerException\n\
    \tat io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.lambda$describe$4(HeteroDescribableConfigurator.java:99)\n\
    \tat io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.lambda$describe$6(HeteroDescribableConfigurator.java:103)\n\
    \tat io.vavr.control.Option.map(Option.java:373)\n\tat io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.describe(HeteroDescribableConfigurator.java:102)\n\
    \tat io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.describe(HeteroDescribableConfigurator.java:50)\n\
    \tat io.jenkins.plugins.casc.Attribute.describe(Attribute.java:195)\n\tat io.jenkins.plugins.casc.Configurator.describe(Configurator.java:162)\n\
    \tat io.jenkins.plugins.casc.ConfigurationAsCode.export(ConfigurationAsCode.java:403)\n\
    \tat io.jenkins.plugins.casc.ConfigurationAsCode.doExport(ConfigurationAsCode.java:393)\n\
    \tat java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)\n\
    \tat org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:396)\n\t\
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:408)\n\t\
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)\n\
    \tat org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)\n\
    \tat org.kohsuke.stapler.Function.bindAndInvoke(Function.java:212)\n\tat org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:145)\n\
    \tat org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:537)\n\tat org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)\n\
    \tat org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)\n\tat org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)\n\
    \tat org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:458)\n\tat org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)\n\
    \tat org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)\n\tat org.kohsuke.stapler.Stapler.invoke(Stapler.java:668)\n\
    \tat org.kohsuke.stapler.Stapler.service(Stapler.java:238)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\
    \tat org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)\n\t\
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)\n\
    \tat hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)\n\
    \tat jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125)\n\tat\
    \ hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)\n\t\
    at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:128)\n\
    \tat hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)\n\
    \tat hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)\n\t\
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:64)\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)\n\
    \tat hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)\n\
    \tat hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)\n\
    \tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)\n\
    \tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)\n\
    \tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\
    \tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\
    \tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)\n\
    \tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\
    \tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\
    \tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\
    \tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\
    \tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\
    \tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)\n\
    \tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\
    \tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\
    \tat org.eclipse.jetty.server.Server.handle(Server.java:503)\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)\n\
    \tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)\n\
    \tat org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\n\
    \tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:411)\n\
    \tat org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:305)\n\
    \tat org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:159)\n\
    \tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\
    \tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\
    \tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\
    \tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\
    \tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\
    \tat org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\
    \tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\n\
    \tat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\n\
    \tat java.lang.Thread.run(Thread.java:748)\n"
  mode: NORMAL

This seems to be the result of the commit:

#674

Specifically it suppressed the unchecked warning, even though DataBoundConfigurator::describe definitely can and does return null.

https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/plugin/src/main/java/io/jenkins/plugins/casc/impl/configurators/DataBoundConfigurator.java#L258

I believe that null filtering might be sufficient here, but would look to guidance as to what is the actually correct solution.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions