6

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

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

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

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 时,上面的代码失败了。

4

4 回答 4

12

Groovy DSL 总是在 master 上执行(在 tomcats 目录中)。即使您安装了Node Label Parameter插件并将构建作业设置为在某些特定从站上执行。如果您想从 Groovy DSL 访问 slave 上的作业工作区,您可以使用通道。这是我在构建流程作业工作区中创建文件的示例:

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)

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

于 2015-08-04T06:29:16.517 回答
0

工作流程插件 “最初受构建流程插件的启发”在其教程中有以下部分:

使用奴隶

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

  node('unix && 64bit') {
      // as before
  }

自 2014 年 1 月 27 日以来,Build Flow Plugin 评论中的以下问题没有得到解答:

亚历山大·乌维热夫说:

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

于 2015-08-03T19:53:41.957 回答
0

安装NodeLabel 参数插件。它提供参数选项Label

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

于 2015-08-04T05:02:48.133 回答
0

这几乎是从 Groovy 中从从站读取文件内容的替代品:

def workspace = build.getEnvVars()["WORKSPACE"];
def nodeChannel = build.workspace.channel;
String svnVersion = new hudson.FilePath(nodeChannel, workspace + '/relative/path/svn-revision').readToString();

远程创建的文件在哪里relative/path/svn-revision(在从站上)。

对于本地文件,等效项是:svnVersion = new File(workspace, 'artifacts/svn-revision').text;. 所以有点短,但不多。

正如其他人所指出的——Groovy 脚本总是在主服务器上运行,而不是在从服务器上运行。因此,您必须使用hudson.FilePath和使用了解 FilePath API 的命令。

还有act(FileCallable)似乎在奴隶上运行文件命令,但还没有尝试过。

见:https ://javadoc.jenkins.io/hudson/FilePath.html

于 2021-09-01T16:32:49.497 回答