2016-08-10 2 views
12

다른 파이프 라인 스크립트에서 파이프 라인 스크립트를로드 할 때 두 파이프 라인은 동일한 노드에서 실행되지 않습니다. 첫 번째 파이프 라인은 마스터 노드에서 실행되고 두 번째 파이프 라인은 슬레이브 노드에서 실행됩니다. 저장소가 자동으로 할 때 폴링 가도록 (듯이)같은 젠킨스 노드에서 다른 그루비 스크립트를로드하는 방법은 무엇입니까?

내 작업의
  • Poll SCM 옵션을 자신의 해당 망할 놈의 repo URL을 정의 :이 방법으로 많은 일을 위해 Pipeline Script from SCM 옵션 젠킨스 파이프 라인을 사용하고

    내 코드가 변경되었습니다 (기본 작업 사용).

  • 각 작업은 리포지토리의 루트에 Jenkinsfile을 간단하게 정의하고 파이프 라인 스크립트는 기본적으로 더 일반적인 파이프 라인을로드하는 것 외에는 아무것도 수행하지 않습니다.

예 : :

node { 
    // --- Load the generic pipeline --- 
    checkout scm: [$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'http://github/owner/pipeline-repo.git']]] 
    load 'common-pipeline.groovy' 
}() 

공통 pipeline.groovy 파이프 라인은, 예를 들어, 해제 또는 아티팩트를 배포, 같은 건물로 실제 물건을한다 :

{ -> 
    node() { 
     def functions = load 'common/functions.groovy' 

     functions.build() 
     functions.release() 
     functions.deploy() 
    } 
} 

지금 나는 그러나 내가 한 번 그렇게하고 싶습니다, 정말 수동으로 처리 할 수 ​​싶지 않기 때문에 그래서 모두 파이프 라인 node("master") 또는 node("remote")이 각 작업에 대해 노드를 강제로하지 않을 특정 노드의 첫 번째 파이프 라인 실행 (마스터, slave3SLAVE1, slave2, 중), 그렇지 않으면 내 실제 Git 저장소의 코드가 서로를 사용할 수 없기 때문에 두 번째 /로드 파이프 라인은, 동일한 노드에서 실행됩니다 노드의 작업 공간 ...

load 단계를 사용할 때 두 번째 파이프 라인을 첫 번째 노드와 동일한 노드에서 실행하거나 인수를 전달하도록 지정할 수있는 방법이 있습니까?

답변

1

두 번째 파이프 라인에 대해 매개 변수화 된 작업을 만들고이 매개 변수를 사용하여 두 번째 작업을 트리거 할 때 노드를 제어 할 수 있습니다.

두 번째 파이프 라인은 다음과 같이 보일 것이다 :

node(runhereParam) { 

} 
+0

나는이 내 문제를 해결 거 어떻게 표시되지 않는 이유는 무엇입니까? 첫째, 별도의 트리거 된 작업을 원하지 않습니다. 이로 인해 동시성 문제가 발생할 수 있습니다 (동시에 실행되는 10 개의 서비스가 두 번째 매개 변수화 된 작업이 순차적으로 실행될 때까지 기다려야 할 것입니다). 그래서 파이프 라인을 사용합니다. 서로 다른 작업에서 동일한 코드를 실행할 수 있어야합니다. 둘째, 솔루션을 사용하더라도 두 번째 작업에 대해 매개 변수 'runhereParam'을 어디에서 얻을 수 있습니까? 동일한 노드에서 실행하려면 내 파이프 라인의 두 부분이 필요합니다! – Pom12

2

어떻게 체크 아웃 후 스크립트로드?

예를 들어, 이전에 작업 공간을 보관 한 약

stash includes: '**', name: "source" 

하고 다른 노드를 unstash() {} 섹션

예컨대 unstash "source"

작업 공간을 정리하는 것을 잊지 마십시오가 다른 노드에서 사용할 수 그런 식으로

또는 방법 너무 체크 아웃에 대한 논리를 포함하는 공통 기능을 만드는 방법에 대한 (하지만 어쩌면 분지를 매개 변수로 전달할 수도 있습니다). 그런 다음 Jenkins 파일에서 node() {}를 삭제하고 공유 groovy 스크립트에서 node() {} 항목 만 사용할 수 있습니까?

Jenkinsfile

load 'common-pipeline.groovy' 
createWorlflow("*/master") 

공통 pipeline.groovy :

def createWorkflow(branches){ 
node() { 
     def functions = load 'common/functions.groovy' 
     functions.checkout(branches) 
     functions.build() 
     functions.release() 
     functions.deploy() 
    } 
} 
+0

Stash/Unstash는 좋은 생각이었습니다. 불행하게도 저는'common-pipeline' 클로저를 사용할 수 없습니다. 일반적인 명령을 실행하기 전에로드 명령이 실패합니다 ... 두 번째 스크립트를 함수로로드하는 것도 좋은 생각입니다 두 단계 모두 동일한 노드에서 실행되도록 보장 할 것이지만'createWorkflow' 함수 내부에서 체크 아웃한다는 것은 체크 아웃 단계를 복제한다는 것을 의미합니다 (이미 'Poll SCM' 구성으로 젠킨스에 의해 수행됨) ... 나는 귀하의 두 솔루션을 결합하려고 : 함수를 호출하고로드 된 함수에서 내 초기 작업 공간을 unstashing ... – Pom12

+0

실제로 파이프 라인 코드가 실행될 때 실제로 (잠재적으로)'Poll SCM' 구성에서 코드 체크 아웃을 숨길 수 없다. 다른 노드에서 코드를 실행하고'Jenkins Poll SCM' 실행보다 위의 컨트롤이 없습니다 ... – Pom12

관련 문제