2016-09-28 13 views
6

Jenkinsパイプラインでいくつかの基本的なファイル操作を実行するために、java.nio.file。*のメソッドを使用しようとしています。コードが存在するノードブロックに関係なく、コードはマスターノードで実行されます。パイプラインでは、さまざまなノードブロックが正しいことを確認しました。特定のノードを一意に識別します。ただし、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メソッドを使用しようとしないでください - これらはでない、ジェンキンスが実行されているマスターに ファイルを参照します現在 作業領域)

  • ファイルがそれをロードすることなく存在しているかどうかをチェックするために ワークスペース

  • fileExistsステップでテキストファイルにコンテンツを保存するwriteFileステップもあります。

あなたは以下のように代わりに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 
    } 
} 
+0

私はそれを紛失しました。だから私が正しく理解すれば、Windows上のワークスペースの内側と外側のマスターノードとスレーブノードで動作する単一のメソッドを使用すると、Groovyを使用してPowerShell Test-Fileを実行して答えを返すbatファイルを実行する必要があります。 – gaccardo

+0

あなたは何を意味するのか分からなかった。 java.io.Fileの問題と関係のない別の質問ではありませんか?私は私の答えに例を追加しました。これはまさにあなたのために期待通りに動いています。 – arasio

+0

[documentation](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

関連する問題