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

时间:2015-08-03 18:44:53

标签: 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")
}

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

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

Workflow Plugin "最初受Build Flow Plugin" 的启发,在its tutorial中有以下部分:

  

使用奴隶

     

参数可以是从属名称,也可以是单个标签,甚至是标签表达式,例如:

  node('unix && 64bit') {
      // as before
  }
自2014年1月27日起,Build Flow Plugin的评论中的

The following question未得到答复:

  

Alexander Uvizhev说:

     

有没有办法指定特定构建应该在哪里运行?通过提供标签或节点名称。

答案 2 :(得分:0)

安装NodeLabel parameter plugin。它提供参数选项标签

然后,您可以在DSL脚本中使用此参数来传递节点名称或值。