当' {cmd} '的结果在脚本中为空时,Jenkins post构建任务脚本中止



我得到了Jenkins post构建任务脚本的奇怪行为。它的目的是显示slack中的构建错误,如下所示。

编辑:我们的Jenkins运行在Mac OSX Yosemite(10.10.4)和使用Unity3d作为构建工具。

SLACK_BOT_PATH=$WORKSPACE/tools/bot.rb
SLACK_BOT_NAME="cortana"
SLACK_BOT_TOKEN=`cat $WORKSPACE/../../sendchat_token`
ERRORS=`tail -5000 ~/Library/Logs/Unity/Editor${BUILD_NUMBER}.log | grep ": error"`
ruby $SLACK_BOT_PATH $SLACK_BOT_NAME $SLACK_BOT_TOKEN "build fails : $ERRORS"

和奇怪的行为是,当ERRORS没有内容(空字符串)时,它在ERRORS=行中止。Jenkins控制台输出如下:

[workspace] $ /bin/sh -xe /var/folders/j3/8x825bdn2l9dm497yjs2144c0000gn/T/hudson7348609981772923445.sh
+ SLACK_BOT_PATH=*snip*
+ SLACK_BOT_NAME=cortana
++ cat *snip*/../../sendchat_token
+ SLACK_BOT_TOKEN=*snip*
++ tail -5000 ~/Library/Logs/Unity/Editor1710.log
++ grep ': error'
+ ERRORS=
POST BUILD TASK : FAILURE

在我更改grep过滤器后,ERRORS有一些内容,后构建脚本再次正确运行。

我想报告一些一般的错误消息(例如:当在日志中没有发现实际的错误时,构建失败。但也报告详细的错误信息时,它可用。

当然很容易,在grep错误日志之前插入一些发送一般消息的行,以便每次发送这样的一般消息到slack,但是我想知道为什么空ERRORS终止整个脚本。

有人遇到同样的问题吗?如果是这样,最后你知道问题的原因了吗?谢谢。

准确地说,当ERRORS在你的代码中为空时,Jenkins将终止你的构建,因为当grep命令没有输出时,你的shell errorlevel将自动设置为1,因此它以错误ERRORS=终止你的构建,你可以通过打印errorlevel值来调试相同的。echo $ERRORLEVEL [linux]或echo %ERRORLEVEL% [windows]。错误0表示成功,其他错误码表示失败。如果你想要你的post - build脚本被执行忽略,即使grep输出为空,然后设置errorlevel值在post - build步骤的Jenkins构建

ERRORLEVEL=0

试试上面的,看看是否有帮助

正如@prudviraj解释的那样,问题是您的grep命令返回时没有找到任何东西,因此返回退出代码1

在这里阅读详细答案:Jenkins Build Script在Google测试执行后退出

简而言之:您的脚本与/bin/sh -xe一起启动,-e表示"在任何错误上立即失败",而您的grep在没有发现任何错误时"错误"。

快速修复是将set +e放在命令之前。但是更好的方法是正确的错误处理,正如我链接的另一个答案所解释的。

最新更新