使用Groovy从Jenkins master访问节点从属文件

nas*_*ras 5 file-io groovy jenkins jenkins-plugins jenkins-build-flow

我正在使用Jenkins Build Flow插件来实现并行化.Groovy DSL执行某些文件操作.即使该选项Restrict where this project can be run设置为在特定从站上运行作业,DSL也在主站上运行.这不是预期的.

有人能告诉我如何限制DSL在指定的奴隶上运行吗?即使有一种方法我们可以通过DSL访问从属文件系统,这应该工作.

一般来说,我们如何使用Groovy从Jenkins master访问节点slave上的文件?

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")
}
Run Code Online (Sandbox Code Playgroud)

工作空间位于从属节点上,但是当我尝试将FileSet打开到远程FilePath时,上面的代码失败了.

jus*_*per 12

Groovy DSL总是在master上执行(在tomcats目录中).即使你安装节点标签参数插件并设置要在某些specyfic slave上执行的构建作业.如果您希望从Groovy DSL访问奴隶上的作业工作区,您可以使用频道.我在构建流作业工作区中创建文件的示例:

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)
Run Code Online (Sandbox Code Playgroud)

更简单的方法是在specyfic slave上运行的Execute Groovy脚本(不是构建流程作业)中的下游作业中执行文件操作.您必须安装节点插件并将slave名称作为DSL脚本中的参数传递:build("jobA",paramNode:"nodename")