| 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"
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. |