8

Jenkins 経由で Qt GUI アプリケーションを構築しています。3 つのビルド手順を追加しました。

  • テスト実行可能ファイルのビルド
  • テスト実行可能ファイルの実行
  • gcovr を使用してカバレッジ レポートをコンパイルする

何らかの理由で、テスト実行可能ファイルを実行するためのシェル タスクが実行後に停止します。シンプルでも追いかけechoません。テストは Google Test で作成され、xUnit XML ファイルが出力され、ビルド後に分析されます。一部のテストではアプリケーションのユーザー インターフェイスが起動するため、jenkins xvnc プラグインをインストールして実行できるようにしました。

ビルド タスクは次のとおりです。

建てる

cd $WORKSPACE/projectfiles/QMake
sh createbin.sh

テスト

cd $WORKSPACE/bin
./Application --gtest_output=xml

取材レポート

cd $WORKSPACE/projectfiles/QMake/out
gcovr -x -o coverage.xml

これでecho、最初のビルド タスクの最後に が正しく出力されますがecho、2 番目のビルド タスクの最後に出力されません。したがって、Google Test の出力は表示されますが、3 番目のビルド タスクは実行されません。おそらく問題は Google テストの一部が失敗することだと思いましたが、テストが失敗したという理由だけでスクリプトの実行が停止するのはなぜでしょうか?

2番目のタスクが停止する理由について、誰かがヒントをくれるかもしれません。

編集

コンソール出力は次のようになります。

Updating svn://repo/ to revision '2012-11-15T06:43:15.228 -0800'
At revision 2053
no change for svn://repo/ since the previous build
Starting xvnc
[VG5] $ vncserver :10

New 'ubuntu:10 (jenkins)' desktop is ubuntu:10

Starting applications specified in /var/lib/jenkins/.vnc/xstartup
Log file is /var/lib/jenkins/.vnc/ubuntu:10.log

[VG5] $ /bin/sh -xe /tmp/hudson7777833632767565513.sh
+ cd /var/lib/jenkins/workspace/projectfiles/QMake
+ sh createbin.sh
... Compiler output ...
+ echo Build Done
Build Done
[VG5] $ /bin/sh -xe /tmp/hudson4729703161621217344.sh
+ cd /var/lib/jenkins/workspace/VG5/bin
+ ./Application --gtest_output=xml
Xlib:  extension "XInputExtension" missing on display ":10".
[==========] Running 29 tests from 8 test cases.
... Test output ...
 3 FAILED TESTS
Build step 'Execute shell' marked build as failure
Terminating xvnc.
$ vncserver -kill :10
Killing Xvnc4 process ID 1953
Recording test results
Skipping Cobertura coverage report as build was not UNSTABLE or better ...
Finished: FAILURE
4

1 に答える 1

28

通常、1 つのビルド ステップが失敗すると、残りは実行されません。

ログの次の行に注意してください。

[VG5] $ /bin/sh -xe

シェル-xは、実行前に各コマンドをコンソールに出力します。
いずれかの-eコマンドが失敗した場合、シェルはエラーで終了します。

この場合の「失敗」は、個々のコマンドのいずれかからの 0 以外のリターン コードです。
これをマシンで直接実行することで確認できます。

./Application --gtest_output=xml
echo $?

echo $?が 0 を表示する場合、前のコマンドが正常に完了したことを示します。それ以外のものが表示される場合は、前のコマンド (./Application から) のエラー コードを示しており、Jenkins はそれをそのように扱います。

さて、ここでいくつかのことが行われています。/tmp/hudson4729703161621217344.sh1 つ目は、1 つのコマンドが失敗した場合に 2 番目のビルド ステップ (基本的には一時的なシェル スクリプト) が失敗するように設定されていることです (既定の動作)。ビルド ステップが失敗すると、Jenkins は停止し、ジョブ全体が失敗します。

set +e2 番目のビルド ステップの先頭に追加することで、この特定の動作を修正できます。これにより、個々のコマンドの失敗が原因でスクリプト (ビルド ステップ) が失敗することはありません (コマンドのエラーが表示され、続行されます)。

ただし、スクリプト (ビルド ステップ) の全体的な結果は、最後のコマンドの終了コードです。OPでは、スクリプトに2つのコマンドしかなく、最後のコマンドが失敗しているため、+x追加したにもかかわらず、スクリプト全体(ビルドステップ)が失敗と見なされます。echo3 番目のコマンドとして を追加すると、最後のスクリプト コマンド (echo) が成功したため、実際には機能しますが、この「回避策」は必要ないことに注意してください。

必要なのは、スクリプトに適切なエラー処理を追加することです。このことを考慮:

set +e
cd $WORKSPACE/bin && ./Application --gtest_output=xml
if ! [ $? -eq 0 ]; then
    echo "Tests failed, however we are continuing"
else
    echo "All tests passed"
fi

スクリプトでは、次の 3 つのことが行われています。

  1. まず、個々のコマンドの失敗時にシェルが終了しないように指示しています

  2. 次に、2 行目に基本的なエラー処理を追加しました。&&手段は、「前のものが成功した場合にのみ実行し./Applicationますcd。おそらく、bin フォルダーが見つからないか、その他のことが起こり得ることはわかりません。ところで、&&同じエラーコードで内部的に動作するのは 0 の原則に等しいです」

  3. 最後に、 の結果に対する適切なエラー処理が追加されました./Application。結果が 0 でない場合は失敗したことを示し、そうでない場合は合格したことを示します。これは、最後のコマンドが (潜在的に) 失敗するもの./Applicationではなく、echoif-else の可能性のいずれかによるものであるため、スクリプト (ビルド ステップ) の全体的な結果は成功 (つまり 0) になり、次のビルド ステップは実行されます。

ところで、3 つのビルド ステップすべてを、適切なエラー処理を使用して 1 つのビルド ステップに入れることもできます。

はい...この回答は必要なものより少し長いかもしれませんが、Jenkinsとシェルが終了コードをどのように扱うかを理解してもらいたいと思いました.

于 2012-11-15T19:21:24.103 に答える