Programming

쉘 실행이 실패해도 jenkins 빌드에 실패하지 마십시오.

procodes 2020. 8. 10. 08:23
반응형

쉘 실행이 실패해도 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은 오류없이 아무것도 커밋하지 않는 방법?

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 -eecho 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 -eecho 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

반응형