2012-11-15 32 views
6

Jenkins経由でQt GUIアプリケーションを構築しています。何らかの理由で、テストの実行ファイルを実行するためのシェルタスクについてgcovr Googleテストの実行後にJenkins Build Scriptが終了する

でカバレッジレポートをコンパイル、テスト実行

  • を実行するテスト実行
  • を構築

    • :私は3つのビルド手順を追加しました実行後に停止します。簡単な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が正しく表示されますが、2番目の末尾のechoは正しく表示されません。したがって、Googleテストの出力は表示されますが、3番目のビルドタスクは実行されません。私はおそらく問題は、いくつかのGoogleテストが失敗するということだと思ったが、なぜテストが失敗したためにスクリプトが実行を停止するのか?

      誰かが2番目のタスクがなぜ停止するのかについてのヒントを教えてくれますか?

      編集

      コンソール出力は次のようになります。1つのビルドステップが失敗した場合

      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 
      
  • 答えて

    22

    一般的に、残りは実行されません。あなたのログから、このラインに

    ご注意:

    [VG5] $ /bin/sh -xe 
    

    -xは、シェルが実行する前に、コンソール内の各コマンドを印刷します。
    -eは、コマンドが失敗した場合にシェルをエラーで終了させます。

    この場合、「失敗」は、個々のコマンドからの戻りコードが0でないことになります。
    あなたは、マシン上で直接これを実行することでこれを確認することができます

    ./Application --gtest_output=xml 
    echo $? 
    

    echo $?ディスプレイ0の場合、それは前のコマンドが正常に完了したことを示します。それ以外のものが表示されている場合は、前のコマンドのエラーコードを示します。/アプリケーション)、ジェンキンスはそのように扱います。

    ここではいくつかのことがあります。まず、1つのコマンドが失敗した場合(デフォルトの動作)、2番目のビルドステップ(本質的には一時シェルスクリプト/tmp/hudson4729703161621217344.sh)が失敗するように設定されています。ビルドステップが失敗すると、ジェンキンスはすべての仕事を停止して失敗します。

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

    ただし、スクリプトの全体的な結果(ビルドステップ)は、最後のコマンドの終了コードです。あなたのオペレーションではスクリプト内に2つのコマンドしかなく、最後には失敗しているので、追加した+xにもかかわらずスクリプト全体(ビルドステップ)が失敗とみなされます。第3のコマンドとして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行目のエラー処理。 &&は、前のcdが成功した場合に「./Applicationを実行します」という意味です。binフォルダが見つからないなど、何か他のことが起こる可能性があります。&&は内部的に同じエラーコード

    3. 最後に、./Applicationの結果に対して適切なエラー処理が行われています。結果が0でない場合は、失敗したことを示し、それ以外の場合は成功したことを示します。 ./Applicationではなく、echoのif-else可能性のいずれかから失敗した場合、スクリプトの全体的な結果(ビルドステップ)は成功(つまり0)になり、次のビルドステップが実行されます。

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

    はい...この回答は必要以上に長くなるかもしれませんが、私はジェンキンスとシェルがどのように終了コードを扱うのか理解したかったのです。

    +1

    素晴らしい答えです。私は実際には、それぞれの可能なコマンドがスクリプトを停止する可能性については考えていませんでした。ありがとうございました! – dasmaze

    +1

    私はあなたに10回アップアップすることができます。これはたくさんのThks !!! – nolazybits

    +0

    @zeflasher、あなたはいつも私に答えの恩恵を与えることができます;) – Slav

    関連する問題