当shell脚本中有执行错误时,Jenkins build将通过
我有一个shell脚本,它执行多个更新到数据库的sql文件。我从jenkins-build-executeshell调用shell脚本。jenkins控制台始终显示成功,而不考虑sql文件中的错误。如果出现错误或任何sql文件执行失败,我希望Jenkins使构建失败,如果失败,则将控制台输出发送给开发人员 我在shell脚本中尝试了当shell脚本中有执行错误时,Jenkins build将通过,shell,jenkins,Shell,Jenkins,我有一个shell脚本,它执行多个更新到数据库的sql文件。我从jenkins-build-executeshell调用shell脚本。jenkins控制台始终显示成功,而不考虑sql文件中的错误。如果出现错误或任何sql文件执行失败,我希望Jenkins使构建失败,如果失败,则将控制台输出发送给开发人员 我在shell脚本中尝试了echo$?,但它显示了0 #!/bin/bash walk_dir () { shopt -s nullglob dotglob for pat
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失败(如果任何sql文件从shell脚本执行失败),但在Jenkins中显示为已传递 此重复答案还提供了有用的指导: 基本上使用
set-e
或#/bin/bash-e
如果没有捕获每个潜在错误,那么脚本中的下一步将执行,返回代码将是脚本中最后一个命令的返回代码
直接链接至www.davidpashley.com-
**这还假设任何外部命令(例如:psql)也能正确捕获和返回状态代码。下面的代码可能会对您有所帮助。这就是我和我的问题的分类方式。 而不是
sudo-u postgres psql-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
OUTPUT=$(psql-U postgres-d-c“\i$pathname;”)
echo$OUTPUT| grep错误
如果[[$?-eq 0]]
然后
echo“运行sql文件$pathname时出错”
出口2
其他的
echo“$pathname-已成功执行SQL文件”
fi
Jenkins不会向您提供SQL文件错误代码。Jenkins只是检查您的shell脚本是否执行,并基于此返回一个状态码,该状态码通常为零,因为它正在成功执行shell脚本。感谢所有的输入。我能够解决这个问题。我在Jenkins中安装了“LogParser plugin”,它将解析控制台输出中的关键字,如/Error/,并使构建失败 Jenkins控制台输出快进get|u factory_view.sql | 2+-1个文件已更改,1个插入(+),1个删除(-)确定错误:在“已创建”行或其附近出现语法错误1:已创建或替换函数public.set_view(^0 0已完成:成功请确保将失败条件转发到脚本的exitcode。在您的示例中,如果rm
是最后一个命令,则无论您是否失败,这都将成为您的退出代码。请处理子命令的退出代码并在脚本中明确设置它,或者使用帮助链接您的内容除了Dominik所说的(这是一个很好的建议)之外,请查看控制台解析器插件-100%@Rajaspeder。每当SQLERROR退出SQL.SQLCODE;时,我花了很多时间试图获取,但都无济于事。日志解析器是我发现的可靠检测Oracle错误并使Jenkin失败的唯一可靠方法s作业运行oracle脚本。在我的示例中,我的“解析规则文件”有一行:“error/ORA-/”接下来,在作业末尾添加一个日志解析器后期生成任务,它将捕获控制台输出中的所有ORA-错误,并使作业失败。太棒了。