성공으로 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.