我添加了一个构建步骤来执行 Python 脚本。
在此脚本中,pylint 使用 lint.Run(..args) 调用以检查代码。
该脚本有效,但最终,构建失败并显示唯一的错误消息:
Build step 'Execute Python script' marked build as failure
有人知道为什么会这样吗?
你也可以简单地放一个
皮林特 || 出口 0
在 shell 命令行中。通过检查 pylint 的结果,Pylint 插件无论如何都会使构建失败。
在 Pylint 1.9.3 中,有一个--exit-zero
标志。
Pylint 具有令人不快的行为,即仅在发现一个小的警告问题时才返回非零退出代码。只有当一切正常时,才会返回 0(参见手册页)。
由于通常非零代码表示错误,Jenkins 无法构建。
我看到有两种方法可以克服这个问题:
似乎您的 pylint 执行以非零状态退出(缺少脚本,错误选项......),也许您退出脚本时引发异常或sys.exit(something_else_than_zero)
最近的 rylint 有不调用 sys exit 的选项
lint.Run(args, exit=False, **kwargs)
今天遇到了这个(虽然不使用詹金斯)。
就我而言,这是因为 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 )
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 位),则此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。修复(?解析错误消息?)对于有时髦印章的人来说可能是微不足道的。
pylint 不给出零退出,但没有明显的错误消息。您可能需要跟踪以查看哪个文件 pylint 失败。并查看文件。
对我来说,我添加了一个带有init .py 文件的空目录,并且 pylint 给出了同样的错误