Configuration-as-code-plugin: Setting Docker Agent template gets NullPointerException

Created on 21 May 2019  路  6Comments  路  Source: jenkinsci/configuration-as-code-plugin

When defining a Docker Agent template in my config file I get a java.lang.NullPointerException.

This is my jenkins.ymlconfig file:

jenkins:
  clouds:
    - docker:
        name: "gce-docker"
        dockerApi:
          dockerHost:
            uri: "tcp://172.17.0.1:2375"
        templates:
        - dockerTemplateBase:
            image: "jenkins-agent-android-a4f8224:latest"
          labelString: "android gce daemon"
          name: "android"
          pullStrategy: PULL_NEVER

When removing the templates heading, everything works fine. Is there any solution for this problem?

Environment:
Jenkins version: 2.164.3
CasC Plugin version: 1.15
Docker plugin: 1.1.6
OS: Jenkins docker image (jenkins/jenkins:lts)

And this is the Java error I get:

java.lang.NullPointerException
    at com.nirima.jenkins.plugins.docker.DockerTemplate.hashCode(DockerTemplate.java:684)
    at java.util.AbstractList.hashCode(AbstractList.java:541)
    at com.nirima.jenkins.plugins.docker.DockerCloud.hashCode(DockerCloud.java:711)
    at java.util.HashMap.hash(HashMap.java:339)
    at java.util.HashMap.put(HashMap.java:612)
    at java.util.HashSet.add(HashSet.java:220)
    at hudson.model.Label.getClouds(Label.java:248)
    at hudson.model.Label.isEmpty(Label.java:456)
    at jenkins.model.Jenkins.trimLabels(Jenkins.java:2135)
    at jenkins.model.Jenkins$CloudList.onModified(Jenkins.java:518)
    at hudson.util.PersistedList.replaceBy(PersistedList.java:85)
    at io.jenkins.plugins.casc.impl.attributes.DescribableListAttribute.setValue(DescribableListAttribute.java:18)
    at io.jenkins.plugins.casc.impl.attributes.DescribableListAttribute.setValue(DescribableListAttribute.java:9)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:353)
Caused: io.jenkins.plugins.casc.ConfiguratorException: cloud: Failed to set attribute clouds(class: class hudson.slaves.Cloud, multiple: true)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:355)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:265)
Caused: io.jenkins.plugins.casc.ConfiguratorException: Failed to save hudson.model.Hudson@6d1c546a
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:268)
    at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$configureWith$4(ConfigurationAsCode.java:657)
    at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:627)
Caused: io.jenkins.plugins.casc.ConfiguratorException: jenkins: error configuring 'jenkins' with class io.jenkins.plugins.casc.core.JenkinsConfigurator configurator
    at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:633)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:657)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:548)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:277)
    at io.jenkins.plugins.casc.ConfigurationAsCode.doReload(ConfigurationAsCode.java:153)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:396)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:408)
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)
    at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:212)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:145)
    at org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:537)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)
    at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:458)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:739)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:870)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:668)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
    at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:128)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:99)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
    at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
    at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:503)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:748)
bug

Most helpful comment

So, after adding connector: attach the previous Java exception is gone. 馃槃

This config is working:

jenkins:
  clouds:
    - docker:
        name: "gce-docker"
        dockerApi:
          dockerHost:
            uri: "tcp://172.17.0.1:2375"
        templates:
        - connector: attach
          dockerTemplateBase:
            image: "jenkins-agent-android-a4f8224:latest"
          name: "android"
          pullStrategy: PULL_NEVER
          removeVolumes: true

All 6 comments

at com.nirima.jenkins.plugins.docker.DockerTemplate.hashCode(DockerTemplate.java:684)

https://github.com/jenkinsci/docker-plugin/blob/master/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java#L684

You need to add 'connector' and other fields

Have you tried configuring it in the UI and exporting the config?

Yes, UI works perfect and don't give issues. When exporting the config (after manual UI edit), and editing my YAML file with new config got the same java.lang.NullPointerException.

This is the output of a raw export after UI edit:

  clouds:
  - docker:
      dockerApi:
        dockerHost:
          uri: "tcp://172.17.0.1:2375"
      name: "gce-docker"
      templates:
      - dockerTemplateBase:
          image: "jenkins-agent-android-a4f8224:latest"
        labelString: "android gce daemon"
        mode: EXCLUSIVE
        name: "android"
        pullStrategy: PULL_NEVER

Can you log an issue with the docker agent plugin then, it should be included in the export

Created an issue on docker-plugin page: https://github.com/jenkinsci/docker-plugin/issues/733

So, after adding connector: attach the previous Java exception is gone. 馃槃

This config is working:

jenkins:
  clouds:
    - docker:
        name: "gce-docker"
        dockerApi:
          dockerHost:
            uri: "tcp://172.17.0.1:2375"
        templates:
        - connector: attach
          dockerTemplateBase:
            image: "jenkins-agent-android-a4f8224:latest"
          name: "android"
          pullStrategy: PULL_NEVER
          removeVolumes: true
Was this page helpful?
0 / 5 - 0 ratings