如何在Jenkins Execute Shell中进行错误陷阱?

时间:2018-11-10 04:54:49

标签: git shell jenkins error-handling

我正在执行Shell Jenkins配置中运行大量git操作。我确实看到了正在生成的错误,但是Jenkins的工作仍然显示为成功。我如何捕获以下错误,以使Jenkins作业的状态失败:

错误:无法将某些引用推送到'ssh:// git @ git

编辑jenkins shell git push后,如下所示:

git push“ $ target” --all | grep -z“错误:” &&退出1

即使发生错误,Jenkins作业仍被标记为成功

char buf[1000];
(struct packet*)(buf + N);

EDIT#2所有更改都存在于jenkins的Execute shell(#!/ bin / bash)配置部分中。

脚本:

const deepCopy = origin => {
  let cp;
  switch (typeof origin) {
    case 'object':
      if (origin === null) {
        cp = null;
      } else {
        switch (toString.call(origin)) {
          case '[object Array]':
            cp = origin.map(deepCopy);
            break;
          case '[object Date]':
            cp = new Date(origin);
            break;
          case '[object ReqExp]':
            cp = new RegExp(origin);
            break;

          default:
            cp = Object.keys(origin).reduce((prev, key) => {
              prev[key] = deepCopy(origin[key]);
              return prev;
            }, {});
            break;
        }
      }
      break;

    default:
      cp = origin;

  }
  return cp;
}

输出:

15:24:06  ! [remote rejected] test/test/testBranch ->test/test/testBranch (pre-receive hook declined)
15:24:06 error: failed to push some refs to 'ssh://git@git.testing-repo/test/test-test.git'
15:24:06 hint: Updates were rejected because the remote contains work that you do
15:24:06 hint: not have locally. This is usually caused by another repository pushing
15:24:06 hint: to the same ref. You may want to first integrate the remote changes
15:24:06 hint: (e.g., 'git pull ...') before pushing again.
15:24:06 hint: See the 'Note about fast-forwards' in 'git push --help' for details.
15:24:06 Everything up-to-date
15:24:07 Finished: SUCCESS

编辑#3:实际上,当我在shell中调试$ RESPONSE时,它不包含任何数据,因此它可以解释为什么它不会更改jenkins作业的状态。因此,即使git命令实际上执行了预期的操作,它也没有将命令的输出馈送到$ RESPONSE

编辑#4 RESPONSE = $(git push“ $ target” --all 2>&1 | grep“ error:” || true)达到了目的。

1 个答案:

答案 0 :(得分:2)

此问题很奇怪,因为此git push失败,因此它应返回不同于0的退出代码,然后退出构建。 Jenkin的Execute Shell生成步骤的最后一个命令的退出代码是确定Build步骤成功/失败的原因。 0-成功,其他-失败。如果您可以提供更多数据,也许我可以调试一下。 git push之后返回什么退出代码? (您可以通过键入echo $?来检查上一条命令的退出代码)您还可以添加一些示例吗?

但是请不要担心,我也为您提供了一个简单的解决方法(也许并不漂亮,但是它可以工作)。您始终可以通过自己设置错误代码来手动对Jenkins说失败的构建。在这种情况下,您可以grep进行git push进行错误处理。如果存在,请退出并输入代码1。

git push ... | grep -z "error: failed to push some refs to" && exit 1 || true

或更通用的:

 git push ... | grep -z "error:" && exit 1 || true

编辑

您究竟在哪里运行此git push命令?在执行shell构建步骤中?您使用Jenkins Source Code Management吗? (这将使在Jenkins构建中使用存储库更加容易)

虚拟作业显示exit 1将导致失败:

Build Execute shell Console Output

您总是可以尝试执行更多类似的bash脚本,例如:

RESPONSE=$(git push ... | grep -z "error:" || true)

if [ -n "$RESPONSE" ]; then
  exit 1
fi

此外,我已经在解决方法命令中添加了|| true,因为我忘记了如果没有选择任何行,grep将会exit 1

  

如果选择任何行,则退出状态为0,否则为1

这意味着这将迫使所有构建失败。