[shell] Execute Shell은 Jenkins에서 언제 빌드를 실패로 표시합니까?

이것에 대한 답을 찾는 동안 내가 찾은 공포 이야기 …

좋아, Jenkins가해야 할 모든 작업을 수행하는 .sh 스크립트가 있습니다.

  • SVN에서 소스를 확인합니다.
  • 프로젝트 구축
  • 프로젝트를 배포합니다.
  • 자체 청소

따라서 Jenkins에서는 Execute Shell 명령에서 스크립트를 실행하여 프로젝트를 ‘빌드’하기 만하면됩니다. 스크립트가 실행되었지만 (소스 다운로드, 프로젝트는 빌드 / 배포) 빌드를 실패로 표시합니다. 빌드 단계 ‘셸 실행’이 빌드를 실패로 표시했습니다. 스크립트가 성공적으로 실행 된 경우에도 마찬가지입니다! 다음과 같이 스크립트를 닫아 보았습니다.

  • 출구 0 (여전히 실패로 표시)
  • 출구 1 (예상대로 실패로 표시)
  • 종료 명령이 전혀 없음 (실패로 표시)

Execute Shell은 언제, 어떻게, 왜 내 빌드를 실패로 표시합니까?



답변

먼저 아래의 회색 영역 위로 마우스를 가져갑니다. 대답의 일부는 아니지만 절대적으로 말해야합니다.

자체적으로 “체크 아웃, 빌드, 배포”를 수행하는 쉘 스크립트가있는 경우 Jenkins를 사용하는 이유는 무엇입니까? 당신은 Jenkins의 모든 기능을 앞 지르고 있습니다. cron 또는 SVN post-commit hook이 스크립트를 직접 호출하는 것이 좋습니다.. SVN 체크 아웃 자체를 수행하는 Jenkins가 중요합니다. 변경 사항이있을 때만 빌드가 트리거 될 수 있습니다 (또는 원하는 경우 타이머 또는 수동). 빌드 간의 변경 사항을 추적합니다. 이러한 변경 사항을 보여 주므로 어떤 빌드가 어떤 변경 사항 세트인지 확인할 수 있습니다. 변경으로 인해 빌드 성공 또는 실패가 발생하면 커미터에게 이메일을 보냅니다 (원하는대로 구성됨). 수정 사항이 실패한 빌드를 수정하면 커미터에게 이메일을 보냅니다. 그리고 점점 더. Jenkins가 아티팩트를 보관하면 Jenkins에서 바로 빌드별로 사용할 수 있습니다. SVN 결제만큼 중요하지는 않지만 Jenkins를 만드는 데 필수적인 부분입니다. 배포와 동일합니다. 단일 환경이 아닌 경우 일반적으로 배포는 여러 환경에서 발생합니다. Jenkins는 프로모션을 사용하여 특정 빌드 (특정 SVN 변경 집합 포함)가 배포 된 환경을 추적 할 수 있습니다. 당신은이 모든 것을 앞서고 있습니다. “젠킨스를 사용해야합니다”라는 말을 들었을 때처럼 들리지만 실제로 원하지는 않으며, 그냥 상사를 떼어 놓고 “예, 젠킨스를 사용했습니다”라는 체크 표시를하기 위해 그렇게하는 것입니다.

짧은 대답은 다음의 종료 코드 마지막 Jenkin의 명령의 쉘 실행 빌드 단계의 성공 / 실패를 결정 무엇 빌드 단계 . 0-성공,anything else -실패. 이것은 전체 작업 실행이 아니라 빌드 단계 의 성공 / 실패를 결정합니다 . 전체 작업 실행의 성공 / 실패는 여러 빌드 단계, 빌드 후 작업 및 플러그인의 영향을 더 많이받을 수 있습니다.

당신은 언급했습니다 Build step 'Execute shell' marked build as failure 했으므로 단일 빌드 단계에만 집중할 것입니다. 귀하의 경우 실행 쉘 빌드 단계는 쉘 스크립트를 호출 한 줄을 가지고, 다음 쉘 스크립트의 종료 코드는 빌드 단계의 성공 / 실패를 결정합니다. 더 라인이있는 경우, 이후에 그들이 실패의 원인이 될 수있는 사람이 귀하의 쉘 스크립트 실행, 조심스럽게 그들을 검토합니다.

