【发布时间】:2020-01-09 14:43:16
【问题描述】:
我有一个 shell 脚本,它执行多个更新数据库的 sql 文件。我从 jenkins-build-execute shell 调用 shell 脚本。无论 sql 文件中的错误如何,jenkins 控制台始终显示成功。如果出现错误或任何 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 中传递
【问题讨论】:
-
Jenkins 控制台输出快进 get_factory_view.sql | 2 +- 1 个文件已更改,1 个插入 (+),1 个删除 (-) OK 错误:“已创建”第 1 行或附近的语法错误:已创建或替换函数 public.set_view( ^ 0 0 已完成:成功
-
确保将失败条件转发到脚本的退出代码。在您的示例中,如果
rm是最后一个命令,无论您是否失败,这都将成为您的退出代码。要么处理子命令的退出代码并在脚本中明确设置它,要么在&&的帮助下链接你的东西以在错误时中止。 -
除了 Dominik 所说的好建议之外,请查看控制台解析器插件 - wiki.jenkins.io/display/JENKINS/Console+Parser+Plugin