GitHub Org Plugin을 사용하여 jenkins 파이프 라인 (jenkinsfile)에서 다른 작업을 어떻게 트리거 할 수 있습니까?


142

내부에서 다른 작업의 빌드를 어떻게 트리거 할 수 Jenkinsfile있습니까?

이 작업은 동일한 github 조직 의 다른 저장소 이며 이미 자체 Jenkins 파일이있는 저장소라고 가정 합니다.

또한 지점 이름이 마스터 인 경우에만 로컬 분기의 다운 스트림 빌드를 트리거하는 것이 의미가 없으므로이 작업을 수행하고 싶습니다.

최신 정보:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

여전히 실행되면 오류가 발생합니다.

some-downtream-job-name이라는 매개 변수화 된 작업이 없습니다.

이 작업이 jenkins에 존재하고 현재 작업 폴더와 동일한 조직 폴더에 있다고 확신합니다. 그것은 또 다른 직업이다 Jenkinsfile.

이 질문은 GitHub 조직의 각 리포지토리 및 브랜치에 대한 작업을 자동 생성하고 유지 관리 하는 GitHub 조직 플러그인 에만 해당됩니다 .

답변:


131

우선, build단계 를 감싸는 것은 실행기 슬롯을 낭비 node합니다. 업스트림 유언 집행 인은 아무 이유없이 유휴 상태입니다.

둘째, 다중 분기 프로젝트에서 환경 변수 BRANCH_NAME를 사용하여 현재 분기에서 논리를 조건부로 만들 수 있습니다 .

셋째, job매개 변수는 절대 또는 상대 작업 이름을 사용합니다. 경로 규정없이 이름을 지정하면 동일한 폴더에있는 다른 작업을 참조하게되는데, 이는 다중 분기 프로젝트의 경우 동일한 저장소의 다른 분기를 의미합니다.

따라서 당신이 쓰는 것은 아마도

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
감사! 변경 사항으로
인해이

48
니펫 생성기 확인 :build job: '../other-repo/master', wait: false
Jesse Glick

3
동적 브랜치 이름으로 빌드 단계를 호출하는 방법이 있습니까? Jenkins 환경 변수가 Multibranch 프로젝트를 실행하는 분기와 관련된 build job: '../other-repo/$BRANCH_NAME'위치 와 같은 것 $BRANCH_NAME입니까?
msteppe91

2
${BRANCH_NAME}환경 변수로 사용 가능한 경우 간단한 문자열 대체가 수행됩니다. 문자열을 인용 하려면 "에서 로 전환하십시오 '. 예 :build job: "../other-repo/${BRANCH_NAME}"
Cinderhaze


123

위에서 언급 한 답변 외에도 두 번째 파이프 라인에 전달 된 간단한 매개 변수로 작업을 시작하고 https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow 에서 답변을 찾았습니다 .

그래서 나는 사용했다 :

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
빌드 작업은 한 단계에 포함되어야합니다 (버전 0.5로 시작)
rhoerbe

5
build명령에 의해 호출 된 Jenkins 작업의 BUILD_NUMBER가 리턴 되었습니까? 다음 단계 중 하나에서 BUILD_NUMBER에 액세스하는 방법은 무엇입니까? 그 명령이 어디에 기록되어 있는지 아는 사람이 있습니까?
user909481

4
그것은이다 build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]에서, 요즘 jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży

그러나이 매개 변수를 사용하는 방법은 2 차 직업
Gentle

2
흥미롭게도 build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] 저에게는 효과가 없었지만 build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] 일했습니다.
Alberto C

24

build파이프 라인 의 명령 은 jenkins에서 다른 작업을 트리거하기위한 것입니다.

github의 예

작업은 Jenkins에 존재해야하며 매개 변수화 될 수 있습니다. 지점 은 git에서 읽을 수 있다고 생각합니다.


3
추가를 시도 build job: 'jobname했지만이 오류가 발생 No parameterized job named jobname found하며이 이름을 가진 작업이 조직 폴더에 동일한 수준으로 존재 함을 보증 할 수 있습니다.
sorin

1
예, 작업이 있지만 해당 작업이 매개 변수화되지 않았습니다. 그래도 GitHub 조직 플러그인으로 만든 작업을 매개 변수화하는 방법을 이해하려고합니다
yiwen

6
작업 이름 형식은 다음과 같습니다.build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja

2
@SahilAhuja 그것은 완전히 임의적이며 Jenkins 레이아웃을 기반으로하며 절대 경로를 사용하려면로 시작해야합니다 /. 상대 경로는 괜찮습니다. 소린의 문제는 아마도 직무 호출 build이 다중 브랜치 작업 이었기 때문일 것입니다. 이는 같은 작업 jobname의 브랜치를 구축하려고하는 것과 같은 경로를 의미합니다 jobname. ../jobname/branchname대신에 필요합니다
Michael Mrozek

이것은 잘 작동하지만 지정된 분기가 존재하지 않으면 어떻게됩니까?
Jaime Alcántara Arnela

17

Jenkins Pipelinebuild 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
                    }
                }
            }
    }

3

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')
     ]
    }
}

그러나 2nd job
Gentle

2
@부드러운. 전달 된 매개 변수를 params.systemname으로 액세스 할 수 있습니다.
Pankaj Shinde
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.