12

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

Build step 'Execute Python script' marked build as failure

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

4

9 回答 9

24

你也可以简单地放一个

皮林特 || 出口 0

在 shell 命令行中。通过检查 pylint 的结果,Pylint 插件无论如何都会使构建失败。

于 2012-01-28T23:05:23.237 回答
15

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

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

于 2019-02-28T21:17:07.693 回答
14

Pylint 具有令人不快的行为,即仅在发现一个小的警告问题时才返回非零退出代码。只有当一切正常时,才会返回 0(参见手册页)。

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

我看到有两种方法可以克服这个问题:

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

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

于 2011-09-08T11:45:08.127 回答
2

最近的 rylint 有不调用 sys exit 的选项

lint.Run(args, exit=False, **kwargs)
于 2012-04-03T03:09:24.960 回答
1

今天遇到了这个(虽然不使用詹金斯)。

就我而言,这是因为 Pylint 如何在其退出代码中编码 fatal-error-warning-refactor-convention-usage 信息: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 )

于 2019-08-26T20:25:59.863 回答
1

Pylint 期望被分析的代码是 100% 完美的。甚至代码警告也可能导致退出状态代码为非零。尝试按照 Pylint 的建议修复您的代码并评价 10/10。

希望这可以帮助。

于 2020-03-23T13:53:45.853 回答
0

我同意@dmeister,但对于管道代码(Jenkinsfile),我建议尝试/捕获,然后解析错误。通过这种方式,您可以确定您是否只是从 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 纯粹主义者道歉 - groovy 不是我的事,所以我确信这可以改进 - 让我知道。有一个已知漏洞:如果 pylint 仅检测到“致命”类型的错误(第 0 位)并且没有检测到任何其他类型的问题(未设置第 1-4 位),则此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。修复(?解析错误消息?)对于有时髦印章的人来说可能是微不足道的。

于 2017-07-28T18:47:33.487 回答
0

pylint 不给出零退出,但没有明显的错误消息。您可能需要跟踪以查看哪个文件 pylint 失败。并查看文件。

对我来说,我添加了一个带有init .py 文件的空目录,并且 pylint 给出了同样的错误

于 2021-12-14T18:12:00.863 回答