Jenkins管道中的文件操作

时间:2017-03-29 09:07:07

标签: jenkins groovy jenkins-pipeline

我的管道流程定义为:

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上执行而不是在想要的节点上执行?

在一个阶段执行操作并希望对节点{}域中的文件进行操作会有什么好的解决方法?

2 个答案:

答案 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);
}