Jenkins 执行 Shell 脚本时不能抓取异常退出码的问题解决

问题描述

如下 Shell 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
do somothing

python script.py
#获取Python命令的退出码
e_code=$?
if [ $e_code -noteq 0 ];then
echo "python script.py failed, exit code is $e_code"
exit 1001
else
echo "python script.py success"
exit 0
fi

在 Jenkins 中执行此脚本时,通过 Shell 调用了 Python 脚本,当 Python 脚本内部异常退出例如遇到 sys.exit(1001),导致异常退出码无法抓取。

原因及解决

这是由于 Jenkins 在执行 shell 脚本时,默认会在命令行中加上 -e 选项,该选项的作用是在脚本中遇到错误时会立即退出。这样可以确保在脚本发生错误时及时停止执行,避免继续执行可能导致更严重问题的命令。

在 Shell 脚本前手动添加 set +e 来禁用该选项。即可继续执行后续命令。

PS:Jenkins 在执行 shell 脚本时,默认会在命令行中加上 -xe 选项, 该选项的作用是在脚本运行时打印每一行命令以及运行中遇到错误时会立即退出。这样可以确保在脚本发生错误立即中断。