我在这方面遇到了很多麻烦,所以这里就是这样。
我有一个执行以下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
答案 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..