2011-09-08 149 views
7

我添加了一个构建步骤来执行一个Python脚本。
在这个脚本中,用lint.Run(.. args)调用pylint来检查代码。
脚本工作,但最终,构建失败,唯一的错误消息:詹金斯与pylint给建设失败

Build step 'Execute Python script' marked build as failure

有人有一个想法,为什么出现这种情况?

回答

1

似乎与非零状态(缺少脚本,坏选项...)你pylint的执行退出,也许你引起的异常或sys.exit(something_else_than_zero)

+0

该死的直。我调试了lint.py并发现了一个调用sys.exit(self.linter.msgstatus),其中msgstatus无法在上下文中找到。把它替换成0,现在构建成功了。 – Gobliins

11

pylint的有不愉快的行为,退出脚本即使仅在发现小警告问题时也返回非零退出代码。只有当一切正常时,返回0(参见手册页)。

由于通常非零代码表示错误,因此Jenkins无法构建。

我看到两种方法来解决这个问题:

  • 使用小脚本周围pylint的是总是返回0。然后詹金斯不会因为pylint的失败。我使用一个小的python脚本,在os.system()和sys.exit(0)之后调用pylint。你可以看到它覆盖了pylint的错误代码。
  • 补丁pylint。例如,我的Linux系统上sys.exit()调用的文件/usr/lib/pymodules/python2.6/pylint/lint.py
+0

是的,非常好的主意。我会尝试。 – Gobliins

+0

按照您的预期工作! – Gobliins

+0

我将输出传送给cat,现在它似乎可以成功创建。例如'pylint -f html code.py | cat> report.html' – zyxue

15

你也可以简单地把一个

pylint ||在shell cmdline中退出0

。无论如何,通过检查pyllint的结果,Pylint插件将会失败。

3

最近rylint有选择不调用SYS退出

lint.Run(参数,退出=假** kwargs)

0

我同意@dmeister,但与管道代码(Jenkinsfile)我建议try/catch然后解析错误。这样,您就可以判断,如果你刚开始从pylint的状态位(见pylint的文档),是否pylint的报告用法错误,或者是否有一个灾难性的失败:

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仅检测到“致命”类型的错误(位0)并且没有其他任何类型的问题(位1-4未设置),那么此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。解决方案(?解析错误信息?)对于那些有着常规排列的人来说可能是微不足道的。