This short tutorial shows how to get an exit code from Ant and act upon it. This can be useful when building a massive application that requires several Ant scripts/targets and a collection of shell scripts.
The rule of thumb when building the system is “when it should fail -> it should fail”. Sounds weird, but it is really true.
If the whole build of the application takes 15-20 minutes, and one of the libraries failed to build (for example), the whole build should fail. Otherwise, if the build master inspects the logs, and sees something went wrong (in case it is logged), s/he would have to spend another 20 minutes to rebuild it. Or what is even worse, the application could end up in an inconsistent state, without anybody raising a flag, and that would be very dangerous, especially if the current release goes beyond integration builds, for example to quality assurance or even worse – to production.
So, above are the reasons, below is an ultra simple example with a solution:
Let’s say we have an Ant script (build.xml) that checks for duplicate jars in a directory. The target name that does that is “check-duplicate-jars”:
build.xml:
<target name="check-duplicate-jars" depends="some-other-task"> <!-- does its magic here --> </target> |
Let’s say we also have a simple shell script that calls “ant
[user@host]$ ./callant.sh check-duplicate-jars ANT: Running check-duplicate-jars task... Buildfile: build.xml check-duplicate-jars: [echo] Checking for duplicate jars...... [exec] *********** NO DUPLICATE JARS FOUND IN LIB! *********** BUILD SUCCESSFUL Total time: 3 seconds ANT: Return code is: "0" GREAT SUCCESS: Niiice - I liiike! |
This is an expected behavior. However what would be nice is to have this shell script “fail hard”, in case the Ant script (build.xml) fails.
Let’s try to misspell the target name “check-duplicate-jar” (should be plural: “check-duplicate-jars”) and run it:
[user@host]$ ./call-ant.sh check-duplicate-jar ANT: Running check-duplicate-jar task... Buildfile: build.xml BUILD FAILED Target `check-duplicate-jar' does not exist in this project. Total time: 1 second ANT: Return code is: "1" BUILD ERROR: I am failing hard... |
Wonderful – it failed! That is an expected behavior. And here is a sneak peek to the magic box – the “callant.sh” shell script:
#!/bin/bash tname=$1 echo "ANT: Running $tname task..." ant $tname antReturnCode=$? echo "ANT: Return code is: \""$antReturnCode"\"" if [ $antReturnCode -ne 0 ];then echo "BUILD ERROR: I am failing hard..." exit 1; else echo "GREAT SUCCESS: Niiice - I liiike!" exit 0; fi |
Hence the whole magic is here:
antReturnCode=$? |
In general, “$?” will return an exist code of any executable run within the shell script.
Well, now you ready for the massive build process. Get to work, and may the build force be with you! :)