Jenkins 파이프 라인의 조건부 단계 / 단계


90

특정 브랜치를 빌드하는 경우에만 빌드 단계 / 단계를 어떻게 실행합니까?

예를 들어 분기가 호출 된 경우에만 배포 단계를 실행하고 deployment나머지는 모두 그대로 둡니다.

답변:


180

다음은 선언적 파이프 라인 구문에서 동일한 작업을 수행하는 몇 가지 예입니다.

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

더 효과적인 방법-https: //issues.jenkins-ci.org/browse/JENKINS-41187
또한보세요-https: //jenkins.io/doc/book/pipeline/syntax/#when


beforeAgent true조건부 실행 여부를 결정하는 데 git 상태가 필요하지 않은 경우 조건부 실행을 위해 에이전트 회전을 방지하도록 지시문 을 설정할 수 있습니다.

when { beforeAgent true; expression { return isStageConfigured(config) } }

릴리스 게시물문서



새로운 WHEN 조항
REF 업데이트 : https://jenkins.io/blog/2018/04/09/whats-in-declarative

같음-두 값 (문자열, 변수, 숫자, 부울)을 비교하고 같으면 true를 반환합니다. 나는 솔직히 우리가 이것을 더 일찍 추가하는 것을 어떻게 놓쳤는 지 잘 모르겠습니다! not {equals ...} 조합을 사용하여 "not equals"비교를 수행 할 수도 있습니다.

changeRequest-가장 간단한 형식으로이 파이프 라인이 GitHub 풀 요청과 같은 변경 요청을 빌드하는 경우 true를 반환합니다. 또한 "마스터 브랜치에 대한 변경 요청입니까?"라고 질문 할 수 있도록 변경 요청에 대해 더 자세한 검사를 수행 할 수도 있습니다. 그리고 훨씬 더.

buildingTag-파이프 라인이 브랜치 나 특정 커밋 참조가 아닌 SCM의 태그에 대해 실행 중인지 확인하는 간단한 조건입니다.

tag-태그 이름 자체를 확인할 수 있도록하는 buildingTag에 해당하는 더 자세한 내용입니다.


1
빌드 후 작업에 이것을 사용할 수 있습니까?
Doug

1
when{}조건이 거짓으로 평가 되더라도 Jenkins가 지정된 에이전트를 회전시킵니다 . :(
Trejkaz

1
@Trejkaz 당신은 이제 beforeAgent true그것을 피하기 위해 사용할 수 있습니다
Nick Jones

1
실제로 @NickJones beforeAgent는 이제 그 해결 방법입니다.
Trejkaz

45

그냥 사용 if하고 env.BRANCH_NAME, 예를 들면 :

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       

4
무대 전후에 있어야하나요?
Jet

5
단계 전에, 단계가 가지 경우 내부 될 수 있습니다
르지 Krasoń

배치가 실제로 중요한 생각하지 않는다
omu_negru

9
선언적 파이프 라인으로는이 작업을 수행 할 수 없습니다. 선언적 파이프 라인에서 작동합니까? WorkflowScript : 9 : 9 행, 9 열에 단계가 필요합니다. if (env.BRANCH_NAME == "deployment") {WorkflowScript : 8 : 8 행, 5 열에 지정된 단계가 없습니다. 단계 {
pitchblack408

4
이것은 스크립팅 된 파이프 라인에서만 작동합니다. 선언적 파이프 라인의 경우 단계 내에서 스크립트 {}를 사용해야합니다.
Pedro Henrique 19

1

다른 답변에 따르면 병렬 단계 시나리오를 추가하고 있습니다.

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.