Issue
-
I am trying to port some legacy Jenkins build jobs that used Linux shell scripts (to Jenkins Workflow scripts) to download and stage/deploy to multiple server nodes. I need to be able to save and manipulate files to the Workflow workspace (or to somewhere under /tmp) directory structure.
-
When we use groovy library classes (AntBuilder, File) it is working fine on Client-controller but it is not working on Agent machines.
Environment
-
CloudBees CI (CloudBees Core) on modern cloud platforms - Managed controller
-
CloudBees CI (CloudBees Core) on traditional platforms - Client controller
-
CloudBees Jenkins Enterprise - Managed controller
Resolution
The operations with File class are run on the controller, so only works if the build is run on controller.
In this example, I create a file and check if I can access it on a node using the method exists. The file can’t be found because the new File(file) code is executed on the controller. To double-check this, I did the same for the folder Users, which exists on my controller but not in the node.
stage 'file move wrong way'
//it only works on master
node('agent') {
def ws = pwd()
def context = ws + "/testArtifact"
def file = ws + '/file'
sh 'touch ' + file
sh 'ls ' + ws
echo 'File on node : ' + new File(file).exists()
echo 'Users : ' + new File('/Users').exists()
sh 'mv ' + file + ' ' + context
sh 'ls ' + ws
}
To execute file manipulation command we recommend to use native commands.
This is a simple example of operations in shell
stage 'Init'
node {
stage 'Environment'
sh 'export'
stage 'Create file'
sh 'touch test.txt'
stage 'List relative Directory'
sh 'ls ../../../../../'
stage 'List / dir'
sh 'ls /'
stage 'List Home of user'
sh 'ls $HOME'
stage 'List Home of agent'
sh 'ls $JENKINS_HOME'
stage 'List temp'
sh 'ls $TMPDIR'
stage 'List job dir'
sh '''
echo $(pwd)
ls .
ls $(pwd)
'''
stage 'download file'
def out='$(pwd)/download/maven.tgz'
sh 'mkdir -p ./download'
sh 'curl -L https://ftp.cixug.es/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -o ' + out
stage 'move/rename'
def newName = 'mvn.tgz'
sh 'mkdir -p $(pwd)/other'
sh 'mv ' + out + ' ' + newName
sh 'cp ' + newName + ' ' + out
}
Reference
-
Also take a look to Pipeline Examples and Pipeline Utility Steps Plugin