【发布时间】:2011-09-08 11:20:00
【问题描述】:
我添加了一个构建步骤来执行 Python 脚本。
在此脚本中,使用 lint.Run(..args) 调用 pylint 来检查代码。
该脚本有效,但最终,构建失败并显示唯一的错误消息:
Build step 'Execute Python script' marked build as failure
有人知道为什么会这样吗?
【问题讨论】:
我添加了一个构建步骤来执行 Python 脚本。
在此脚本中,使用 lint.Run(..args) 调用 pylint 来检查代码。
该脚本有效,但最终,构建失败并显示唯一的错误消息:
Build step 'Execute Python script' marked build as failure
有人知道为什么会这样吗?
【问题讨论】:
你也可以简单地放一个
皮林特 || 0号出口
在 shell 命令行中。通过检查 pylint 的结果,Pylint 插件无论如何都会使构建失败。
【讨论】:
在 Pylint 1.9.3 中,有一个 --exit-zero 标志。
【讨论】:
Pylint 具有令人不快的行为,即仅在发现一个小的警告问题时才返回非零退出代码。只有当一切正常时,才会返回 0(参见手册页)。
由于通常非零代码表示错误,Jenkins 构建失败。
我看到了两种方法来克服这个问题:
【讨论】:
pylint -f html code.py | cat > report.html
您的 pylint 执行似乎以非零状态退出(缺少脚本、错误选项...),也许您退出脚本时引发异常或 sys.exit(something_else_than_zero)
【讨论】:
最近的 rylint 有不调用 sys exit 的选项
lint.Run(args, exit=False, **kwargs)
【讨论】:
今天遇到了这个问题(虽然没有使用 Jenkins)。
在我的情况下,这是因为 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)
【讨论】:
--exit-zero,因为它不允许我在出现合法错误时使构建失败(例如,Pylint 中的undefined-variable 错误)。
Pylint 期望被分析的代码是 100% 完美的。 甚至代码警告也可能导致退出状态代码为非零。 尝试按照 Pylint 的建议修复您的代码并评价 10/10。
希望这会有所帮助。
【讨论】:
我同意@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 位),则此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。修复(?parse error msg?)对于有时髦能力的人来说可能是微不足道的。
【讨论】:
pylint 不给出零退出,但没有明显的错误消息。您可能需要跟踪以查看哪个文件 pylint 失败。并查看文件。
对我来说,我用 init.py 文件添加了一个空目录,而 pylint 给出了同样的错误
【讨论】: