带有pylint的Jenkins会导致构建失败

时间:2011-09-08 11:20:00

标签: python jenkins pylint

我添加了一个构建步骤来执行Python脚本 在这个脚本中,使用lint.Run(.. args)调用pylint来检查代码 该脚本可以工作,但最终,构建失败并显示唯一的错误消息:

Build step 'Execute Python script' marked build as failure

有人知道为什么会这样吗?

8 个答案:

答案 0 :(得分:18)

你也可以简单地加一个

  

pylint ||退出0

shell cmdline中的

。无论如何,通过检查pyllint的结果,Pylint插件将无法构建。

答案 1 :(得分:13)

即使只发现一个小的警告问题,Pylint也会有令人不快的行为来返回非零退出代码。只有当一切都很好时,才会返回0(参见手册页)。

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

我认为有两种方法可以解决这个问题:

  • 在pylint周围使用一个总是返回0的小脚本。然后jenkins不会因为pylint而失败。我使用一个小的python脚本调用pylint与os.system()和sys.exit(0)之后。您可以将其视为覆盖pylint的错误代码。
  • Patch pylint。例如,在我的Linux系统上,sys.exit()调用在文件/usr/lib/pymodules/python2.6/pylint/lint.py

答案 2 :(得分:3)

最近的rylint可以选择不调用sys exit

lint.Run(args, exit=False, **kwargs)

答案 3 :(得分:2)

似乎您的pylint执行退出时状态为非零(缺少脚本,错误的选项...),也许您退出脚本时引发异常或sys.exit(something_else_than_zero)

答案 4 :(得分:1)

在Pylint 1.9.3中,有一个--exit-zero标志。

https://github.com/PyCQA/pylint/blob/1.9/ChangeLog#L47

答案 5 :(得分:1)

Pylint希望所分析的代码是100%完美的。 甚至代码警告也可能导致退出状态代码为非零。 尝试按照Pylint的建议对代码进行修复,并给它打分10/10。

希望这会有所帮助。

答案 6 :(得分: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
    }
}

向时髦的纯粹主义者道歉 - groovy不是我的事,所以我确信这可以改进 - 让我知道。有一个已知的漏洞:如果pylint仅检测到"致命"类型错误(位0)并且没有任何其他类型的问题(1-4位未设置),则此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。修复(?解析错误消息?)对于有常规印章的人来说可能是微不足道的。

答案 7 :(得分:0)

今天就参加(尽管不使用詹金斯)。

在我的情况下,这是因为Pylint如何在其退出代码https://docs.pylint.org/en/1.6.0/run.html#exit-codes

中编码致命错误警告警告重构约定使用信息

我的解决方法:

#!/usr/bin/env sh

# Wraps Pylint invocation to produce shell-friendly exit codes
# Because Pylint exit codes are weird:
# https://docs.pylint.org/en/1.6.0/run.html#exit-codes

PYTHON_EXECUTABLE=python
if [ ! -z $PYTHON_ENV ]; then
    PYTHON_EXECUTABLE="$PYTHON_ENV/bin/python"
fi

${PYTHON_EXECUTABLE} -m pylint $@

PYLINT_EXIT_CODE=$?

exit $(($PYLINT_EXIT_CODE % 4))

(要点:https://gist.github.com/nkashy1/ae59d06d4bf81fb72047fcd390d08903