如何通过bash脚本检测ant / maven的构建错误?

问题描述 投票:38回答:5

我正在编写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是蚂蚁任务,一个是普通的老mvn clean install。当这两个构建过程中出现构建错误时,我想要做一些事情。

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

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

bash maven-2 ant scripting
5个回答
46
投票
mvn clean test
if [[ "$?" -ne 0 ]] ; then
  echo 'could not perform tests'; exit $rc
fi
  • $?是一个特殊的shell变量,它包含最近最近执行的命令的退出代码(无论是否成功终止)。
  • -ne代表“不平等”。所以我们在这里测试mvn clean的退出代码是否不等于零。

11
投票

针对Maven 2返回错误返回码(即始终返回0)存在一些问题。特别是在Maven 2.0.9中修复的MNG-3651

在旧版本中,mvn.bat以此行结束:

exit /B %ERROR_CODE%

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

cmd /C exit /B %ERROR_CODE%

因此,如果构建失败,则返回非0返回码。在构建错误的情况下,返回码为1.如果您无法升级到2.0.9+,则可以考虑如上所述修改mvn.bat以返回正确的代码。


5
投票

根据Ant manual

ant启动脚本(在他们的Windows和Unix版本中)返回java程序的返回代码。因此,成功的构建返回0,失败的构建返回其他值。

Maven还会在出错时返回非零退出代码。这里是a link,展示了如何使用Maven Invocation API查询此状态。

因此在我看来,您应该能够在脚本中显式处理返回代码。大概你可以忽略与测试等有关的错误代码,如果你不关心这些错误代码。

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


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>

1
投票

unix / linux的正确解决方案:

mvn clean install
rc=$?
if [ $rc -ne 0 ] ; then
  echo Could not perform mvn clean install, exit code [$rc]; exit $rc
fi

“if”语句本身就是一个命令,如果成功,它将重置$?变量为0.相同的回声。因此,您必须使用中间本地var,例如$ rc来存储来自“mvn clean install”的返回代码,然后它也可以传递给“exit”命令。

© www.soinside.com 2019 - 2024. All rights reserved.