在Pipeline中将文件从Jenkins主节点复制到从节点

6

我在Jenkins上有一些Windows从机,因此我需要在流水线中将文件复制到它们上面。我听说过Copy To Slave和Copy Artifact插件,但它们没有流水线语法手册。所以我不知道如何在流水线中使用它们。

直接复制不起作用。

def inputFile = input message: 'Upload file', parameters: [file(name: 'parameters.xml')]
new hudson.FilePath(new File("${ENV:WORKSPACE}\\parameters.xml")).copyFrom(inputFile)

这段代码返回了一个错误:

Caused: java.io.IOException: Failed to copy /var/lib/jenkins/jobs/_dev/jobs/(TEST)job/builds/107/parameters.xml to d:\Jenkins\workspace\_dev\(TEST)job\parameters.xml

在Jenkins Pipeline中,有没有办法将文件从主服务器复制到从服务器?
4个回答

5
据我理解,copyFrom 命令是在您的Windows节点上执行的,因此源路径不可访问。
我认为你需要研究一下 stash/unstash 步骤(Jenkins Pipeline: Basic Steps),它们可以跨不同的节点工作。同时这个例子可能会有所帮助。

非常感谢。这很有帮助。 - Pavel Polushin
stash/unstash 只在每个作业运行时起作用,也就是说,“stashed” 数据不会在作业运行后持久存在。 - Chris F

1
Pipeline DSL上下文在master节点上运行,即使您在管道中编写了node('someAgentName')
  • 尝试使用stash/unstash,但对于大型文件不太好。
  • 尝试External Workspace Manager Plugin。它具有管道步骤,适用于大型文件。
  • 尝试使用中间存储。 archive()sh("wget $url")将会很有帮助。

具体来说,stash 对于大文件有什么不好的影响?你如何定义“大文件”?我也在 cloudbees 文档中读到过这个问题,但他们没有回答我上面的问题。到底是什么原因,只是传输速度慢,还是有 bug?只是好奇为什么我不能将一个 150MB 的文件存储在主服务器上,以便在后续阶段从从代理中取消存储。似乎比使用外部工作区管理器简单得多。 - timblaktu
2
抱歉,显然我没有仔细阅读文档:stash步骤管道参考说:“这是因为存储的文件被归档在压缩的TAR中,对于大文件,这需要相当多的主机资源,特别是CPU时间。没有硬性的存储大小限制,但在5-100 MB之间,您应该考虑其他选择。” - timblaktu

0
如果需求是将可执行文件复制到测试从机并发布测试结果,则无需使用Copy to Slave插件即可轻松完成。
每个测试从机上都应创建一个共享文件夹(普通Windows共享文件夹)。
构建后:构建脚本将可执行文件复制到每个从机上的共享目录中。使用copy命令的简单批处理脚本就足够了。
stage ('Copy to slaves') {
    steps {
        bat 'call "copy-to-slave.bat"'
    }
}

测试期间:测试脚本将可执行文件复制到另一个目录并运行。

测试后:可以使用“发布Robot Framework测试结果”后构建操作来报告测试结果。无需先将测试结果文件复制回主服务器。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接