2011-09-08 20 views
7

ビルドステップを追加してPythonスクリプトを実行しました。
このスクリプトでは、コードをチェックするためにlint.Run(.. args)を使用してpylintが呼び出されます。
スクリプトは動作しますが、最終的には、ビルドは唯一のエラーメッセージで失敗します。pylintのあるJenkinsがビルドに失敗する

Build step 'Execute Python script' marked build as failure

誰かが、これはなぜ起こるかのアイデアを持っていますか?

答えて

1

非ゼロの状態(欠落しているスクリプト、悪いオプション...)を使用してpylint実行出口は、多分あなたが発生した例外またはsys.exit(something_else_than_zero)

+0

まっすぐ。私はlint.pyをデバッグし、sysstex(self.linter.msgstatus)という呼び出しについて、msgstatusがコンテキスト内で見つからなかったことを知りました。これを0に置き換えるとビルドが成功するようになりました。 – Gobliins

11

Pylintはに不快な行動を持っていて、スクリプトを終了しているようです小さな警告の問題が見つかった場合にのみ、ゼロ以外の終了コードを返します。すべてが正常だった場合にのみ0が返されます(マニュアルページを参照)。

通常、ゼロ以外のコードはエラーを示しているため、Jenkinsはビルドに失敗します。

私はこれを克服するには、2つの方法を参照してください。

  • は常にジェンキンスが原因pylintの失敗することはありませんそして、0を返します。pylintの周りに小さなスクリプトを使用してください。私はos.system()とsys.exit(0)でpylintを呼び出す小さなpythonスクリプトを使用します。 pylintのエラーコードをオーバーライドしていることがわかります。
  • パッチペンリント。例えば、私のLinuxシステム上でsys.exit()の呼び出しが
+0

はい、とても良いアイデアです。私はそれを試みます。 – Gobliins

+0

期待どおりに働いた! – Gobliins

+0

出力をcatにパイプしましたが、今は正常にビルドされたようです。例えば'pylint -f html code.py | cat> report.html' – zyxue

15

/usr/lib/pymodules/python2.6/pylint/lint.pyファイルであるあなたは、単に

を置くことができます

pylint || exit 0

シェルのcmdlineにあります。 pylintの結果を確認すると、Pylintプラグインはビルドに失敗します。

3

最近rylintは

lint.Run(引数、終了= Falseを、** kwargsから)

0

SYSの出口を呼び出していないため、私は@dmeisterでオプションを同意しているが、パイプラインコード(Jenkinsfile)と私が提案しますtry/catchし、エラーを解析します。 - グルーヴィーなグルーヴィーな純粋主義者に

try {  
    sh 'pylint --output-format=parseable my_module' 
} catch (pylint_rc) { 
    // pylint_rc will be of the form 
    // "hudson.AbortException: script returned exit code NN" 
    // where NN is 1-63 and represents bit field; 
    // bits 0-4 indicate lint-ish issues in analyzed code, 
    // bit 5 indicates pylint usage error 
    echo "pylint_rc= \'$pylint_rc\'" 
    String rc = "$pylint_rc" 
    String code = rc.split()[5] 
    echo "Isolated return code string value $code" 
    int value = code.toInteger() 

    // catastrophic/crash error returns a 1; else there is a pylint return code 
    int error_bits_code = value & 0x20 
    int lint_bits_code = value & 0x1f 
    echo "pylint error_bits_code=$error_bits_code ; lint_bits_code=$lint_bits_code" 
    if ((value == 1) || (error_bits_code != 0)) { 
     currentBuild.result = "FAILURE" 
     throw pylint_rc 
    } 
} 

謝罪:あなただけのpylintは、使用方法のエラーを報告するかどうか、または致命的なは失敗があったかどうか、(Pylintのドキュメントを参照してください)pylintからステータスビットを取得しているかどうかを判断することができますこの方法私のことではないので、これを改善できると確信しています。私に知らせてください。既知の穴が1つあります:もしpylintが "fatal"型のエラー(ビット0)しか検出せず、他の種類の問題(ビット1〜4は設定されていません)がない場合、このコードは間違って例外をスローします。しかし、私のコードでは、問題がたくさんあるので、それは私には問題ではありません。修正(?解析エラーmsg?)は、面倒なチョップを持つ人にとっては些細かもしれません。

関連する問題