셸 스크립트를 실행할 때 Jenkins에서 빌드를 불안정하게 표시하는 방법


93

내가 작업중인 프로젝트에서 우리는 다른 작업을 실행하기 위해 쉘 스크립트를 사용하고 있습니다. 일부는 rsync를 실행하는 sh / bash 스크립트이고 일부는 PHP 스크립트입니다. PHP 스크립트 중 하나는 JUnit XML, 코드 커버리지 보고서 등으로 출력하는 통합 테스트를 실행하고 있습니다.

Jenkins는 종료 상태 에 따라 작업을 성공 / 실패로 표시 할 수 있습니다. 에서 PHP, 1 스크립트 종료는 그것을 테스트가 실행 중에 실패했음을 감지 한 경우. 다른 쉘 스크립트는 명령을 실행하고 종료 코드를 사용하여 빌드를 실패로 표시합니다.

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

에서 젠킨스 용어 , 불안정한 빌드는 다음과 같이 정의된다 :

빌드가 성공적으로 빌드되고 하나 이상의 게시자가 불안정하다고보고하면 빌드가 불안정합니다. 예를 들어 JUnit 게시자가 구성되고 테스트가 실패하면 빌드가 불안정한 것으로 표시됩니다.

셸 스크립트를 실행할 때 Jenkins가 빌드를 성공 / 실패 대신 불안정한 것으로 표시하도록하려면 어떻게해야합니까?


다른 작업 단계를 실행하고 jenkins 플러그인을 사용하여 달성했습니다. stackoverflow.com/questions/25442343/…
fantastory

답변:


58

Text-finder 플러그인을 사용합니다 .

상태 1 (빌드 실패)로 종료하는 대신 다음을 수행하십시오.

if ($build_error) print("TESTS FAILED!");

빌드 후 작업에서 텍스트 찾기를 활성화하고 인쇄 한 메시지 ( TESTS FAILED!)와 일치하도록 정규식을 설정하고 해당 항목 아래의 "찾을 경우 불안정 함"확인란을 선택합니다.


2
jenkins 버전 2.26 이후 플러그인을 설치하지 않은 옵션은 아래 답변을 참조하십시오. stackoverflow.com/a/49676269/1347649
JSoet

63

최신 Jenkins 버전 (2016 년 10 월 2.26 이후)에서는이 문제를 해결했습니다. 셸 빌드 단계 실행을위한 고급 옵션 일뿐입니다!

빌드 종료 코드

임의의 종료 값을 선택하고 설정할 수 있습니다. 일치하면 빌드가 불안정합니다. 빌드의 실제 프로세스에서 시작할 가능성이없는 값을 선택하기 만하면됩니다.


추가 플러그인을 설치할 필요가 없기 때문에이 옵션이 마음에
듭니다

2
이것은 최신 젠킨스에서 구현되기 때문에 - 이것은 허용 대답해야한다
smoke_lp

3
"최신 Jenkins 버전"은 Jenkins 2.26 이상을 의미합니다. issues.jenkins-ci.org/browse/JENKINS-23786을 참조 하세요 .
Blue

5
에서 sh단계 명령을 사용할 때 코드를 통해 이것을 지정할 수 Jenkinsfile있습니까? GUI에서 설정은 어디에 있습니까? 못 찾겠 어.
bluenote10 19.04.02

1
이를 노출하려면 빌드 단계에서 "고급 ..."버튼을 클릭해야했습니다. "일을 수행하려면 여기를 클릭하십시오"축소판 뒤에 단일 (특히 고급은 아님) 옵션을 숨기는 것은 그다지 유용하지 않지만 그 방법입니다.
tripleee

57

마술 문자열을 인쇄하지 않고 TextFinder를 사용하지 않고도 수행 할 수 있습니다. 여기에 몇 가지 정보가 있습니다.

기본적으로 쉘 스크립트에서 사용할 수있는 http : // yourserver.com / cli 의 .jar 파일이 필요합니다. 그러면 다음 명령을 사용하여 빌드를 불안정하게 표시 할 수 있습니다.

java -jar jenkins-cli.jar set-build-result unstable

오류시 빌드를 불안정하게 표시하려면 다음을 사용할 수 있습니다.

failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable

