当shell脚本中有执行错误时,Jenkins build将通过

当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

我有一个shell脚本,它执行多个更新到数据库的sql文件。我从jenkins-build-executeshell调用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失败(如果任何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-错误,并使作业失败。太棒了。