如何通过bash脚本从ant/maven检测构建错误?
我正在编写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是ant任务,另一个是普通的旧的如何通过bash脚本从ant/maven检测构建错误?,bash,maven-2,ant,scripting,Bash,Maven 2,Ant,Scripting,我正在编写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是ant任务,另一个是普通的旧的mvn干净安装。当这两个构建过程中的任何一个出现构建错误时,我想做一些事情 问题是,这些构建将不时包含测试失败或错误,但最终结果是成功的。我相信这些进程返回的状态码($?)应该是0,无论构建失败还是成功,我都可能是错的 那么,对于我的脚本来说,检测最终结果(生成失败/成功)而不从中捕获错误信息(测试错误等)的最佳方法是什么呢?根据以下内容: ant启动脚本(在Windows和Unix版本中)返回j
mvn干净安装
。当这两个构建过程中的任何一个出现构建错误时,我想做一些事情
问题是,这些构建将不时包含测试失败或错误,但最终结果是成功的。我相信这些进程返回的状态码($?)应该是0,无论构建失败还是成功,我都可能是错的
那么,对于我的脚本来说,检测最终结果(生成失败/成功)而不从中捕获错误信息(测试错误等)的最佳方法是什么呢?根据以下内容:
ant启动脚本(在Windows和Unix版本中)返回java程序的返回代码。因此,成功的生成返回0,失败的生成返回其他值
Maven还返回一个非零的错误退出代码。下面展示了如何使用Maven调用API查询此状态
因此,在我看来,您应该能够显式地处理脚本中的返回代码
. 假设您可以忽略与测试等相关的错误代码,如果您不关心这些错误代码
Ant中的错误代码是特定于操作系统的。这些可能会帮助您:
- 以下就是我为得到您想要的结果所做的
<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>
Maven 2返回错误的返回代码(即始终返回0)时存在一些问题。值得注意的是,这在Maven 2.0.9中是固定的 在旧版本中,mvn.bat以以下行结尾:
exit /B %ERROR_CODE%
从Maven 2.0.9开始,最后一行更改为:
cmd /C exit /B %ERROR_CODE%
因此,如果构建失败,将返回非0返回代码。在生成错误的情况下,返回代码为1。如果你不能升级到2.0.9+,你可以考虑修改上面的MVN.BAT以返回正确的代码。
mvn clean test
if [[ "$?" -ne 0 ]] ; then
echo 'could not perform tests'; exit $rc
fi
是一个特殊的shell变量,它包含最近执行的命令的退出代码(无论是否成功终止)$?
表示“不相等”。因此,我们在这里测试-ne
的退出代码是否不等于零mvnclean
mvn clean install
rc=$?
if [ $rc -ne 0 ] ; then
echo Could not perform mvn clean install, exit code [$rc]; exit $rc
fi
“if”语句本身是一个命令,如果成功,它将重置$?变量设置为0。echo也是如此。因此,您必须使用一个中间本地变量,例如$rc来存储“mvn clean install”的返回代码,然后它也可以传递给“exit”命令。bash中内置了一个命令,它正好执行此操作
# exit when any command fails
set -e
我把它放在我的bash脚本的顶部,我从中复制了它
工具应该返回正确的退出状态。实际上,我不确定ant/maven的退出状态是什么,我只是假设即使构建失败,它们也会返回0。那么,你是说当构建失败时,它们将返回非零值吗?这将使我的生活变得更加轻松。如果您的测试有时通过,有时失败,而您对这两种方式都不关心,那么为什么要在构建过程中运行它们呢?这是maven忽视Unix理念并使脚本编写变得困难的几种方式之一。(另一个是在没有任何问题的情况下向控制台打印一堆垃圾——我称之为maven腹泻)。用maven 3代替2没有任何作用。哈哈,maven在我的母语中是“胃”的意思!如果你能详细说明这个答案,那就更好了。为什么这个答案比其他答案更好?我最喜欢这个答案。我在谷歌上搜索了如何在bash脚本中处理来自mvn的错误代码,雷诺的答案完全符合这个要求。在发现mvn将返回一个非零的测试失败代码后,我怀疑Fei最终使用了类似的技术。这几乎是完美的-但是如果你真的想进行字符串比较,我会使用引号(请参阅/搜索“=”),或者“-ne”,这是(无引号)的比较运算符整数。这里您可以找到一个类似的答案,但这一个解释了语法:
# keep track of the last executed command
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
# echo an error message before exiting
trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT