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

Can't create temp file in Kubernetes Plugin Pipeline

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Major Major
    • kubernetes-plugin
    • Kuberetes 1.8
      Jenkins 2.107
      Kubernetes Plugin: 1.2.1
      Java Version: 1.8.0_151
      Jenkins Master running in Docker Container in k8s

      We are having an issue where we can not create a temp file in a build pipeline within a PodTemplate. Oddly inserting a random 'sh' command before the creation of the temp file solved the problem. Here is the code that fails:

       

      import hudson.FilePath;
      import jenkins.model.Jenkins;
      
      def label = "mynode"
      podTemplate(
        label: label,
        nodeSelector: "kops.k8s.io/instancegroup=jenkins-workers",
        containers: [containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl:v1.9.3', command: 'cat', ttyEnabled: true)]) {
      
        node(label) {
          container("kubectl") {
            def workspace = new FilePath(Jenkins.getInstance().getComputer(env.NODE_NAME).getChannel(), env.WORKSPACE);
            workspace.createTempFile("test", ".txt")
            sh "ls -al"
          }
        }
      }
      

       

      The full log is attached, but essentially we get the following exception:

      Caused: java.io.IOException: Failed to create a temp file on /home/jenkins/workspace/folder/test-job
      at hudson.FilePath.createTempFile(FilePath.java:1330)
      

      Oddly, if we add a "sh" command before the creation of the temp file the job succeeds. The following code works:

      import hudson.FilePath;
      import jenkins.model.Jenkins;
      
      def label = "mynode"
      podTemplate(
        label: label,
        nodeSelector: "kops.k8s.io/instancegroup=jenkins-workers",
        containers: [containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl:v1.9.3', command: 'cat', ttyEnabled: true)]) {
      
        node(label) {
          container("kubectl") {
            sh "ls -al" // This added code somehow makes this pipeline succeed.
            def workspace = new FilePath(Jenkins.getInstance().getComputer(env.NODE_NAME).getChannel(), env.WORKSPACE);
            workspace.createTempFile("test", ".txt")
            sh "ls -al"
          }
        }
      }
      

      It does not seem to matter what the "sh" command before the temp file creation is. We have used "pwd", "echo $HOME", etc. and they all have the same effect of making the pipeline work. Of course both sh "ls -al" commands were put in there as debugging steps, and it just so happened that the first one accidentally made the pipeline work.

       

            Unassigned Unassigned
            mmacfadden Michael MacFadden
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: