1

いろいろ悩んだのでこちらに。

次のシェル スクリプトを実行する Jenkins ビルドがあります。

#!/bin/sh -x
if [ 'grep -c "It misses" log' -gt 0 ];
then exit 1;
fi

grep は何かを見つけると 1 を返し、技術的には Jenkins はゼロ以外の終了時にビルドを失敗としてマークする必要があることを知っていますが、jenkins は引き続き成功としてマークします。スクリプト実行時の jenkins ビルドのコンソール出力は次のとおりです。

Started by user bla
[project_name] $ /bin/sh -x /var/tmp/hudson41276.sh
+ [ grep -c "It misses" log -gt 0 ] 
Finished: SUCCESS

誰かが私に手を差し伸べて、私がここで見逃していることを指摘できますか?

ありがとう、CJ

4

4 に答える 4

2

私の理解が正しければ、ファイル「ログ」に「ミス」が見つからない場合、ジョブを失敗させたいと考えています。これは、grep の -c オプションを使用せずに、次のように出力をリダイレクトすることで実行できます。

grep "It misses" log > /dev/null

フレーズが見つかった場合、grep は 0 を返し、ジョブは成功します。フレーズが見つからない場合、grep は 1 を返し、ジョブは失敗します。逆の方法が必要な場合 (フレーズが見つかった場合は失敗します)、grep -v を使用してください。$? シェルコマンドの終了ステータスを確認したいときの友です。

于 2013-05-17T20:14:51.853 に答える
1

問題は、Jenkins ではなくスクリプトにあります。grep の終了コードを比較しようとするスクリプトの部分は、次のようになります。

if [ 'grep -c "It misses" log' -gt 0 ] ...

これはgrepも実行しません。実際、単純に文字列と数値を比較しています。

あなたはおそらくやろうとしていた:

if [ `grep -c "It misses" log` -gt 0 ] ...

バッククォート (`) の使用に注意してください。シェルは grep を実行し、バッククォートを grep の出力に置き換えます。

ボーナス アイテム:ifステートメント内の条件は、実際には実行されるコマンドであり、その終了コードは、実行を続行する場所を決定します。grepでは...コマンドを使用しないのはなぜですか?それは条件として便利な終了コードですか? (grep一致が見つかった場合、コード 0 で終了します。)

if grep "It misses" log; then
    exit 1
fi

非常に多くのコマンドを実行する必要がないため、より短く、はるかに読みやすく、パフォーマンスが向上します。

このような短いifステートメントは、ワンライナーに置き換えることもできます。

grep "It misses" log && exit 1
于 2014-01-19T23:02:25.187 に答える
1

これを試して:

#!/bin/sh
set -e
grep -c "It misses" log

set -e: 最初のエラーで終了します。

grep -c 'arg': 何も grep されなかった場合は 1 を終了します。

于 2013-05-17T10:19:49.613 に答える