문제는 jenkins-cli.jar이 쉘 스크립트에서 사용 가능해야한다는 것입니다. 액세스하기 쉬운 경로에 넣거나 작업의 셸 스크립트를 통해 다운로드 할 수 있습니다.

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar

2
저는이 솔루션이 정말 마음에 듭니다. 제 rakefile에서 쉽게 재사용 할 수 있도록 루비 클래스를 구현했습니다. :)
Shire 2012 년

3
+1-Text Finder는 작업 당 하나의 문자열 만 검색 할 수 있으므로 두 값 중 하나로 만 빌드 상태를 설정할 수 있으므로 허용되는 답변보다 더 나은 솔루션입니다.
gareth_bowles

4
흥미로운 솔루션입니다. 그러나 Jenkins에 인증이 필요한 경우 해당 구성에서 공개 키 인증을 설정해야합니다. 그렇지 않으면 모든 jenkins-cli 명령이 AccessDeniedException과 함께 실패합니다.
Tom De Leu

2
마스터에 대한 웹 액세스 권한이없는 슬레이브를 사용하는 경우에는 작동하지 않습니다. 예를 들어 Jenkins 슬레이브가 서버에 대한 HTTP 또는 HTTPS 연결을 만들 수없는 경우입니다.
Steve HHH 2015

3
나는이 솔루션을 사용하고 싶었지만 set-build-result에 사용되지 않습니다 jenkins-cli.
DrLime2k10

28

Jenkinsfile을 사용하여 빌드 스크립트를 래핑하고 .NET Framework를 사용하여 현재 빌드를 UNSTABLE로 표시해야합니다 currentBuild.result = "UNSTABLE".

   stage {
      상태 = / * 빌드 명령이 여기에 표시됩니다 * /
      if (status === "MARK-AS-UNSTABLE") {
        currentBuild.result = "불안정"
      }
   }

3
이 답변에 더 많은 찬성표가없는 이유는 무엇입니까? ( "magic"문자열의 사용을 제외하고 UNSTABLE) 문제가 있습니까? 다른 답변보다 더 간단 해 보입니다.
Kevin 19

2
질문은 프리 스타일 작업에 대해 묻는 것이었지만이 답변은 파이프 라인 작업에 대한 것입니다. 파이프 라인의 대답은 자유형 작업에 적용되지 않습니다
마크 웨이트에게

어떻게 작동합니까? 오류가 발생합니다. Expected one of "steps", "stages", or "parallel" for stage스테이지 내에서 currentBuild.result를 직접 설정하려고 할 때.
dokaspar

11

당신은 또한 groovy를 사용할 수 있고 textfinder가 한 일을 할 수 있어야합니다

groovy post-build 플러그인으로 빌드를 불안정한 것으로 표시

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

Groovy Postbuild 플러그인 도 참조하십시오.


6

내 작업 스크립트에는 다음 문이 있습니다 (이 작업은 Jenkins 마스터에서만 실행 됨).

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

Jenkins wiki ( https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI) 에서 빌드 상태 설정에 대한 자세한 정보를 볼 수 있습니다.


4
  1. XML junit 보고서를 생성하도록 PHP 빌드 구성

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. 상태 0으로 빌드 스크립트 완료

    ...
    exit 0;
    
  3. 빌드 후 조치를 추가하십시오 . 테스트 보고서 XML에 대한 JUnit 테스트 결과 보고서 공개 . 이 플러그인은 테스트가 실패하면 Stable 빌드를 Unstable로 변경합니다.

    **/build/junit.xml
    
  4. 콘솔 출력 스캔 및 선택되지 않은 옵션으로 Jenkins Text Finder 플러그인을 추가 합니다. 이 플러그인은 치명적인 오류로 인해 전체 빌드에 실패합니다.

    PHP Fatal error:
    

3

이 작업을 수행하는 가장 유연한 방법은 groovy post build 플러그인에서 파일을 읽는 것입니다. 여기에 이미지 설명 입력

import hudson.FilePath
import java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

파일 내용이 'true'이면 빌드가 불안정하게 설정됩니다. 이것은 로컬 마스터와 작업을 실행하는 모든 슬레이브 및 디스크에 쓸 수있는 모든 종류의 스크립트에서 작동합니다.


