how to detect a build error from ant/maven via a bash script?

后端 未结 6 1102
南笙
南笙 2020-12-29 01:38

I am writing a bash script to automate the build process. There are two major build blocks, one is an ant task and one is a plain old mvn clean install. I want

相关标签:
6条回答
  • 2020-12-29 01:58

    There are a few issues against Maven 2 returning incorrect return codes (i.e. always returning 0). Notably MNG-3651 that was fixed in Maven 2.0.9.

    In older versions, mvn.bat ended with this line:

    exit /B %ERROR_CODE%
    

    From Maven 2.0.9 onwards, the last line was changed to this:

    cmd /C exit /B %ERROR_CODE%
    

    So a non-0 return code is returned if the build fails. In the case of a build ERROR the return code is 1. If you are unable to upgrade to 2.0.9+, you could consider modifying mvn.bat as above to return the correct code.

    0 讨论(0)
  • 2020-12-29 02:09

    Correct solution for unix/linux:

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

    The "if" statement itself is a command and if it is successful, it will reset the $? variable to 0. Same goes for echo. So, you have to use an intermediary local var, for example $rc to store the return code from "mvn clean install", then it can be passed to the "exit" command as well.

    0 讨论(0)
  • 2020-12-29 02:11

    There's a command built-in to bash which performs exactly this.

    # exit when any command fails
    set -e
    

    I put this at the top of my bash scripts, which I copied from this excellent resource.

    # 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
    

    0 讨论(0)
  • 2020-12-29 02:13

    Here is exactly what I do to get the result you want.

        <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>
    
    0 讨论(0)
  • 2020-12-29 02:14
    mvn clean test
    if [[ "$?" -ne 0 ]] ; then
      echo 'could not perform tests'; exit $rc
    fi
    
    • $? is a special shell variable that contains the exit code (whether it terminated successfully, or not) of the most immediate recently executed command.
    • -ne stands for "not equal". So here we are testing if the exit code from mvn clean is not equal to zero.
    0 讨论(0)
  • 2020-12-29 02:15

    According to the Ant manual:

    the ant start up scripts (in their Windows and Unix version) return the return code of the java program. So a successful build returns 0, failed builds return other values.

    Maven also returns a non-zero exit code on error. Here's a link showing how to interrogate this status using the Maven Invocation API.

    So it seems to me that you should be able to explicitly handle the return codes in your script . Presumably you can ignore error codes relating to tests etc. if those are not a concern to you.

    exec error codes in Ant are operating system-specific. These may help you:

    • a list of error codes for Linux
    • a list of error codes for Windows
    0 讨论(0)
提交回复
热议问题