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


93

私が取り組んでいるプロジェクトでは、シェルスクリプトを使用してさまざまなタスクを実行しています。一部はrsyncを実行するsh / bashスクリプトであり、一部はPHPスクリプトです。PHPスクリプトの1つは、JUnit XML、コードカバレッジレポートなどに出力するいくつかの統合テストを実行しています。

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

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

ジェンキンス用語、不安定なビルドは次のように定義されています。

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

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


私はそれが切り抜いたジョブステップを実行し、ジェンキンスプラグインの使用achived stackoverflow.com/questions/25442343/...
fantastory

回答:


58

使用 テキスト検索プラグインをます。

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

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

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


2
、プラグインをインストールせずにオプションについては、以下の回答を参照してくださいジェンキンスバージョン2.26以降:stackoverflow.com/a/49676269/1347649
JSoet

61

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

ビルドの終了コード

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


追加のプラグインをインストールする必要がないので、このオプションが好きです
mattherman

2
これは最新のJenkinsで実装されているため、これは受け入れられる答えになるはずです
smoke_lp

3
「最新のJenkinsバージョン」とは、Jenkins 2.26以降を意味します。issues.jenkins-ci.org/browse/JENKINS-23786をご覧ください。
ブルー

5
?でshstepコマンドを使用するときに、コードでこれを指定することはできますJenkinsfileか?設定はGUIのどこにありますか?見つからない。
bluenote10

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で簡単に再利用できるように、このためのRubyクラスを実装しました。:)
Shire

3
+1-これは、テキストファインダーがジョブごとに1つの文字列しか検索できないため、ビルドステータスを2つの値のいずれかに設定できるため、受け入れられた回答よりも優れたソリューションです。
gareth_bowles 2013年

4
興味深いソリューション。ただし、Jenkinsで認証が必要な場合は、その構成で公開鍵認証を設定する必要があります。そうしないと、jenkins-cliコマンドがAccessDeniedExceptionで失敗します。
Tom De Leu

2
これは、マスターにWebアクセスできないスレーブを使用している場合は機能しません。たとえば、JenkinsスレーブがサーバーへのHTTPまたはHTTPS接続を作成できない場合などです。
スティーブHHH

3
このソリューションを使用したかったのset-build-resultですが、では廃止されましたjenkins-cli
DrLime2k10 2018年

27

Jenkinsfileを使用してビルドスクリプトをラップし、現在のビルドをUNSTABLEとしてマークするだけで、 currentBuild.result = "UNSTABLE"です。

   ステージ{
      ステータス= / *ここにビルドコマンドが入ります* /
      if(status === "MARK-AS-UNSTABLE"){
        currentBuild.result = "不安定"
      }
   }

3
なぜこの回答の方が賛成票がないのですか?何か問題がありますか(「マジック」文字列の使用を除くUNSTABLE)?他の答えよりも簡単です。
ケビン

2
質問はフリースタイルの仕事について尋ねていましたが、この答えはパイプラインの仕事についてです。パイプラインの回答はフリースタイルのジョブには適用されません
マークウェイト

これはどのように機能しますか?エラーが表示されます:Expected one of "steps", "stages", or "parallel" for stagecurrentBuild.resultを直接ステージ内に設定しようとすると、
dokaspar

11

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


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. PHPビルドを構成してXML JUnitレポートを生成する

    <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 2016年

ありがとう!非常に役立ちます。Groovy Postbuildはかなり間接的であり、GroovyはJavaからこのような膨大な量のデータを取り込み、さらに追加します...これは私にとって新しいトリックです。
uchuugaka

@uchuugakaこれはグルーヴィーな問題ではないと思います:)
jeremyjjbrown

まったく問題ありません。に挑戦するだけの挑戦!
uchuugaka

2

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

私がこれを探すのに少し時間を費やしので、ここから私の答えを複製します:

これは、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

似たようなものを探している人のために別の答えを投稿すると思いました。

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

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

ビルドステップとして[ 条件付きステップ(単一) ]オプションを使用しました。

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

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はスレーブからアクセスできます
  • スレーブは、Jenkins GroovyスクリプトREST APIにアクセスできる資格情報にアクセスできる必要があります。

0

ビルドを不安定に設定する簡単な方法の1つは、「シェルの実行」ブロックで実行します。 exit 13


-3

「exit 1」を呼び出すだけで、その時点でビルドは失敗し、続行されません。私はそれを処理するためにパススルーmake関数を作成し、ビルドのためにmakeではなくsafemakeを呼び出しました。

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

11
1番出口は、私が知る限り、ビルドを失敗させるだけです。ビルドが失敗しないようにしたいのですが、不安定とマークしたいです。
HNygard

1
stackoverflow.com/questions/36313216/…も参照してください-単純な解決策はif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
次のとおり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.