2009-09-03 45 views
31

我正在写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是ant任务,另一个是普通的旧“mvn clean install”。当这两个构建过程中有构建错误时,我想做一些事情。如何通过bash脚本检测到来自ant/maven的构建错误?

问题是,这些构建将不时包含测试失败或错误,但最终结果是成功的。我相信这些进程返回的状态码($?)应该是0,无论构建失败或成功,我可能是错的。

那么我的脚本在检测最终结果(构建失败/成功)时没有在中间构建(测试错误等)期间捕获错误信息的最佳方式是什么?

+2

工具应该返回正确的退出状态。 – derobert 2009-09-03 18:30:00

+0

我实际上不确定ant/maven的退出状态是什么,我只是假设他们将返回0,即使构建失败。那么你说他们会在构建失败时返回非零值?这会让我的生活变得更轻松。 – fei 2009-09-03 18:56:09

+0

如果您的测试有时会通过并且有时会失败,并且您不以任何方式关心,那么为什么还要将它们作为构建的一部分来运行? – 2014-05-29 05:42:50

回答

4

按照Ant manual

蚂蚁启动脚本(在他们的Windows和Unix版本)返回Java程序的返回码。所以成功的构建返回0,失败的构建返回其他值。

Maven在出错时也会返回一个非零的退出码。这里的a link显示了如何使用Maven Invocation API来询问这个状态。

所以在我看来,你应该能够明确地处理脚本 中的返回代码。据推测,你可以忽略与测试等有关的错误代码,如果这些不是你的问题。

exec Ant中的错误代码是操作系统特定的。这些可以帮助你:

3

这正是我做的就是你想要的结果。

<exec executable="${env.M2_HOME}/bin/mvn" dir="${basedir}" 
      failonerror="true" osfamily="unix"> 
     <arg value="-DskipTests=${argSkipTests}"/> 
     <arg value="-Doffline=${argOffline}"/> 
     <arg line="${projectsLine}"/> 
     <arg line="${resumeFromLine}"/> 
     <arg line="${alsoMakeLine}"/> 
     <arg line="${alsoMakeDependentsLine}"/> 
     <arg line="${commandsLine}"/> 
    </exec> 
11

有对Maven 2的一些问题返回不正确的返回码(即总是返回0)。值得注意的是在Maven 2.0.9中修复的MNG-3651

exit /B %ERROR_CODE% 

从Maven的2.0.9起,最后一行改为这个:

cmd /C exit /B %ERROR_CODE% 

所以非0

在旧版本中,mvn.bat这一行结束如果构建失败,则返回代码。在构建错误的情况下,返回代码为1.如果您无法升级到2.0.9+,则可以考虑修改上面的mvn.bat以返回正确的代码。

36
mvn clean test 
rc=$? 
if [[ $rc -ne 0 ]] ; then 
    echo 'could not perform tests'; exit $rc 
fi 
+4

如果你能详细解释这个答案,那将会好很多。如何以及为什么这回答这个问题比其他答案更好? – nietonfir 2014-05-07 20:29:38

+1

我最喜欢这个答案。我用google搜索了如何在bash脚本中处理来自mvn的错误代码,并且Renaud的答案完全符合法案。我怀疑Fei在发现mvn会返回一个非零代码以用于测试失败之后最终使用了这样的技术。 – 2014-05-29 05:45:18

+0

几乎完美 - 但是我会使用引号,如果您真的想进行字符串比较(请参阅https://www.gnu.org/software/bash/manual/bashref.html /搜索“==”),或“-ne”,它是(未加引号的)整数的比较运算符。 – cslotty 2016-01-27 10:18:57