7

我正在尝试使用 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
    }
}
4

1 回答 1

5

这是管道脚本的规范。它写在教程中。

  • readFilestep 从工作区加载一个文本文件并返回它的内容(不要尝试使用java.io.File方法——这些将引用运行 Jenkins 的 master 上的文件,而不是当前工作区中的文件)

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

  • fileExists在不加载文件的情况下检查文件是否存在的步骤。

您可以在节点中使用这些 Jenkins 步骤,而不是java.io.File如下java.nio.file.Files所示。

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

stage('One') 
{
    node ('slave')
    {
        bat returnStatus: true, script: 'set'
        println fileExists(slavePath)     // Should be true
        println fileExists(masterPath)    // Should be false
    }
    node ('master')
    {
        bat returnStatus: true, script: 'set'
        println fileExists(slavePath)     // false
        println fileExists(masterPath)    // true
    }
}
于 2016-11-01T12:31:39.613 回答