2016-09-28 3 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

문서에서 그 내용을 놓쳤습니다. 따라서 올바르게 이해한다면 작업 공간의 내부와 외부의 마스터 노드와 슬레이브 노드에서 작동하는 단일 메서드를 사용하면 Groovy를 사용하여 PowerShell 테스트 파일을 실행하여 대답을 반환하는 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

관련 문제