詹金斯与pylint给建设失败
我添加了一个构建步骤来执行一个Python脚本。
在这个脚本中,用lint.Run(.. args)调用pylint来检查代码。
脚本工作,但最终,构建失败,唯一的错误消息:詹金斯与pylint给建设失败
Build step 'Execute Python script' marked build as failure
有人有一个想法,为什么出现这种情况?
似乎与非零状态(缺少脚本,坏选项...)你pylint的执行退出,也许你引起的异常或sys.exit(something_else_than_zero)
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
你也可以简单地把一个
pylint ||在shell cmdline中退出0
。无论如何,通过检查pyllint的结果,Pylint插件将会失败。
最近rylint有选择不调用SYS退出
lint.Run(参数,退出=假** kwargs)
我同意@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未设置),那么此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。解决方案(?解析错误信息?)对于那些有着常规排列的人来说可能是微不足道的。
该死的直。我调试了lint.py并发现了一个调用sys.exit(self.linter.msgstatus),其中msgstatus无法在上下文中找到。把它替换成0,现在构建成功了。 – Gobliins