나는 이것이 실제로 "build.properties라는 이름의 파일이있는 경우"라는 표시가 불안정하다고 말한다고 가정하고 있습니다. 맞습니까? 저는 Groovy를 처음 사용합니다.이 설명을 좀 더 자세히 설명해 주시겠습니까?
uchuugaka

@uchuugaka 네, 파일이 있고 그 내용이 있다면. 파일 이름과 내용은 임의적입니다. 케이스에 맞는 것을 사용하십시오.
jeremyjjbrown

감사! 매우 도움이됩니다. Groovy Postbuild는 상당히 간접적이며, Groovy는 자바의 방대한 양을 빨아 들여 더 많은 것을 추가합니다. 그것은 저에게 새로운 트릭입니다.
uchuugaka

@uchuugaka 그게 :) 끝내에 문제가 생각하지 않습니다
jeremyjjbrown

전혀 문제가되지 않습니다. 기댈 수있는 도전!
uchuugaka

2

TextFinder는 작업 상태가 SUCCESS에서 FAILED 또는 ABORTED로 변경되지 않은 경우에만 좋습니다. 이러한 경우 PostBuild 단계에서 그루비 스크립트를 사용하십시오.

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

내가 작성한 게시물에서 자세한 내용을 참조하십시오 : http://www.tikalk.com/devops/JenkinsJobStatusChange/


2

여기 에서 내 대답을 복제나는 이것을 찾는 데 시간을 보냈기 때문에 합니다.

이제 Jenkins의 최신 버전에서 가능합니다. 다음과 같이 할 수 있습니다.

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

파이프 라인 구문 생성기는 고급 탭에이를 표시합니다.

파이프 라인 구문 예


2

비슷한 것을 찾는 사람들을 위해 다른 답변을 게시 할 것이라고 생각했습니다.

빌드 작업에서 빌드를 계속하고 싶지만 불안정한 것으로 표시되는 경우가 있습니다. 우리에게는 버전 번호와 관련이 있습니다.

그래서 빌드에 조건을 설정하고 해당 조건이 충족되면 빌드를 불안정하게 설정하고 싶었습니다.

내가 사용하는 조건부 단계 (단일) 빌드 단계로 옵션을 선택합니다.

그런 다음 해당 조건이 충족 될 때 실행되는 빌드 단계로 Execute system Groovy 스크립트 를 사용했습니다.

내가 사용 그루비 명령 과 스크립트를 다음과 설정

import hudson.model.*

def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE

return

꽤 잘 작동하는 것 같습니다.

나는 여기서 해결책을 우연히 발견했습니다.

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html


1

기존 답변에 대한 가벼운 대안으로 간단한 HTTP POST로 빌드 결과를 설정 하여 Groovy 스크립트 콘솔 REST API에 액세스 할 수 있습니다 .

    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

장점 :

  • 거대한 jar 파일을 다운로드하고 실행할 필요가 없습니다.
  • 일부 전역 상태 (콘솔 텍스트, 작업 공간의 파일)를 설정하고 읽는 데 필요한 작업이 없습니다.
  • 플러그인이 필요하지 않음 (Groovy 외에)
  • PASSED 또는 FAILURE 케이스에서 불필요한 추가 빌드 단계를 구성 할 필요가 없습니다.

이 솔루션의 경우 환경이 다음 조건을 충족해야합니다.

  • Jenkins REST API는 슬레이브에서 액세스 할 수 있습니다.
  • Slave는 Jenkins Groovy 스크립트 REST API에 액세스 할 수있는 자격 증명에 액세스 할 수 있어야합니다.

0

빌드를 불안정하게 설정하는 한 가지 쉬운 방법은 "execute shell"블록에서 다음을 실행하는 것입니다. exit 13


-3

"exit 1"을 호출하면 빌드가 해당 지점에서 실패하고 계속되지 않습니다. 나는 그것을 처리하기 위해 passthrough make 함수를 만들고, make 대신에 safemake를 호출한다.

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

11
출구 1, 내가 아는 한 빌드가 실패합니다. 빌드가 실패하는 것을 원하지 않고 불안정한 것으로 표시되기를 원합니다.
HNygard 2012

1
참조 stackoverflow.com/questions/36313216/... - 간단한 해결책은 그냥if make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.