当前位置: 首页 > 知识库问答 >
问题:

使用Groovy从Jenkins主机访问节点从机上的文件

罗韬
2023-03-14

我正在使用 Jenkins Build Flow 插件来实现并行化。Groovy DSL执行某些文件操作。即使选项限制可以运行此项目的位置设置为在特定从服务器上运行作业,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")
}

工作区位于从属节点上,但是当我尝试打开远程文件路径的文件集时,上面的代码失败了。

共有3个答案

郭单鹗
2023-03-14

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

使用从属

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

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

自2014年1月27日以来,构建流插件评论中的以下问题一直未得到解答:

亚历山大·乌维热夫 说:

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

明宜年
2023-03-14

这几乎取代了Groovy中从slave读取文件内容:

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

其中< code > relative/path/SVN-revision 是远程创建的文件(在从属服务器上)。

对于本地文件,等效项是:svnVersion=new File(工作区,'人工制品/svn-修订'). text;。所以短了一点,但不多。

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

还有act(FileCallable)似乎在从机上运行File命令,但还没有尝试过。

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

胡高寒
2023-03-14

Groovy DSL始终在master上执行(在tomcat目录中)。即使您安装了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)

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

 类似资料:
  • 问题内容: 我正在使用Jenkins Build Flow插件来实现并行化。Groovy DSL执行某些文件操作。即使该选项设置为在特定从属服务器上运行作业,但DSL仍在主服务器上运行。这不是故意的。 有人可以告诉我如何限制DSL在指定的从站上运行吗?即使有一种方法可以通过DSL访问从文件系统,也应该可以。 通常,我们如何使用Groovy从Jenkins主节点访问节点从节点上的文件? 工作空间位于

  • 问题内容: 我想将Linux节点设置为Jenkins主服务器的从服务器。我正在阅读有关为Linux机器进行设置的教程。 通过SSH拥有主启动从属代理 Jenkins具有内置的SSH客户端实现,可用于与远程sshd对话并启动从属代理。这是Unix从属服务器最方便,首选的方法,该方法通常具有现成的sshd。单击管理Jenkins,然后单击管理节点,然后单击“新节点”。在此设置中,您将提供连接信息(从属

  • 我尝试使用IP地址192.168.56.1从我的应用程序连接到主机,但没有成功。我签入了,并且有一个Virtualbox与上述IP连接。有人能帮忙修一下吗?

  • 问题内容: 我是Docker的新手。 我运行了一个10节点的图像,并在运行的容器中克隆了一个存储库,运行了使用文件监视程序启动服务器的应用程序。我需要访问容器内的代码库,并在Windows主机上运行的IDE中打开它。如果完成了,那么我还希望当我在IDE中更改文件时,这些更改会在容器中引起文件监视程序。 任何帮助表示赞赏。谢谢, 问题答案: 您正在寻找的概念称为卷。您需要启动一个容器并在其中安装主机

  • 以下是我的设想: 我使用的是Selenium Grid的概念,我们从Hub(机器1)触发测试脚本执行,并在节点机器(机器2)的chrome浏览器上执行脚本。在我的一个测试脚本中,当我点击导出按钮时,它会在节点机器(即机器2)的默认下载文件夹中下载一个excel文件 问题:在脚本中,我需要进一步读取下载文件的内容,但由于下载的文件位于节点计算机中,脚本无法从中心访问它。 那么,我们如何从Hub机器访