2017-02-17 1 views
2

git 저장소에서 Jenkinsfile을로드하는 파이프 라인 작업이 있습니다. 내 Jenkinsfile은 다음과 같습니다Jenkins 공유 라이브러리 컨텍스트

#!groovy 
@Library('global-utils-lib') _ 
node("mvn") { 
    stage('build') { 
     checkout scm 
    } 

    stage('merge-request'){ 
     mergeRequest() 
    } 
} 

글로벌 유틸-lib 디렉토리 구조 다음

vars/mergeRequest.groovy 

mergeRequest.groovy와 다른 자식의 repo에서 글로벌 파이프 라인 라이브러리에서로드 라이브러리를 공유 :

def call() { 
    sh "ip addr" 
    def workspacePath = env.WORKSPACE 
    new File(workspacePath + "/file.txt").text 
} 

도커 컨테이너 (도커 플러그인)에 대해 작업이 실행됩니다.

이 작업을 실행하면 도커 컨테이너가 올바르게 준비되고 scm이 다운로드되지만 FileNotFoundException이 발생합니다. 이되지 슬레이브 마스터 젠킨스에 대해 실행되는 공유 라이브러리에서 코드를 다음과 같습니다

  • 발표 IP 나는 마스터에서 SCM에 올바른 경로를 통과 할 때
  • 파일이 제대로로드 마스터에서 제공

슬레이브에 대해 라이브러리 코드를 실행하려면 어떻게해야합니까? 내가 누락 된 것?

+0

나에게 잘 어울리는데, 나에게 묻는다면 작동해야한다. gpl의 버그 일 수있다 ... –

답변

3

기존 파이프 라인 단계를 사용하는 대신 new File() 같은 것을 시도하고 수행하는 것은 일반적으로 좋지 않습니다.

귀하의 파이프 라인 스크립트는 Jenkins 마스터에 의해 해석되어 실행되므로, 귀하가 예상 한대로 File API를 사용하려는 시도가 예상대로 작동하지 않습니다.

파이프 라인 단계를 준수하면 파이프 라인이 내구성 (즉 재시작 됨), 일시 중지 가능하며 실행 스레드를 차단하지 않아 병렬 단계가 작동하지 않도록 할 수 있습니다.

이 경우 기존의 readFile 단계를 사용할 수 있습니다.

Docker Plugin이 Pipeline과 얼마나 잘 상호 작용하는지 알지 못합니다. (투명해야한다고 생각 하긴하지만) "mvn"레이블을 가진 에이전트를 모르고 있거나 공유 라이브러리 외부에서이를 재현 할 수 있는지 여부는 모르겠습니다. , 귀하의 sh 단계가 마스터에서 실행중인 것처럼 보이는 이유가 명확하지 않습니다.

Docker Pipeline Plugin은 파이프 라인 용으로 명시 적으로 설계되어 더 나은 결과를 얻을 수 있습니다.

관련 문제