IT TIP

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

itqueen 2020. 10. 15. 22:08
반응형

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


저는 프로젝트에서 다른 작업을 실행하기 위해 쉘 스크립트를 사용하고 있습니다. 일부 스크립트는 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가 빌드를 성공 / 실패 대신 불안정한 것으로 표시하도록하려면 어떻게해야합니까?


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

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

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

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


마술 문자열을 인쇄하지 않고 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

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

빌드 종료 코드

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


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

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

또한 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 플러그인 도 참조하십시오.


내 작업 스크립트에는 다음 문이 있습니다 (이 작업은 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) 에서 빌드 상태 설정에 대한 자세한 정보를 확인할 수 있습니다.


  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:
    

이 작업을 수행하는 가장 유연한 방법은 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'이면 빌드가 불안정하게 설정됩니다. 이것은 로컬 마스터와 작업을 실행하는 모든 슬레이브 및 디스크에 쓸 수있는 모든 종류의 스크립트에서 작동합니다.


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/


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

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

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

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

그런 다음 해당 조건이 충족 될 때 실행되는 빌드 단계로 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


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

이제 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}")
    }
  }
}

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

파이프 라인 구문 예


기존 답변에 대한 가벼운 대안으로 간단한 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에 액세스 할 수있는 자격 증명에 대한 액세스 권한이 있어야합니다.

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

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

참고 URL : https://stackoverflow.com/questions/8148122/how-to-mark-a-build-unstable-in-jenkins-when-running-shell-scripts

반응형