Jenkins管道和java.nio.file.*方法的问题

gac*_*rdo 6 java groovy jenkins java.nio.file jenkins-pipeline

我试图使用java.nio.file.*中的方法在Jenkins管道中执行一些基本的文件操作.无论代码存在于哪个节点块,代码都在主节点上执行.在管道中,我已经验证了各种节点块是正确的 - 它们唯一地标识特定节点.但是,pathExists(以及移动,复制或删除文件的其他代码)始终在主节点上执行.任何想法发生了什么或如何解决它?

import java.nio.file.*

String slavePath = 'C:\\Something\\only\\on\\slave\\node'
String masterPath = 'D:\\Something\\only\\on\\master\\node'

def pathExists (String pathName)
{
    def myPath = new File(pathName)
    return (myPath.exists()) 
}

stage('One') 
{
    node ('slave')
    {
        bat returnStatus: true, script: 'set'
        println (pathExists(slavePath))     // Should be true but is false.
        println (pathExists(masterPath))    // Should be false but is true.
    }
    node ('master')
    {
        bat returnStatus: true, script: 'set'
        println (pathExists(slavePath))     // false
        println (pathExists(masterPath))    // true
    }
}
Run Code Online (Sandbox Code Playgroud)

ara*_*sio 6

这是管道脚本的规范。教程里有写。

\n\n
\n
    \n
  • readFile步骤从工作区加载文本文件并返回其内容(不要尝试使用java.io.File方法 \xe2\x80\x94 这些将引用 Jenkins 运行的主控器上的文件,而不是当前工作区中的文件)

  • \n
  • 还有一个writeFile步骤是将内容保存到工作区中的文本文件\n

  • \n
  • fileExists步骤检查文件是否存在而不加载它。

  • \n
\n
\n\n

您可以在节点中使用这些 Jenkins 步骤来代替java.io.Filejava.nio.file.Files如下所示。

\n\n
String slavePath = \'C:\\\\Something\\\\only\\\\on\\\\slave\\\\node\'\nString masterPath = \'D:\\\\Something\\\\only\\\\on\\\\master\\\\node\'\n\nstage(\'One\') \n{\n    node (\'slave\')\n    {\n        bat returnStatus: true, script: \'set\'\n        println fileExists(slavePath)     // Should be true\n        println fileExists(masterPath)    // Should be false\n    }\n    node (\'master\')\n    {\n        bat returnStatus: true, script: \'set\'\n        println fileExists(slavePath)     // false\n        println fileExists(masterPath)    // true\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n