Python脚本抛异常时Jenkins流水线不失败的解决方法
Jenkins流水线Python异常时不标记失败的问题解决
问题背景
使用以下Jenkins流水线脚本时,即便module脚本因Python内部抛出异常而执行失败,Jenkins始终显示构建成功:
pipeline { agent any stages { stage ('Init') { steps { sh 'cmd /C "C:\\Git\\cmd\\git.exe" submodule update --init --recursive --depth=1' } } stage ('Build') { environment { PATH = "C:\\cygwin64\\bin;C:\\Windows\\system32;C:\\Program Files\\Python310\\Scripts\\;C:\\Program Files\\Python310" } steps { bat 'cmd /C module release || exit /b' } } }
相关脚本内容:
module.bat:
@echo off set -e python submodules/package-tools/module.py %*
module.py关键代码片段:
... raise Exception('Error')
需求:Python抛出异常时,Jenkins自动标记构建失败,且不修改Python脚本本身(最初期望从Jenkins端解决)。
无效尝试
尝试了多种Jenkins bat命令写法,均未解决问题:
bat 'call module release' bat 'call module release || exit /b' bat 'module release || exit /b' bat 'python submodules/package-tools/module.py release'
额外测试发现,执行以下命令时:
bat 'python submodules/package-tools/module.py release & echo %errorlevel%'
Jenkins会解析为:
python submodules/package-tools/module.py release & echo 0
手动在服务器CMD执行该命令返回错误码9009,但Jenkins仍判定阶段成功。
最终解决方案
排查后发现问题出在Python代码中:原脚本通过os.system(...)调用其他Python代码,但未处理返回码。将这部分代码修改为:
rc = os.system('python ... .py ' + args) if rc: sys.exit(n)
修改后,仅使用简单的Jenkins命令即可实现需求:
bat 'module release'
此时Python抛出异常时,Jenkins会正确标记构建失败。
内容的提问来源于stack exchange,提问作者mercury
相关产品推荐
相关产品推荐

