쉘 실행이 실패해도 jenkins 빌드에 실패하지 마십시오.
빌드 프로세스의 일부로 쉘 실행 단계로 git 커밋을 실행하고 있습니다. 그러나 작업 영역에 변경 사항이 없으면 Jenkins가 빌드에 실패합니다. 커밋 할 변경 사항이 없을 때 git이 오류 코드를 반환하기 때문입니다. 이 경우 빌드를 중단하거나 불안정한 것으로 표시하고 싶습니다. 어떤 아이디어?
명령 이 실패 할 때 추가 실행을 중지하려면 :
command || exit 0
명령 이 실패 할 때 실행을 계속하려면 :
command || true
Jenkins는 /bin/sh -xe
기본적으로 셸 빌드 단계를 실행 합니다. -x
실행 된 모든 명령을 인쇄하는 것을 의미합니다. -e
스크립트의 명령 중 하나라도 실패하면 실패하고 종료하는 것을 의미합니다.
따라서 귀하의 경우에 일어난 일은 1로 git 명령 종료이며 기본 -e
매개 변수로 인해 셸은 0이 아닌 종료 코드를 선택하고 나머지 스크립트를 무시하고 단계를 실패로 표시합니다. 여기에 빌드 단계 스크립트를 게시 할 수 있으면 확인할 수 있습니다.
이 경우 #!/bin/sh
스크립트가 옵션없이 실행되도록 할 수 있습니다 . 또는 set +e
빌드 단계에서 이와 유사한 작업을 수행 하여이 동작을 재정의합니다.
편집 됨 : 주목할 또 다른 점은 셸 스크립트 의 마지막 명령 이 0이 아닌 코드를 반환 하는 경우이 설정을 사용해도 전체 빌드 단계가 여전히 실패로 표시된다는 것입니다. 이 경우 echo
이를 방지하기 위해 끝에 명령을 입력 할 수 있습니다 .
푸시 할 항목이 없으면 git이 종료 상태 1을 반환합니다. Execute shell build step은 각각 실패로 표시됩니다. OR 문을 사용할 수 있습니다 || (이중 파이프).
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
즉, 첫 번째가 실패하면 두 번째 인수를 실행합니다 (반환 된 종료 상태> 0). 두 번째 명령은 항상 0을 반환합니다. 푸시 할 항목이 없으면 (종료 상태 1-> 두 번째 명령 실행) echo는 0을 반환하고 빌드 단계를 계속합니다.
빌드를 불안정한 것으로 표시하려면 빌드 후 단계 Jenkins Text Finder를 사용할 수 있습니다. 콘솔 출력을 통해 패턴 (에코)을 일치시키고 빌드를 불안정한 것으로 표시 할 수 있습니다.
Jenkins에게 실패하지 않도록 알리는 또 다른 부드러운 방법이 있습니다. 빌드 단계에서 커밋을 분리하고 셸이 실패하지 않도록 설정할 수 있습니다.
set +e
git commit -m "Bla."
set -e
Jenkins는 단계의 반환 값으로 단계의 성공 / 실패를 결정합니다. 쉘의 경우 마지막 값을 반환해야합니다. Windows CMD 및 (POSIX) Bash 셸의 exit 0
경우 마지막 명령 으로 사용하여 반환 값을 수동으로 설정할 수 있어야합니다 .
여기에있는 답변을 사용하여이 작업을 수행 할 수있었습니다.
git diff --quiet --exit-code --cached || git commit -m 'bla'
제목의 (보다 일반적인) 질문-Jenkins가 실패하는 것을 방지하기 위해 종료 코드 1을 보지 못하게 할 수 있습니다. ping의 예 :
bash -c "ping 1.2.3.9999 -c 1; exit 0"
이제 예를 들어 ping의 출력을 얻을 수 있습니다.
output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`
물론 대신 ping ...
당신 은를 포함한 모든 명령을 사용할 수 있습니다 git commit
.
Text-finder 플러그인을 사용할 수 있습니다 . 출력 콘솔에서 원하는 표현식을 확인한 다음 빌드를 Unstable
.
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
returnStatus : true 속성을 포함하면 셸 반환이 무시됩니다.
여러 쉘 명령의 경우 다음을 추가하여 실패를 무시합니다.
set +e commands true
이 명령을 쉘 블록에 넣으면 :
false
true
빌드가 실패로 표시되므로 (0이 아닌 종료 코드 1 개 이상) 추가 (+ e 설정)하여 무시할 수 있습니다.
set +e
false
true
실패하지 않을 것입니다. 그러나 이것은 (set + e)가있는 경우에도 실패합니다.
set +e
false
마지막 셸 명령은 0으로 종료해야하기 때문입니다.
다음 은 변경 사항이있는 경우에만 커밋 하여 수은 에 적용됩니다. 따라서 커밋이 실패하는 경우에만 빌드가 실패합니다.
hg id | grep "+" || exit 0
hg commit -m "scheduled commit"
몇 가지 팁이있는 또 다른 답변은 누군가에게 도움이 될 수 있습니다.
다음 규칙으로 명령을 분리해야합니다 .
command1 && command2-command1이 성공한 경우에만 command2가 실행됨을 의미합니다.
command1 ; command2-command1의 결과에도 불구하고 command 2가 실행됨을 의미합니다.
예를 들면 :
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests
성공적으로 실행됩니다 set -e
및 echo 0
명령 경우는 gmake test
다음과 같은 코드를 냈다 동안, (당신의 테스트가 실패) 실패 :
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests
약간의 잘못 및 명령 set -e
과 echo 0
에서가 && gmake test && set -e && echo 0
으로 건너 뜁니다 println run_tests
실패했기 때문에, 문 gmake test
젠킨스 빌드를 중단됩니다. 해결 방법으로로 전환 할 수 returnStatus:true
있지만 명령의 출력을 놓칠 수 있습니다.
참고 URL : https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails
'Programming' 카테고리의 다른 글
자바 스크립트 개체의 첫 번째 키 이름 가져 오기 (0) | 2020.08.10 |
---|---|
힘내 두 개의 로컬 브랜치를 병합 (0) | 2020.08.10 |
지리적 URI 인 텐트로 시작된지도에 마커를 표시하려면 어떻게하나요? (0) | 2020.08.10 |
초점에 주황색 윤곽선 강조 표시 비활성화 (0) | 2020.08.10 |
멀티 기가 바이트 텍스트 파일을 편집하는 방법은 무엇입니까? (0) | 2020.08.10 |