Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过bash脚本从ant/maven检测构建错误?_Bash_Maven 2_Ant_Scripting - Fatal编程技术网

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

如何通过bash脚本从ant/maven检测构建错误?,bash,maven-2,ant,scripting,Bash,Maven 2,Ant,Scripting,我正在编写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是ant任务,另一个是普通的旧的mvn干净安装。当这两个构建过程中的任何一个出现构建错误时,我想做一些事情 问题是,这些构建将不时包含测试失败或错误,但最终结果是成功的。我相信这些进程返回的状态码($?)应该是0,无论构建失败还是成功,我都可能是错的 那么,对于我的脚本来说,检测最终结果(生成失败/成功)而不从中捕获错误信息(测试错误等)的最佳方法是什么呢?根据以下内容: ant启动脚本(在Windows和Unix版本中)返回j

我正在编写一个bash脚本来自动化构建过程。有两个主要的构建块,一个是ant任务,另一个是普通的旧的
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
        的退出代码是否不等于零

      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。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