In my ant script I want to exit (stop executing build) without failing when a condition is met. I have tried to use:
<if>
<equals arg1="${variable1}" arg2="${variable2}" />
<then>
<fail status="0" message="No change, exit" />
</then>
</if>
Ant script is stopped on condition but build is failed. I want to the build to be stopped but with no errors. I'm using "Invoke Ant" step in Jenkins.
Thanks.
Use builtin (since JDK 6) javascript engine, no additional libraries (antcontrib .. etc.) needed !
1. Java System.exit()
<script language="javascript">
self.log("Ending intentionally \n...\n..\n.");
java.lang.System.exit(0);
</script>
you may get a BUILD FAILED when running in Eclipse : BUILD FAILED javax.script.ScriptException: sun.org.mozilla.javascript.internal.WrappedException: Wrapped org.eclipse.ant.internal.launching.remote.AntSecurityException => then use Ant api instead
2. Ant api
<script language="javascript">
self.log("Ending intentionally \n...\n..\n.");
project.fireBuildFinished(null);
</script>
Output Eclipse, no BUILD SUCCESSFUL is printed :
[script] Ending intentionally
[script] ...
[script] ..
[script] .
Total time: 410 milliseconds
Output Console, BUILD SUCCESSFUL is printed 2 times :
[script] Ending intentionally
[script] ...
[script] ..
[script] .
BUILD SUCCESSFUL
Total time: 0 seconds
BUILD SUCCESSFUL
Total time: 0 seconds
Wrap in a macrodef for reuse, f.e. :
<macrodef name="stopbuild">
<attribute name="condition"/>
<attribute name="paramtype" default="math"/>
<attribute name="param1"/>
<attribute name="param2"/>
<attribute name="when" default="true"/>
<sequential>
<script language="javascript">
falsecondition = false;
switch ("@{condition}")
{
case "lt" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") < parseInt("@{param2}") : "@{param1}" < "@{param2}";
break;
case "gt" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") > parseInt("@{param2}") : "@{param1}" > "@{param2}";
break;
case "eq" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") == parseInt("@{param2}") : "@{param1}" == "@{param2}";
break;
default:
self.log("Wrong condition : @{condition}, supported: lt, gt, eq");
falsecondition = true;
}
if(!falsecondition && b == java.lang.Boolean.valueOf("@{when}")) {
self.log("Stopping Build because @{param1} @{condition} @{param2} is @{when} !!");
java.lang.System.exit(0);
// alternatively use
//project.fireBuildFinished(null);
}
</script>
</sequential>
</macrodef>
Examples
<!-- compare int, default paramtype=math and when=true -->
<stopbuild param1="10" param2="11" condition="lt"/>
output :
[script] Stopping Build because 10 lt 11 is true !!
<!-- compare strings, default when=true -->
<stopbuild param1="abc" param2="abcd" paramtype="foo" condition="lt"/>
output :
[script] Stopping Build because abc lt abcd is true !!