使用 Groovy 从 Jenkins master 访问 node slave 上的文件

Access files on a node slave from Jenkins master using Groovy

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

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

一般来说,我们如何使用 Groovy 从 Jenkins master 访问 node 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 时,上面的代码失败了。

Workflow Plugin "Originally inspired by the Build Flow Plugin" has the following section in its tutorial:

Using slaves

The parameter may be a slave name, or a single label, or even a label expression such as:

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

The following question 在构建流程插件的评论中自 2014 年 1 月 27 日以来未得到答复:

Alexander Uvizhev says:

Is there a way to specify where particular build should run? By providing a label or a node name.

安装NodeLabel parameter plugin。提供参数选项Label.

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

Groovy DSL 总是在 master 上执行(在 tomcats 目录中)。即使您安装 Node Label Parameter 插件并将构建作业设置为在某些特定的从站上执行。如果你想从 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)

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

在 Groovy:

中,这几乎是从 slave 读取文件内容的替代品
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