성공으로 Jenkins Pipeline 작업을 조기에 종료하는 가장 확실한 방법은 무엇입니까?


55

제공된 값 중 하나가 이전 값과 일치하지 않는 한 파일을 작성하는 작업이 있습니다. 중지하거나, 작업을 종료 젠킨스에서 가장 깨끗한 방법은 무엇입니까 없이 이되는가 FAILED? 종료가 올바른 동작이므로 빌드를 표시하고 싶습니다 SUCCESS.

그것은 if 문으로 끝날 것입니다;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

어떻게 든 성공적인 빌드로 표시 될 수 없다면 오류 코드를 던지고 싶지 않습니다.


1
그냥 exit 0...
Tensibai

나는 그 일이 실패라고 생각했다? 내가 틀렸고 문서를 보여줄 수 있다면 그것을 기꺼이 받아 들일 것입니다
Alex

글쎄, 그냥 bash 스크립트, 출구 0은 성공을 의미하고, 0이 아닌 출구는 실패를 의미합니다 ...
Tensibai

이것은 bash 스크립트 내에 없으며 파이프 라인 작업 자체이므로 Groovy입니다. 그게 변합니까?
Alex

그루비에서는 return 0예외를 던지지 않는 그루비 코드의 모든 끝에서 모두를 시도하려고합니다 . jenkins 2에 더 많은 배경 지식을 가진 사람이 확인 또는 확인하도록하겠습니다
Tensibai

답변:


45

알아 냈습니다. 단계 이외의 단계 (그렇지 않으면 성공으로 특정 단계를 종료합니다)는 다음과 같습니다.

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return 실행중인 스테이지 또는 노드를 중지하므로 스테이지 외부에서 실행하는 것이 중요하지만 currentBuild.result실패를 방지 하는 설정 입니다.


그냥 돌아 가면 빌드가 회색으로 표시되고 결과가 없어야합니다. 그래서 실패한 빌드와 동일하지 않습니다.
drewish

1
나머지 모든 단계를 어떻게 돌아가고 건너 뛰나요?
Jess Bowers

1
@JessBowers 스 니펫을 넣는 위치가 중요합니다. 스테이지 수준이 아닌 노드 수준에서 수행하면 전체 작업이 완료됩니다.
Alex

4
이 스크립트는 선언 된 것이 아니라 스크립팅 된 파이프 라인에서만 작동합니다.
kagarlickij

@kagarlickij-이 답변을 작성할 때 정확하고 선언적인 파이프 라인이 존재하지 않았습니다!
Alex

10

오류를 사용하여 현재 단계를 종료 할 수도 있습니다. 그러면 현재 단계 계층 구조 및 이와 유사한 항목을 고려할 필요가 없습니다.

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

그러나 오류가 단계 내에서 발생하면 빨간색 단계로 이어질 수 있습니다.

여기에 이미지 설명을 입력하십시오

요구 사항, 사용하려는 방법에 따라 다릅니다.


이런 식으로한다면, RuntimeException모든 예외를 잡아 내고 깃발을 점검 할 필요없이 던지기 위한 새로운 서브 클래스를 만드십시오
Michael Mrozek

1

솔직히 exit 명령을 사용할 필요는 없지만 조건부 BuildStep 플러그인 이있어 동일한 최종 결과 (실행되지 않는 코드)를 얻을 수 있습니다.

나는 아직 이것에 맞서지 않았으므로 플러그인을 사용하지 않았습니다.

Jenkins의이 이전 스택 오버플로 게시물에 나와있는 조건부도 있습니다 . Jenkins 파이프 라인 조건부 단계 / 단계


1
귀하의 답변이 유효한 것 같지만 (다른 해결 방법을 찾은 후에도 확인하지 않은 경우), "정직하게 종료하지 않아야합니다"라고 생각하는 것이 좋습니다. 분명히 이러한 방법의 존재는 때때로 종료해야한다는 것을 의미합니다.
Alex

무엇을 제안 하시겠습니까? 결말로 옮기시겠습니까? 한정자를 "일반적으로"추가 하시겠습니까? '피드백'을 제공했지만 의도 나 조치를 쉽게 설명 할 수는 없습니다.
MrMesees

잠깐만 질문입니까? 그렇다면 TBH는 종료하면 안된다는 말을 듣고 싶지 않지만 종료를 제공한다고 제안한 방법은 코드 실행을 우회합니다. 직접 내 위치를 지원합니다.
MrMesees

1
Ahh, 나는 당신이 당신의 말을 "직장을 끝내기 위해 무언가를하는 것이 나쁘다"라고 잘못 해석했다고 생각합니다 exit.
Alex

3
나는 언어가 특히 :) 인터넷에, 변덕스러운 짐승, 그것은 명확하게, 필요가 전혀 사과하지 수 있도록 노력했습니다
MrMesees

0

Executor.interrupt(Result)방법은 빌드를 조기에 중단 하고 성공으로 표시 하는 가장 깨끗하고 직접적인 방법 입니다.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

찬성 :

  • 스크립트 된 파이프 라인뿐만 아니라 선언적인 파이프 라인에서도 작동합니다.
  • 시도 / 캐치 또는 예외 처리가 없습니다.
  • 호출 단계 및 모든 후속 단계를 UI에서 녹색 / 통과로 표시합니다.

단점 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.