Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access files on a node slave from Jenkins master using Groovy

I am using the Jenkins Build Flow plugin to achieve parallelization. The Groovy DSL does certain file operations. Even though the option Restrict where this project can be run is set to run the job on a specific slave, the DSL runs on master. This is not intended.

Could someone tell me how I can restrict the DSL to run on the specified slave? Even if there is a way we can access the slave file system via the DSL, that should work.

In general, how can we access files on a node slave from Jenkins master using Groovy?

def fp = new hudson.FilePath(build.workspace.channel, "/srv/jenkins/workspace/myworkspace_on_slave_node")
assert fp.exists()      // returns true :)

def ant = new AntBuilder()

if (fp != null) {
  def scanner = ant.fileScanner {    // fails here :(, says /srv/jenkins/workspace/myworkspace_on_slave_node not found
    // grab ALL files requested to be run
    fileset(dir: "$fp", includes: "**/*.java")
  }

  // now lets iterate over - print - and count test files
  int numFiles = 0
  for (f in scanner) {
    println("Found file $f")    
    numFiles++
  }
  println("Total files $numFiles")
}

The workspace is there on the slave node, but the above code is failing when I am trying to open the FileSet to the remote FilePath.

like image 525
techjourneyman Avatar asked Aug 03 '15 18:08

techjourneyman


People also ask

How do I run a Groovy script in Jenkins slave?

Visit “Manage Jenkins” > “Manage Nodes”. Select any node to view the status page. In the menu on the left, a menu item is available to open a “Script Console” on that specific agent. Scriptler allows you to store/edit groovy scripts and execute it on any of the slaves/nodes…


1 Answers

The Groovy DSL is always executed on master (in tomcats directory). Even if you install Node Label Parameter plugin and set build job to be executed on some specific slave. If you want to get access from Groovy DSL to job workspace on slave you can use channel. There's my example of creating a file in build flow job workspace:

if(build.workspace.isRemote()){
channel = build.workspace.channel
}
String fp = build.workspace.toString() + "\\" + "newfile.txt"
newFile = new hudson.FilePath(channel, fp)
newFile.write("xyz", null)

An easier way is executing file operations in downstream jobs in Execute Groovy script (not in build flow job) running on specific slave. You must have node plugin installed and pass slave name as a parameter in DSL script: build("jobA", paramNode: "nodename")

like image 160
jussuper Avatar answered Nov 15 '22 08:11

jussuper