내부에서 다른 작업의 빌드를 어떻게 트리거 할 수 Jenkinsfile
있습니까?
이 작업은 동일한 github 조직 의 다른 저장소 이며 이미 자체 Jenkins 파일이있는 저장소라고 가정 합니다.
또한 지점 이름이 마스터 인 경우에만 로컬 분기의 다운 스트림 빌드를 트리거하는 것이 의미가 없으므로이 작업을 수행하고 싶습니다.
최신 정보:
stage 'test-downstream'
node {
def job = build job: 'some-downtream-job-name'
}
여전히 실행되면 오류가 발생합니다.
some-downtream-job-name이라는 매개 변수화 된 작업이 없습니다.
이 작업이 jenkins에 존재하고 현재 작업 폴더와 동일한 조직 폴더에 있다고 확신합니다. 그것은 또 다른 직업이다 Jenkinsfile
.
이 질문은 GitHub 조직의 각 리포지토리 및 브랜치에 대한 작업을 자동 생성하고 유지 관리 하는 GitHub 조직 플러그인 에만 해당됩니다 .
답변
우선, build
단계 를 감싸는 것은 실행기 슬롯을 낭비 node
합니다. 업스트림 유언 집행 인은 아무 이유없이 유휴 상태입니다.
둘째, 다중 분기 프로젝트에서 환경 변수 BRANCH_NAME
를 사용하여 현재 분기에서 논리를 조건부로 만들 수 있습니다 .
셋째, job
매개 변수는 절대 또는 상대 작업 이름을 사용합니다. 경로 규정없이 이름을 지정하면 동일한 폴더에있는 다른 작업을 참조하게되는데, 이는 다중 분기 프로젝트의 경우 동일한 저장소의 다른 분기를 의미합니다.
따라서 당신이 쓰는 것은 아마도
if (env.BRANCH_NAME == 'master') {
build '../other-repo/master'
}
답변
위에서 언급 한 답변 외에도 두 번째 파이프 라인에 전달 된 간단한 매개 변수로 작업을 시작하고 https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow 에서 답변을 찾았습니다 .
그래서 나는 사용했다 :
stage ('Starting ART job') {
build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
답변
build
파이프 라인 의 명령 은 jenkins에서 다른 작업을 트리거하기위한 것입니다.
작업은 Jenkins에 존재해야하며 매개 변수화 될 수 있습니다. 지점 은 git에서 읽을 수 있다고 생각합니다.
답변
Jenkins Pipeline 의 build job
단계를 사용할 수 있습니다 (최소 Jenkins 요구 사항 : 2.130).
build
단계에 대한 전체 API는 다음과 같습니다 . https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
사용 방법 build
:
job
: 빌드 할 다운 스트림 작업의 이름입니다. 다른 파이프 라인 작업 일 수도 있지만 일반적으로 자유형이나 다른 프로젝트 일 수도 있습니다.- 작업 이이 업스트림 파이프 라인 작업 과 동일한 폴더 에 있으면 간단한 이름을 사용하십시오 .
- 대신 사용할 수있는 상대 경로 등을
../sister-folder/downstream
- 또는 다음 과 같은 절대 경로를 사용할 수 있습니다
/top-level-folder/nested-folder/downstream
브랜치를 매개 변수로 사용하여 다른 작업 트리거
우리 회사에는 많은 지점에 “/”가 포함되어 있습니다. “/”의 인스턴스를 “% 2F”로 바꾸어야합니다 (작업 URL에 표시됨).
이 예에서는 상대 경로를 사용하고 있습니다
stage('Trigger Branch Build') {
steps {
script {
echo "Triggering job for branch ${env.BRANCH_NAME}"
BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
}
}
}
빌드 번호를 매개 변수로 사용하여 다른 작업 트리거
build job: 'your-job-name',
parameters: [
string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
]
많은 작업을 병렬로 트리거
출처 : https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/
Parallel에 대한 자세한 정보는 https://jenkins.io/doc/book/pipeline/syntax/#parallel
stage ('Trigger Builds In Parallel') {
steps {
// Freestyle build trigger calls a list of jobs
// Pipeline build() step only calls one job
// To run all three jobs in parallel, we use "parallel" step
// https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
parallel (
linux: {
build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
mac: {
build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
windows: {
build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
failFast: false)
}
}
또는 대안으로 :
stage('Build A and B') {
failFast true
parallel {
stage('Build A') {
steps {
build job: "/project/A/${env.BRANCH}", wait: true
}
}
stage('Build B') {
steps {
build job: "/project/B/${env.BRANCH}", wait: true
}
}
}
}
답변
jenkins 파일에서 다른 작업을 트리거하려면 해당 작업에 빌드 작업 플러그인 을 사용하십시오 . 병렬, 노드 및 에이전트 옵션 및 외부 작업 트리거 단계와 같은 다양한 로직을 실행에 추가 할 수 있습니다. 나는 그것을 읽기 쉬운 요리 책 예제를 주었다.
1. 조건부 예제를 사용하여 jenkins 파일에서 외부 작업을 트리거하는 예제 :
if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
]
}
2. 조건을 사용하여 jenkins 파일에서 여러 작업을 트리거하는 예 :
def jobs =[
'job1Title'{
if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
]
}
},
'job2Title'{
if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam3',value: 'valueOfParam3')
booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
]
}
}