web-dev-qa-db-ja.com

シェルスクリプトの実行時にJenkinsでビルドを不安定にマークする方法

私が取り組んでいるプロジェクトでは、シェルスクリプトを使用してさまざまなタスクを実行しています。 Rsyncを実行するSH/Bashスクリプトと、PHPスクリプト。PHPスクリプトの1つは、JUnit XML、カバレッジレポートなど。

Jenkinsは、ジョブを成功/失敗に基づいてマークできます exit statusPHPでは、実行中にテストの失敗が検出された場合、スクリプトは1で終了します。他のシェルスクリプトはコマンドを実行し、それらの終了コードを使用してビルドを失敗としてマークします。

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

Jenkins Terminology では、不安定なビルドは

ビルドが正常にビルドされた場合、ビルドは不安定であり、1人以上のパブリッシャーが不安定だと報告します。たとえば、JUnitパブリッシャーが構成されていて、テストが失敗した場合、ビルドは不安定とマークされます。

Jenkinsにシェルスクリプトの実行時に成功/失敗だけでなくビルドを不安定としてマークさせるにはどうすればよいですか?

75
HNygard

Text-Finder プラグインを使用します。

ステータス1(ビルドに失敗する)で終了する代わりに、次のようにします。

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

ビルド後のアクションでテキストファインダーを有効にするよりも、印刷したメッセージと一致するように正規表現を設定します(TESTS FAILED!)そして、そのエントリの下の[見つかった場合は不安定]チェックボックスをオンにします。

53
Jan Hudec

これは、マジックストリングを印刷せずに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
54
binaryLV

最新のJenkinsバージョン(2016年10月2.26以降)はこれを解決しました。これは、シェルの実行ビルドステップの高度なオプションにすぎません!

exit code for build

任意の終了値を選択して設定できます。一致する場合、ビルドは不安定になります。ビルドの実際のプロセスによって起動される可能性が低い値を選択してください。

42
Alan Franzoni

Jenkinsfileを使用してビルドスクリプトをラップし、currentBuild.result = "UNSTABLE"を使用して現在のビルドを単にUNSTABLEとしてマークする必要があります。

ステージ{
 status =/*ビルドコマンドはここに入ります*/
 if(status === "MARK-AS-UNSTABLE"){
 currentBuild。 result = "UNSTABLE" 
} 
} 
15
poussma

また、Groovyを使用して、テキストファインダーが行ったことを実行できる必要があります。

groovyビルド後プラグインでビルドを不安定としてマークする

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 Plugin も参照してください

9
Kalpesh Soni

ジョブスクリプトには、次のステートメントがあります(このジョブは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

6
Steve HHH
  1. 構成するPHP build to xml junit report

    <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. ビルド後のアクションを追加JUnitテスト結果レポートの公開テストレポートXMLの場合。このプラグインは、テストが失敗すると、安定ビルドを不安定に変更します。

    **/build/junit.xml
    
  4. Jenkins Text Finderコンソール出力スキャンと未チェックのオプションを備えたプラグインを追加します。このプラグインは致命的なエラーでビルド全体に失敗します。

    PHP Fatal error:
    
4
MariuszS

これを行う最も柔軟な方法は、groovy post buildプラグインでファイルを読み取ることです。 enter image description here

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」の場合、ビルドは不安定に設定されます。これは、ローカルマスター、ジョブを実行するすべてのスレーブ、およびディスクに書き込むことができるあらゆる種類のスクリプトで動作します。

3
jeremyjjbrown

TextFinderは、ジョブのステータスがSUCCESSからFAILEDまたはABORTEDに変更されていない場合にのみ有効です。そのような場合、PostBuildステップでgroovyスクリプトを使用します。

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
yorammi

同様の何かを探しているかもしれない人々のために、私は別の答えを投稿すると思いました。

ビルドジョブには、ビルドを続行したいが、不安定とマークされるケースがあります。私たちにとっては、バージョン番号に関連しています。

そのため、ビルドに条件を設定し、その条件が満たされた場合にビルドを不安定に設定したかったのです。

ビルドステップとしてConditional step(single)オプションを使用しました。

次に、その条件が満たされたときに実行されるビルドステップとして、システムGroovyスクリプトを実行します

Groovy Commandを使用し、スクリプトを次のように設定しました

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

2
adprocas

here からの回答を複製するために、これを探すのに少し時間を費やしたため:

これは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}")
    }
  }
}

パイプライン構文ジェネレーターの詳細タブにこれが表示されます。

Pipeline Syntax Example

1
gib

既存の回答のより軽い代替として、ビルド結果を単純な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はスレーブからアクセスできます
  • スレーブは、Jenkins GroovyスクリプトREST API。
1
Alex O

シェルがすべてのOKコマンドで失敗した場合(ビルドは失敗しました:)シェルスクリプト内でコマンドが失敗した場合は、コマンドの後にチェックを実行します。

 if [ "$?" -ne 0 ]; then
    exit 1
 fi 

@zrajmからの修正:簡略化できます

... || exit 1
0
GKislin