如果执行shell失败,jenkins不会失败

作为我的构build过程的一部分,我正在运行一个git commit作为执行shell步骤。 但是,如果在工作区中没有任何更改,Jenkins将无法构build,因为git因为没有提交更改而返回错误代码。 我想要中止构build,或者只是把它标记为不稳定的,如果是这样的话。 有任何想法吗?

命令失败时停止进一步执行:

command || exit 0

命令失败时继续执行:

command || true

Jenkins默认使用/bin/sh -xe执行shell构build步骤。 -x表示打印执行的每个命令。 -e表示如果脚本中的任何命令失败,则退出失败。

所以我想你的情况发生了什么事是你的git命令退出1,并且由于默认-e param,shell拿起非0退出代码,忽略脚本的其余部分,并标记为失败的步骤。 如果您可以在这里发布您的构build步骤脚本,我们可以确认。

如果是这样的话,你可以尝试使用#!/bin/sh这样脚本就会被执行而没有选项; 或者在构build步骤之上执行set +e或任何类似的操作来覆盖此行为。


编辑:另外需要注意的是,如果shell脚本中的最后一个命令 返回非0代码 ,则即使使用此设置,整个构build步骤仍将标记为失败。 在这种情况下,您可以简单地在末尾加上一个echo命令来避免这种情况。

另一个相关的问题

如果没有任何推git返回退出状态1.执行shell构build步骤被分别标记为失败。 你可以使用OR语句|| (双pipe)。

 git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.' 

这意味着,如果第一个失败(返回退出状态> 0),执行第二个参数。 第二个命令总是返回0.当没有任何东西要推(退出状态1 – >执行第二个命令)时,echo将返回0,并继续构build步骤。

要将构build标记为不稳定,可以使用构build后步骤Jenkins Text Finder。 它可以通过控制台输出,匹配模式(你的回声)和标记build立不稳定。

Jenkins通过该步骤的返回值来确定步骤的成功/失败。 对于shell的情况,应该是最后一个值的返回。 对于Windows CMD和(POSIX)Bash shell,您应该能够使用exit 0作为最后一个命令手动设置返回值。

我能够使用这里find的答案得到这个工作:

如何git没有提供任何错误?

 git diff --quiet --exit-code --cached || git commit -m 'bla' 

在标题中的(更一般的)问题 – 为了防止jenkins失败,你可以防止它看到退出代码1.例如ping:

 bash -c "ping 1.2.3.9999 -c 1; exit 0" 

现在你可以得到ping的输出:

 output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"` 

当然不是ping ...你可以使用任何命令 – 包括git commit

您可以使用文本查找程序插件 。 它将允许您检查输出控制台的expression式,然后将构build标记为Unstable

还有另一种顺利的方式告诉jenkins不要失败。 您可以在构build步骤中隔离您的提交,并将shell设置为不失败:

 set +e git commit -m "Bla." set -e 

下面的作品只是在有变化的情况下才提交。 所以如果提交失败,构build只会失败。

 hg id | grep "+" || exit 0 hg commit -m "scheduled commit" 

如果你把这个命令放到shell中:

 false true 

你的构build将被标记为失败(至less1个非零退出代码),所以你可以添加(set + e)来忽略它:

 set +e false true 

不会失败。 然而,即使在(set + e)的情况下,这也会失败:

 set +e false 

因为最后一个shell命令必须以0结束。