我的管道流程定义为:
node("linux_label") {
println("hostname".execute().txt)
def filename = "${WORKSPACE}/submoduleinfo.txt"
stage("Submodule info") {
def submoduleString = sh script: "git -C ${WORKSPACE} submodule status > ${filename}", returnStdout: true
}
String fileContents = new File("$filename}").text
operateOnFile(fileContents)
}
在“新文件”中,我会收到错误消息,说明不存在此类文件。经过一些麻烦后我发现主机名打印输出将输出jenkins主服务器而不是工作空间所在的节点“linux_label”。
这是Piepeline应该如何工作,即所有不属于stage / steps / etc的代码都在jenkins master上执行而不是在想要的节点上执行?
在一个阶段执行操作并希望对节点{}域中的文件进行操作会有什么好的解决方法?
答案 0 :(得分:2)
这就是管道的工作原理。您可以使用readFile从工作空间读取文件。由于您只使用文件的内容进行处理,因此可以使用。
来自tutorial:
readFile步骤从工作空间加载文本文件并返回它 内容(不要尝试使用java.io.File方法 - 这些将引用 在Jenkins运行的主服务器上的文件,而不是当前的文件 工作区)。
在我们的一个用例中,我们使用Shared pipeline library添加了一些其他功能。
答案 1 :(得分:0)
试试这个:
if (env['NODE_NAME'].equals("master")) {
return new hudson.FilePath(path);
} else {
return new hudson.FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path);
}