无法强制退出Jenkins Build

时间:2013-05-17 09:34:25

标签: shell jenkins exit-code

我在这方面遇到了很多麻烦,所以这里就是这样。

我有一个执行以下shell脚本的Jenkins构建:

#!/bin/sh -x
if [ 'grep -c "It misses" log' -gt 0 ];
then exit 1;
fi

我知道grep在找到某些东西时返回1,并且技术上Jenkins应该在非零退出时将构建标记为失败,但jenkins仍然将其标记为成功。 运行脚本时jenkins构建的控制台输出是:

Started by user bla
[project_name] $ /bin/sh -x /var/tmp/hudson41276.sh
+ [ grep -c "It misses" log -gt 0 ] 
Finished: SUCCESS

有人可以帮助我指出我在这里缺少的东西吗?

谢谢, CJ

4 个答案:

答案 0 :(得分:2)

如果我理解正确,如果在文件“log”中找不到“It misses”,则希望作业失败。您可以通过不使用grep的-c选项来执行此操作,只需重定向输出,如下所示:

grep "It misses" log > /dev/null

如果找到短语,Grep将返回0,并且作业将成功。如果找不到该短语,grep将返回1,作业将失败。如果你想要反过来(如果找到短语就失败)只需使用grep -v。 $?当你想确定shell命令的退出状态时,你的朋友是你的朋友。

答案 1 :(得分:1)

问题在于您的脚本,而不是Jenkins。您尝试比较grep的退出代码的脚本部分如下所示:

if [ 'grep -c "It misses" log' -gt 0 ] ...

这甚至不会执行grep。实际上,它只是将字符串与数字进行比较。

您可能正在尝试:

if [ `grep -c "It misses" log` -gt 0 ] ...

注意使用反引号(`)。 Shell将执行grep并用grep。

输出替换反引号

Bonus item:if语句中的条件实际上是一个执行的命令,其退出代码确定执行将继续的位置。那么......为什么不使用grep命令,它是有用的退出代码作为条件? (grep在找到匹配项时将以代码0退出。)

if grep "It misses" log; then
    exit 1
fi

它更短,更易读,性能更好,因为它不需要执行这么多命令。

这样一个简短的if声明甚至可以用一行代替:

grep "It misses" log && exit 1

答案 2 :(得分:0)

试试这个:

#!/bin/sh
set -e
grep -c "It misses" log

set -e:退出第一个错误。

grep -c 'arg':如果没有任何内容,请退出。

答案 3 :(得分:0)

默认情况下,jenkins使用-e启动shell,因此它在第一次出错时存在。

您可以通过

将其关闭
set +e
do failing task..