마지막으로 여기에서 Jenkins Build Script exits after Google Test execution을 읽으십시오 . 귀하의 질문과 직접적인 관련이 없지만 Jenkins가 Execute Shell 빌드 단계를 과 같은 셸 스크립트로/bin/sh -xe

-e즉, 쉘 스크립트 의지 종료 , 단 한 명령이 실패하더라도 실패와 당신이 그 명령에 대한 오류 검사를 할 경우는 (스크립트 종료 있기 때문에 그것은 당신의 오류 검사에 도달하기 전에). 이것은 일반적으로 실패한 명령에 대한 오류 메시지를 인쇄하고 (또는 null로 리디렉션하고 다른 방법으로 처리) 계속하는 쉘 스크립트의 정상적인 실행과 반대입니다.

이것을 피하려면 set +e쉘 스크립트의 맨 위에 추가 하십시오.

스크립트가해야 할 일을 모두 수행한다고 말 했으므로 실패한 명령이 스크립트 끝 부분에있을 가능성이 있습니다. 마지막 에코일까요? 아니면 어딘가의 유물 사본? 전체 콘솔 출력을 보지 않고 우리는 추측하고 있습니다.

작업 실행의 콘솔 출력, 가급적이면 쉘 스크립트 자체도 게시하십시오. 그러면 실패한 행을 정확히 알려줄 수 있습니다.


답변

귀하의 질문에 대한 간단하고 짧은 대답은

“셸 실행”빌드 단계에 다음 줄을 추가하십시오.

#!/bin/sh

이제 “셸 실행”빌드 작업에이 줄이 필요한 이유를 설명하겠습니다.

기본적으로 젠킨스 가지고 /bin/sh -xe이 방법은 -x각각의 모든 command.And 다른 옵션이 인쇄됩니다 -e원인은 바로 스크립트 실행을 중지 쉘, 때 아닌 제로 (어떤 명령이 실패 할 경우) 종료 코드와 어떤 명령이 종료됩니다.

따라서 #!/bin/sh의지 를 추가하면 옵션없이 실행할 수 있습니다.


답변

제 생각에는 -e쉘에 대한 옵션을 끄는 것은 정말 나쁜 생각입니다. 결국 디스크 공간 부족 또는 네트워크 오류와 같은 일시적인 조건으로 인해 스크립트의 명령 중 하나가 실패합니다. 없이 -e젠킨스 통지하지 않습니다 행복하게 함께 계속됩니다. Jenkins를 배포하도록 설정 한 경우 잘못된 코드가 푸시되고 사이트가 중단 될 수 있습니다.

스크립트에 grep 또는 find와 같이 실패가 예상되는 줄이 있으면 다음을 추가하십시오. || true 되는 줄이 있으면 해당 줄의 끝에 . 그러면 라인이 항상 성공을 반환합니다.

해당 종료 코드를 사용해야하는 경우 명령을 if 문에 입력 할 수 있습니다.

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

또는 ||절 에서 리턴 코드를 캡처 할 수 있습니다 .

grep foo bar || ret=$?


답변

단순하고 단순함 :

Jenkins가 빌드 단계 (스크립트이기도 함)가 0이 아닌 코드로 종료되는 것을 확인하면 빌드가 빨간색 공 (= 실패)으로 표시됩니다.

정확히 발생하는 이유는 빌드 스크립트에 따라 다릅니다.

나는 다른 관점에서 비슷한 것을 썼지 만 어쨌든 그것을 읽는 데 도움이 될 것입니다.
Jenkins는 왜 내 빌드가 성공했다고 생각합니까?


답변

따라서 #!/bin/sh의지 를 추가하면 옵션없이 실행할 수 있습니다.

또한 Linux 슬레이브에서 Jenkins 마스터의 bash 스크립트를 실행하는 문제를 해결하는 데 도움이되었습니다. #!/bin/bash“셸 실행”블록의 실제 스크립트 위에 추가하면 내 문제가 해결되었습니다. 그렇지 않으면 Windows git 제공 버전의 bash 셸을 실행하여 오류가 발생했습니다.


답변

Jenkins 버전에서. 1.635에서는 다음과 같은 기본 환경 변수를 표시 할 수 없습니다.

$BUILD_NUMBER or ${BUILD_NUMBER}

이 경우 다른 변수에 설정해야합니다.

set BUILDNO = $BUILD_NUMBER
$BUILDNO


답변