当Shell脚本中有执行错误时,Jenkins构建就会通过

时间:2019-09-06 18:10:55

标签: shell jenkins

我有一个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中传递

4 个答案:

答案 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 /之类的关键字,并使构建失败。

相关问题