我有一个Shell脚本,该脚本执行多个sql文件,这些文件会更新到数据库。我正在从jenkins-build-execute shell调用shell脚本。 jenkins控制台始终显示成功,而不管sql文件中的错误如何。如果出现错误或任何sql文件执行失败,我希望Jenkins生成失败,如果失败,则将控制台输出发送给开发人员。
我在shell脚本中尝试了echo $?
,但显示为0
。
#!/bin/bash
walk_dir () {
shopt -s nullglob dotglob
for pathname in "$1"/*; do
if [ -d "$pathname" ]; then
walk_dir "$pathname"
else
case "$pathname" in
*.sql|*.SQL)
printf '%s\n Executing SQL File:' "$pathname"
sudo -u postgres psql <DBName> -f $pathname
rm $pathname
esac
fi
done
}
DOWNLOADING_DIR=/home/jenkins/DB/
walk_dir "$DOWNLOADING_DIR"
Jenkins控制台结果
ALTER TABLE
ERROR: cannot change return type of existing
DETAIL: Row type defined by OUT parameters is different.
CREATE FUNCTION
ALTER FUNCTION
CREATE FUNCTION
ALTER FUNCTION
Finished: SUCCESS
预期结果:从Jenkins失败(如果任何SQL文件无法从Shell脚本执行),但显示为在Jenkins中传递
答案 0 :(得分:0)
此S / O答案可能会解决您的情况:Automatic exit from bash shell script on error
这个重复的答案还提供了有用的指导:Stop on first error [duplicate]
基本上使用set -e
或#!/bin/bash -e
。
如果您没有捕获所有潜在错误,那么脚本中的下一步将执行,返回代码将是脚本中最后一条命令的返回代码。
直接链接到www.davidpashley.com-Writing Robust Bash Shell Scripts
**这还假定所有外部命令(例如psql)也正确地捕获并返回状态代码。
答案 1 :(得分:0)
以下代码可能会对您有所帮助。这就是我对我的问题进行排序的方式。
代替sudo -u postgres psql <DBName> -f $pathname
使用以下代码:
OUTPUT=$(psql -U postgres -d <DBName> -c "\i $pathname;")
echo $OUTPUT | grep ERROR
if [[ $? -eq 0 ]]
then
echo "Error while running sql file $pathname"
exit 2
else
echo "$pathname - SQL file Executed, successfully"
fi
答案 2 :(得分:0)
Jenkins不会为您提供SQL文件错误代码。 Jenkins只是检查您的Shell脚本是否已执行,并根据该脚本返回成功执行外壳脚本时通常为零的状态代码。
答案 3 :(得分:0)
感谢所有输入。我能够解决此问题。我在Jenkins中安装了“日志解析器插件”,它将解析控制台输出中的/ Error /之类的关键字,并使构建失败。