私が取り組んでいるプロジェクトでは、シェルスクリプトを使用してさまざまなタスクを実行しています。 Rsyncを実行するSH/Bashスクリプトと、PHPスクリプト。PHPスクリプトの1つは、JUnit XML、カバレッジレポートなど。
Jenkinsは、ジョブを成功/失敗に基づいてマークできます exit status。 PHPでは、実行中にテストの失敗が検出された場合、スクリプトは1で終了します。他のシェルスクリプトはコマンドを実行し、それらの終了コードを使用してビルドを失敗としてマークします。
// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);
Jenkins Terminology では、不安定なビルドは
ビルドが正常にビルドされた場合、ビルドは不安定であり、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
Jenkinsfileを使用してビルドスクリプトをラップし、currentBuild.result = "UNSTABLE"
を使用して現在のビルドを単にUNSTABLEとしてマークする必要があります。
ステージ{ status =/*ビルドコマンドはここに入ります*/ if(status === "MARK-AS-UNSTABLE"){ currentBuild。 result = "UNSTABLE" } }
また、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 も参照してください
ジョブスクリプトには、次のステートメントがあります(このジョブは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
構成する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>
ステータス0でビルドスクリプトを終了する
...
exit 0;
ビルド後のアクションを追加JUnitテスト結果レポートの公開テストレポートXMLの場合。このプラグインは、テストが失敗すると、安定ビルドを不安定に変更します。
**/build/junit.xml
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ステップで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/
同様の何かを探しているかもしれない人々のために、私は別の答えを投稿すると思いました。
ビルドジョブには、ビルドを続行したいが、不安定とマークされるケースがあります。私たちにとっては、バージョン番号に関連しています。
そのため、ビルドに条件を設定し、その条件が満たされた場合にビルドを不安定に設定したかったのです。
ビルドステップとしてConditional step(single)オプションを使用しました。
次に、その条件が満たされたときに実行されるビルドステップとして、システムGroovyスクリプトを実行します。
Groovy Commandを使用し、スクリプトを次のように設定しました
import hudson.model.*
def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE
return
それはかなりうまくいくようです。
ここで解決策を見つけました
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}")
}
}
}
パイプライン構文ジェネレーターの詳細タブにこれが表示されます。
既存の回答のより軽い代替として、ビルド結果を単純な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
利点:
このソリューションでは、環境が次の条件を満たしている必要があります。
シェルがすべてのOKコマンドで失敗した場合(ビルドは失敗しました:)シェルスクリプト内でコマンドが失敗した場合は、コマンドの後にチェックを実行します。
if [ "$?" -ne 0 ]; then
exit 1
fi
@zrajmからの修正:簡略化できます
... || exit 1