1

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

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

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

我知道 grep 在找到某些东西时会返回 1,从技术上讲,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

4 回答 4

2

如果我理解正确,如果在文件“日志”中找不到“未命中”,您希望作业失败。您可以通过不使用 grep 的 -c 选项来做到这一点,只需像这样重定向输出:

grep "It misses" log > /dev/null

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

于 2013-05-17T20:14:51.853 回答
1

Try this:

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

set -e: Exit at the first error.

grep -c 'arg': Exit 1 if nothing was grepped.

于 2013-05-17T10:19:49.613 回答
1

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

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

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

您可能试图这样做:

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

请注意反引号 (`) 的使用。Shell 将执行 grep 并将反引号替换为 grep 的输出

奖励项目:if语句中的条件实际上是一个被执行的命令,它的退出代码决定了执行将在哪里继续。那么......为什么不使用grep命令,它是有用的退出代码作为条件?(grep找到匹配项时将退出代码 0。)

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

它更短、更具可读性并且性能更好,因为它不需要执行这么多命令。

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

grep "It misses" log && exit 1
于 2014-01-19T23:02:25.187 回答
0

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

您可以通过以下方式将其关闭

set +e
do failing task..
于 2013-05-18T03:24:34.517 回答