我得到了Jenkins post build task脚本的奇怪行为。 它的目的是显示松弛的构建错误,如下所示。
编辑:我们的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具有某些内容后,post构建脚本再次正确运行。
我想在日志中找不到实际错误时报告一些常规错误消息(例如,构建失败)。但是当它可用时也报告详细错误消息。
当然很容易在grep错误日志之前插入一些行发送一般消息,以便每次发送这样的一般消息时松弛,但我想知道空ERRORS终止整个脚本的原因。有没有人遇到同样的问题?如果是这样,最后你知道问题的原因吗?谢谢。
答案 0 :(得分:0)
准确地说,当您的代码中错误为空时,Jenkins将终止您的构建,因为当grep命令没有输出时,您的shell errorlevel将自动设置为1,因此它会终止您的构建错误 ERRORS = ,您可以通过打印错误级别值来调试它。 echo $ERRORLEVEL
[linux]或echo %ERRORLEVEL%
[windows]。错误0代表成功,其他错误代码代表失败。如果你想要执行post构建脚本而忽略即使grep输出为空,那么在jenkins build的post build步骤中设置errorlevel值。
ERRORLEVEL=0
尝试以上操作,看看是否有帮助
答案 1 :(得分:0)
正如@prudviraj所解释的那样,问题是你的grep
命令在没有找到任何内容的情况下返回,因此返回退出代码1
。
在此处阅读详细答案: Jenkins Build Script exits after Google Test execution
简而言之:您的脚本是使用/bin/sh -xe
启动的,-e
表示“在发生任何错误时立即失败”,而grep
“错误”则在找不到任何内容时启动。
快速解决方法是在命令之前放置set +e
。 但更好的方法是正确的错误处理,正如我已经链接的其他答案中所解释的那样。