web-dev-qa-db-ja.com

Execute ShellはJenkinsでビルドを失敗としてどのようにしてマークしますか?

これに対する答えを探している間に私が見つけたホラーストーリー...

そうですね、私は.shスクリプトを持っています。

  • sVNからソースをチェックアウトする
  • プロジェクトを構築する
  • プロジェクトをデプロイする
  • それ自身をきれいにする

したがって、Jenkinsでは、Execute Shellコマンドでスクリプトを実行してプロジェクトを「ビルド」するだけです。スクリプトは実行されますが(ソースはダウンロードされ、プロジェクトはビルド/デプロイされます)、それからビルドは失敗としてマークされます。スクリプトを閉じてみました。

  • 終了0(まだ失敗としてマークします)
  • 出口1(予想通り、失敗としてマークする)
  • まったく終了コマンドがない(失敗としてマークする)

Execute Shellが私のビルドを失敗とマークするのはいつ、どのように、そしてなぜですか?

106
tester

まず最初に、下の灰色の領域にマウスを合わせます。答えの一部ではありませんが、絶対に言わなければなりません:

「チェックアウト、ビルド、デプロイ」をすべて単独で行うシェルスクリプトがある場合、なぜJenkinsを使用しているのですか?あなたは、それが何であるかを作るジェンキンスのすべての機能を先に述べています。 cronまたはSVN post-commitフックを使用してスクリプトを直接呼び出すこともできます。 SVNチェックアウト自体を実行するJenkinsは非常に重要です。変更がある場合(または、必要に応じて、タイマーまたは手動で)にのみビルドをトリガーできます。ビルド間の変更を追跡します。これらの変更が表示されるため、どのビルドがどの変更セットに対して行われたかを確認できます。変更がビルドの成功または失敗を引き起こした場合、コミッターにメールを送信します(これも、好みに応じて構成されます)。修正が失敗したビルドを修正すると、コミッターにメールを送信します。そしてますます。 Jenkinsがアーティファクトをアーカイブすると、ビルドごとにJenkinsからすぐに利用できるようになります。 SVNチェックアウトほど重要ではありませんが、これもまたジェンキンスの重要な部分です。展開と同じです。単一の環境がない限り、展開は通常複数の環境で行われます。 Jenkinsは、プロモーションを使用して、特定のビルド(SVNの特定の変更を含む)がデプロイされている環境を追跡できます。あなたはこれすべてを先に述べています。 「Jenkinsを使用する必要がある」と言われているようですが、本当にしたくないので、上司を後ろから追い払うためだけに、「はい、Jenkinsを使用しました」とマークします

簡単な答えは、JenkinのExecute Shellビルドステップのlastコマンドの終了コードがBuild Stepの成功/失敗を決定するものです。 0-成功、anything else-失敗。これは、job run全体ではなく、ビルドステップの成功/失敗を決定していることに注意してください。ジョブ実行全体の成功/失敗は、複数のビルド手順、ビルド後のアクションおよびプラグインによってさらに影響を受ける可能性があります。

Build step 'Execute Shell' marked build as failureに言及したので、単一のビルドステップに焦点を当てます。 Execute Shellビルドステップにシェルスクリプトを呼び出す行が1行しかない場合、シェルスクリプトの終了コードがビルドステップの成功/失敗を決定します。さらに行がある場合は、シェルスクリプトの実行afterを実行します。エラーが発生する可能性があるため、慎重に確認してください。

最後に、ここGoogleテストの実行後にJenkinsビルドスクリプトが終了しますを読んでください。それはあなたの質問に直接関係していませんが、/bin/sh -xeを含むシェルスクリプトとしてExecute Shellビルドステップを起動するJenkinsに関する部分に注意してください

-eは、シェルスクリプトがexitに失敗することを意味します。コマンドが1つだけ失敗した場合でも、そのコマンドのエラーチェックを行うとeven(スクリプトは、エラーチェック)。これは、通常、失敗したコマンドのエラーメッセージを出力する(またはnullにリダイレクトして他の手段で処理する)シェルスクリプトの通常の実行とは異なります。

これを回避するには、シェルスクリプトの先頭にset +eを追加します。

スクリプトが行うべきことをすべて実行すると言うので、失敗したコマンドはスクリプトの最後のどこかにある可能性があります。おそらく最後のエコーですか?または、どこかにアーティファクトのコピーがありますか?完全なコンソール出力を見ることなく、ただ推測しています。

ジョブ実行のコンソール出力、できればシェルスクリプト自体も投稿してください。そうすれば、どの行が失敗しているかを正確に伝えることができます。

121
Slav

あなたの質問に対する簡単で短い答えは

「Execute Shell」ビルドステップに次の行を追加してください。

#!/bin/sh

次に、「シェルの実行」ビルドジョブにこの行が必要な理由を説明します。

デフォルトでは、Jenkinsは/bin/sh -xeを使用し、これは-xがすべてのコマンドを出力することを意味します。そして、他のオプション-eゼロ(コマンドが失敗した場合)終了コード。

したがって、#!/bin/shを追加すると、オプションなしで実行できます。

80
Abhijeet Kamble

簡潔でシンプル:

Jenkinsがビルドステップ(スクリプトでもある)がゼロ以外のコードで終了したことを確認した場合、そのビルドは赤いボール(= failed)でマークされます。

なぜそれが正確に起こるのかはあなたのビルドスクリプトに依存します。

私は別の観点から似たようなものを書きましたが、多分それはとにかくそれを読むのを助けるでしょう: なぜJenkinsは私のビルドが成功したと思いますか?

2
sti

私の意見では、あなたのシェルの-eオプションをオフにすることは本当に悪い考えです。最終的には、ディスク容量不足やネットワークエラーなどの一時的な状態が原因で、スクリプト内のコマンドの1つが失敗します。 -eがなければ、Jenkinsは気付かないで喜んで進みます。 Jenkinsがデプロイを実行するように設定していると、悪いコードがプッシュされてサイトがダウンする可能性があります。

Grepやfindのように、スクリプトに失敗が予想される行がある場合は、その行の最後に|| trueを追加するだけです。それはその行が常に成功を返すことを保証します。

その終了コードを使用する必要がある場合は、ifステートメントにコマンドを追加することができます。

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

あるいは、||句でリターンコードを取得することもできます。

grep foo bar || ret=$?
2
Bryan Larsen

そのため、#!/bin/shを追加することで、オプションなしで実行できるようになります。

それはまた私が私のLinuxスレーブでJenkinsマスターからbashスクリプトを実行していた問題を修正するのに役立ちました。 "Execute Shell"ブロックで私の実際のスクリプトの上に#!/bin/bashを追加するだけでそれは私の問題を修正しました。

0

Jenkins ver。では1.635、このようなネイティブの環境変数を表示することは不可能です。

$ BUILD_NUMBERまたは$ {BUILD_NUMBER}

この場合、他の変数に設定する必要があります。

bUILDNO = $ BUILD_NUMBER $ BUILDNOに設定します。

0
user10413452