11

私はほとんどジェンキンスを使い始めていません、そしてこれは私がこれまでに経験した最初の問題です。基本的に、一部のテストでエラーが発生した場合でも、私のjenkinsジョブは常に成功します。これは私がシェル構成で実行しているものです:

bundle install 
rake db:migrate:reset
rake test:units
rake spec:models

Jenkinsは、失敗したタスクが最後のタスクである場合にのみ失敗を報告します。たとえば、最後のタスクに「rake test:units」を設定すると、問題が発生した場合にエラーが通知されます。この構成を使用すると、rspecテストのエラーレポートのみが表示され、単体テストのエラーレポートは表示されません。

なぜ私がrspecやユニットテストだけを使用しないのか疑問に思っている人は、現在rspecに移行していますが、この問題は依然として苦痛です。

これは、単体テストの1つが失敗したが、ジェンキンスは引き続き成功したことがわかるように、ジェンキンスムからのログの一部です。

314 tests, 1781 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [/var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p1...]

Tasks: TOP => test:units
(See full trace by running task with --trace)
Lot of rspec tests here....
Finished in 3.84 seconds
88 examples, 0 failures, 42 pending
Pushing HEAD to branch master of origin repository
Pushing HEAD to branch master at repo origin
Finished: SUCCESS
4

3 に答える 3

18

Jenkins は、[ビルド ステップ] ボックスに入力したコマンドを一時ファイルに書き込み、/bin/sh -xe.

通常、これにより目的の効果が得られます。コマンドは順番に実行され (出力され)、コマンドが失敗するとスクリプトはすぐに中止されます。つまり、0 以外の終了コードで終了します。

これが発生していない場合、唯一の理由は、この動作をオーバーライドしたことです。ビルドステップの最初の行を次の 2 文字で開始することにより、オーバーライドできます: #!.

たとえば、ビルド ステップが次のようになっているとします。

#!/bin/bash
bundle install
rake db:migrate:reset
rake test:units
rake spec:models

次に、Jenkins がスクリプトを一時ファイルに書き込み、それが で実行されることを意味し/bin/bashます。そのように呼び出されると、bash はコマンドを 1 つずつ実行し、成功するかどうかは気にしません。bash プロセスの終了コードは、スクリプトの最後のコマンドの終了コードになり、スクリプトの終了時に Jenkins によって表示されます。

そのため、ビルド ステップの最初の行に何を入力するかに注意してください。シェルの仕組みがわからない場合は、ハッシュバンをまったく配置せず、Jenkins にスクリプトの実行方法を決定させてください。

ビルド ステップの実行方法をさらに制御する必要がある場合は、使用するシェルのマニュアル ページを調べて、希望どおりに動作させる方法を見つける必要があります。ジェンキンスはここではあまり役割を果たしません。必要な方法で必要なシェルを実行するだけです。

于 2012-07-13T20:58:16.713 に答える
5

Jenkinsは最後に実行されたコマンドの結果コードしか見ることができないため、結果が何であるかを知る方法はありませんrake test:units

最も簡単なのは、これらのコマンドの各コマンドを個別のjenkinsビルドステップとして使用することです。

于 2012-07-13T07:48:50.400 に答える
5

別の解決策は、最初の行を次のように変更することです。

#!/bin/bash -e

これにより、スクリプト内のコマンドのいずれかがエラーを返す場合、スクリプトは失敗するようになります。

参照:エラー時の bash シェル スクリプトの自動終了

于 2012-10-03T15:45:18.750 に答える