【问题标题】:Jenkins build passes when the shell script has execution errors in it当 shell 脚本中有执行错误时,Jenkins 构建通过
【发布时间】: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 是最后一个命令,无论您是否失败,这都将成为您的退出代码。要么处理子命令的退出代码并在脚本中明确设置它,要么在 &amp;&amp; 的帮助下链接你的东西以在错误时中止。
  • 除了 Dominik 所说的好建议之外,请查看控制台解析器插件 - wiki.jenkins.io/display/JENKINS/Console+Parser+Plugin

标签: shell jenkins


【解决方案1】:

感谢所有输入。我能够解决这个问题。我在 Jenkins 中安装了“日志解析器插件”,它将解析控制台输出中的 /Error/ 等关键字并使构建失败。

【讨论】:

  • 100% @rajaspeeder。我花了很多时间试图让WHENEVER SQLERROR EXIT SQL.SQLCODE; 无济于事。 Log Parser 是我发现的唯一可靠的方法,可以可靠地检测 Oracle 错误并使运行 oracle 脚本的 Jenkins 作业失败。在我的情况下,我的“解析规则文件”有 1 行:“错误 /ORA-/”接下来,您将日志解析器构建后任务添加到作业的末尾,它将捕获控制台输出中的所有 ORA- 错误并失败工作。太棒了。
【解决方案2】:

这个 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)也正确地捕获和返回状态代码。

【讨论】:

    【解决方案3】:

    以下代码可能对您有所帮助。这就是我对我的问题进行分类的方式。 而不是sudo -u postgres psql &lt;DBName&gt; -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
    

    【讨论】:

      【解决方案4】:

      Jenkins 不会为您提供 SQL 文件错误代码。 Jenkins 只是检查你的 shell 脚本是否被执行,并据此返回一个状态码,该状态码通常为零,因为它正在成功执行 shell 脚本。

      【讨论】:

        猜你喜欢
        • 2020-05-31
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 2020-11-19
        • 1970-01-01
        相关资源
        最近更新 更多