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

NullPointerException when there's an empty volumeMounts in YAML

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Minor Minor
    • kubernetes-plugin
    • None
    • kubernetes plugin 1.29.0

      When yaml specified in a podTemplate contains an a container definition with an empty volumeMounts, a NullPointerException is thrown.

          [JENKINS-64909] NullPointerException when there's an empty volumeMounts in YAML

          Fred G added a comment -

          I can reproduce this issue with Kubernetes plugin version 1.30.0.

          Here is a minimal pipeline with an empty "volumeMounts:" definition:

          pipeline {
            agent {
              kubernetes {
                label 'my-agent-pod'
                yaml """
          apiVersion: v1
          kind: Pod
          spec:
            containers:
            - name: maven
              image: maven:alpine
              volumeMounts:
              command:
              - cat
              tty: true
          """
              }
            }
            stages {
              stage('Run maven') {
                steps {
                  container('maven') {
                    sh 'mvn -version'
                  }
                }
              }
            }
          }
          

          Here is the error from the System Log:

          Error in provisioning; agent=KubernetesSlave name: my-agent-pod-5l46s-djkm0, template=PodTemplate{id='bd8e1a7d-1232-4b38-bdf2-89cef9df4823', name='my-agent-pod-5l46s', namespace='test', label='my-agent-pod', annotations=[PodAnnotation{key='buildUrl', value='<REDACTED>'}, PodAnnotation{key='runUrl', value='job/test/6/'}]}
          java.lang.NullPointerException
          	at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume.lambda$decorate$2(DefaultWorkspaceVolume.java:53)
          	at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume$$Lambda$604/0x00000000082f07c0.test(Unknown Source)
          	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
          	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
          	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:497)
          	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487)
          	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
          	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
          	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:239)
          	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
          	at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume.decorate(DefaultWorkspaceVolume.java:56)
          	at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.PodDecorator.decorateAll(PodDecorator.java:18)
          	at org.csanchez.jenkins.plugins.kubernetes.PodTemplateBuilder.build(PodTemplateBuilder.java:305)
          	at org.csanchez.jenkins.plugins.kubernetes.PodTemplate.build(PodTemplate.java:902)
          	at org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher.launch(KubernetesLauncher.java:116)
          	at hudson.slaves.SlaveComputer.lambda$_connect$0(SlaveComputer.java:294)
          	at hudson.slaves.SlaveComputer$$Lambda$555/0x00000000fc004380.call(Unknown Source)
          	at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
          	at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
          	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
          	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
          	at java.base/java.lang.Thread.run(Thread.java:836)
          

          NPE points to https://github.com/jenkinsci/kubernetes-plugin/blob/kubernetes-1.30.0/src/main/java/org/csanchez/jenkins/plugins/kubernetes/pod/decorator/DefaultWorkspaceVolume.java#L53

          Obvious workaround is to remove the empty "volumeMounts:" definition. Would be nice to get rid of the NPE and replace it with a warning or ignore it.

          Fred G added a comment - I can reproduce this issue with Kubernetes plugin version 1.30.0. Here is a minimal pipeline with an empty "volumeMounts:" definition: pipeline { agent { kubernetes { label 'my-agent-pod' yaml """ apiVersion: v1 kind: Pod spec: containers: - name: maven image: maven:alpine volumeMounts: command: - cat tty: true """ } } stages { stage( 'Run maven' ) { steps { container( 'maven' ) { sh 'mvn -version' } } } } } Here is the error from the System Log: Error in provisioning; agent=KubernetesSlave name: my-agent-pod-5l46s-djkm0, template=PodTemplate{id= 'bd8e1a7d-1232-4b38-bdf2-89cef9df4823' , name= 'my-agent-pod-5l46s' , namespace= 'test' , label= 'my-agent-pod' , annotations=[PodAnnotation{key= 'buildUrl' , value= '<REDACTED>' }, PodAnnotation{key= 'runUrl' , value= 'job/test/6/' }]} java.lang.NullPointerException at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume.lambda$decorate$2(DefaultWorkspaceVolume.java:53) at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume$$Lambda$604/0x00000000082f07c0.test(Unknown Source) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:497) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:239) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.DefaultWorkspaceVolume.decorate(DefaultWorkspaceVolume.java:56) at org.csanchez.jenkins.plugins.kubernetes.pod.decorator.PodDecorator.decorateAll(PodDecorator.java:18) at org.csanchez.jenkins.plugins.kubernetes.PodTemplateBuilder.build(PodTemplateBuilder.java:305) at org.csanchez.jenkins.plugins.kubernetes.PodTemplate.build(PodTemplate.java:902) at org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher.launch(KubernetesLauncher.java:116) at hudson.slaves.SlaveComputer.lambda$_connect$0(SlaveComputer.java:294) at hudson.slaves.SlaveComputer$$Lambda$555/0x00000000fc004380.call(Unknown Source) at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46) at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang. Thread .run( Thread .java:836) NPE points to https://github.com/jenkinsci/kubernetes-plugin/blob/kubernetes-1.30.0/src/main/java/org/csanchez/jenkins/plugins/kubernetes/pod/decorator/DefaultWorkspaceVolume.java#L53 Obvious workaround is to remove the empty "volumeMounts:" definition. Would be nice to get rid of the NPE and replace it with a warning or ignore it.

            Unassigned Unassigned
            jrogers Jonathan Rogers
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: