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


112

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

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

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

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

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

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

답변:


131

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

자체적으로 "체크 아웃, 빌드, 배포"를 수행하는 쉘 스크립트가있는 경우 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쉘 스크립트의 맨 위에 추가 하십시오.

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

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


6
내가 여전히 Jenkins를 사용하는 이유는 명확하지 않습니다. 최상위의 누군가가 우리가 이미이 스크립트를 가지고 있다는 것을 이해하지 못하고 Jenkins를 사용한다고 주장한 것 같습니다. 딜버트 스트립에있는 것 같아요. -e 팁에 감사드립니다. 문제가 해결되었습니다
tester

45
Jenkins를 사용하는 데는 여전히 좋은 이유가 있습니다. 감사 추적, 빌드 상태 가시성 등 이미 빌드 스크립트가있는 경우 Jenkins 기능을 활용하기 위해 리팩토링하기 전에 Jenkins로 이동하는 것이 좋은 첫 번째 단계입니다.
aehlke 2014

3
이 답변을 교차 연결 serverfault.com/a/143576/186454 set + e 및 set -e는 스크립트의 어느 곳에서나 지정할 수 있습니다. 반환 된 값이 0이 아니면 그 사이의 코드는 빌드에 실패하지 않습니다.
Alex Skrypnyk

2
아주 잘 젠킨스 설정 대 쉘 스크립트에 말했다
pushya

젠킨스를 사용하여 인증 된 액세스와 작업에 대한 UI를 제공합니다. 크론은 그것을 자르지 않을 것입니다. Jenkins는 단순히 cripts를 실행하지 않습니다.
ffghfgh

90

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

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

#!/bin/sh

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

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

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


4
찬성. -xe 기본값에 대해 몰랐습니다. 내 GREP 령 어 문자열을 찾지 못하는 때 그렙가 아닌 0 반환 값 : 반환하기 때문에 내 전체 스크립트가 실패
Somaiah Kumbera을

잘 했어! 중요하지 않은 단계, 정리 단계에서 사용하면 같은 작업을 수행하고 find . -name 'bower_components' -exec rm {} \;경우에 따라 실패했습니다. 감사!
yorch

이것은 모든 것을 지 웠습니다- '그리고 다른 옵션 -e는 어떤 명령이 0이 아닌 (명령이 실패 할 때) 종료 코드로 종료 될 때 즉시 스크립트 실행을 중지하도록합니다.'
Paramvir Singh Karwal

3

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

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

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

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

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

grep foo bar || ret=$?

1
감사합니다 Bryan. 당신은 내 하루를 구했습니다. 또한 -x와 -e를 모두 켜는 것이 좋습니다. 젠킨스 로그에서 볼 수 있습니다.
Bikal Basnet

2

단순하고 단순함 :

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

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

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


0

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

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


0

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

$BUILD_NUMBER or ${BUILD_NUMBER}

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

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