这个问题可能听起来很奇怪,但我如何让一个工作失败呢?我有一个python脚本,它使用scons编译一些文件,并且作为jenkins作业运行,该脚本测试编译器是否可以编译x64或x86二进制文件,如果编译器无法完成其中一项,我希望作业失败。例如:如果我在一个64位系统上运行我的脚本,而它无法编译一个64位系统。我可以在脚本中做些什么来导致失败吗?
00jrzges1#
如果脚本以非零状态退出,则构建应该失败。
import sys sys.exit(-1)
0sgqnhkj2#
重要的是,运行python脚本是jenkins工作的最后一步,当它抛出异常或非零异常代码时,如果你在那之后运行任何东西,即使echo“my job is done”也会改变错误代码。对我来说,下面的例子失败了
echo "exit(1)" >> test.py python test.py
当我做下面的工作时,我的Jenkins工作显示为成功
echo "exit(1)" >> test.py python test.py echo "This changes my exit code back to 0, which is successful"
c6ubokkw3#
你可以在任何时候引发异常。如果它没有被处理,应用程序将停止。你甚至不需要指定你要引发的异常。
if not yourTestHere: raise
如果你想指定一个消息,你可以只引发一个标准异常。
from exceptions import Exception if not yourTestHere: raise Exception("Script failed because of bla bla bla")
xfyts7mz4#
我是一个新手,发现如果你在Jenkins中通过Windows批处理shell运行python脚本,那么公认的答案是缺失的。在这种情况下,Jenkins只有在shell中最后一个命令失败时才会失败,所以你的python命令可能会失败,但如果在它之后有另一行更改了目录或其他内容,那么Jenkins会认为shell是成功的。解决方案是检查python行后面的错误级别:如果%ERRORLEVEL%等于0(退出)这将导致shell在python行失败时立即退出,从而导致Jenkins被标记为失败,因为shell上的最后一行失败。
czq61nw15#
在相同的用例中,但以不同的方法处理。在我的例子中,我习惯于构建shell脚本的步骤,因为我需要执行多个步骤,比如git pull,改变分支,激活虚拟环境,执行python脚本,停用虚拟环境等等。我尝试为错误引发异常或在python代码文件中使用sys.exit代码。它仅适用于python脚本。不适用于Jenkins作业。因为在python脚本之后执行了一些步骤,jenkins将执行其余代码。Jenkins作业状态成功结束。因此,我通过以下步骤更新了可能导致Jenkins作业失败的shell脚本步骤。
. . . python3 python_code.py EXIT_STATUS=$? echo "Exit status : $EXIT_STATUS" if [ "$EXIT_STATUS" -ne "0" ] then exit 1 fi . . .
python x python3jenkinsshellscript
pu3pd22g6#
不是让Jenkins运行bash,而是让Python脚本使用
Try{ subprocess.check_call(cmd, args, shell=True) } catch{ raise }
subprocess.check_call使用stderr输出,这也可以更好地直接与Jenkins通信,并允许其他插件(如Failure Cause Management)读取基于正则表达式的构建并使构建失败。任何时候触发此异常,它都会引发退出代码和错误,这将使作业失败,因为Jenkins在任何非零返回代码上失败。您可以阅读有关check_call here的更多信息使用-1或1退出不起作用,因为您看不到真正的错误。
6条答案
按热度按时间00jrzges1#
如果脚本以非零状态退出,则构建应该失败。
0sgqnhkj2#
重要的是,运行python脚本是jenkins工作的最后一步,当它抛出异常或非零异常代码时,如果你在那之后运行任何东西,即使echo“my job is done”也会改变错误代码。
对我来说,下面的例子失败了
当我做下面的工作时,我的Jenkins工作显示为成功
c6ubokkw3#
你可以在任何时候引发异常。如果它没有被处理,应用程序将停止。你甚至不需要指定你要引发的异常。
如果你想指定一个消息,你可以只引发一个标准异常。
xfyts7mz4#
我是一个新手,发现如果你在Jenkins中通过Windows批处理shell运行python脚本,那么公认的答案是缺失的。
在这种情况下,Jenkins只有在shell中最后一个命令失败时才会失败,所以你的python命令可能会失败,但如果在它之后有另一行更改了目录或其他内容,那么Jenkins会认为shell是成功的。
解决方案是检查python行后面的错误级别:
如果%ERRORLEVEL%等于0(退出)
这将导致shell在python行失败时立即退出,从而导致Jenkins被标记为失败,因为shell上的最后一行失败。
czq61nw15#
在相同的用例中,但以不同的方法处理。
在我的例子中,我习惯于构建shell脚本的步骤,因为我需要执行多个步骤,比如git pull,改变分支,激活虚拟环境,执行python脚本,停用虚拟环境等等。
我尝试为错误引发异常或在python代码文件中使用sys.exit代码。它仅适用于python脚本。不适用于Jenkins作业。因为在python脚本之后执行了一些步骤,jenkins将执行其余代码。Jenkins作业状态成功结束。
因此,我通过以下步骤更新了可能导致Jenkins作业失败的shell脚本步骤。
python x python3jenkinsshellscript
pu3pd22g6#
不是让Jenkins运行bash,而是让Python脚本使用
subprocess.check_call使用stderr输出,这也可以更好地直接与Jenkins通信,并允许其他插件(如Failure Cause Management)读取基于正则表达式的构建并使构建失败。任何时候触发此异常,它都会引发退出代码和错误,这将使作业失败,因为Jenkins在任何非零返回代码上失败。
您可以阅读有关check_call here的更多信息
使用-1或1退出不起作用,因为您看不到真正的错误。