2016-09-28 45 views
6

我想用java.nio.file。*中的方法在Jenkins管道中執行一些基本的文件操作。無論存在代碼的節點塊如何,代碼都會在主節點上執行。在流水線中,我已經驗證了各種節點塊是正確的 - 它們唯一地標識特定的節點。但是,pathExists(以及移動,複製或刪除文件的其他代碼)始終在主節點上執行。任何想法發生了什麼或如何解決它?Jenkins管道和java.nio.file。*方法問題

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

這是管道腳本的規範。它寫在tutorial

  • readFile一步從工作區加載一個文本文件,並返回其 內容(不要嘗試使用java.io.File方法 - 這些將涉及 文件在哪裏詹金斯正在運行的主,而不是在當前 工作區)

  • 還有一個writeFile一步將內容保存到一個文本文件中 工作區

  • fileExists步,檢查文件是否存在,而無需加載它。

您可以使用一個節點,而不是java.io.Filejava.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 
    } 
} 
+0

我錯過了在文檔中。因此,如果我理解正確,在Windows上的工作空間內部和外部的主節點和從節點上使用單一方法會涉及使用Groovy運行bat文件來返回答案,可能通過運行PowerShell Test-File? – gaccardo

+0

嗯我沒有明白你的意思。是不是與java.io.File問題無關的另一個問題?我在答案中增加了一個例子,它會按照您的預期運行以防萬一。 – arasio

+0

根據[文檔](https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-fileexists-code-verify-if-file-exists-in-workspace),僅fileExists適用於作業工作區中的文件。當我最初嘗試時,情況就是如此。即使文件不在工作區中,運行示例也能正常工作。我已經用Jenkins 2.24和2.28驗證了這一點。 – gaccardo