2013-01-02 15 views
7

Nel mio script ant voglio uscire (interrompere l'esecuzione di build) senza fallire quando una condizione è soddisfatta. Ho provato a utilizzare:Arresta lo script ant senza creazione fallita

<if> 
    <equals arg1="${variable1}" arg2="${variable2}" /> 
    <then> 
    <fail status="0" message="No change, exit" /> 
    </then> 
</if> 

Lo script Ant viene arrestato a condizione ma la compilazione non è riuscita. Voglio che la costruzione sia fermata ma senza errori. Sto usando il passo "Invoke Ant" in Jenkins.

Grazie.

+4

Perché un task chiamato ** 'fail' ** fa qualcosa di diverso dal fail? –

risposta

9

vorrei suggerire di refactoring lo script ant riconsiderando il vostro approccio. Se ci si avvicina il tuo problema con "l'esecuzione di una generazione quando una determinata condizione è soddisfatta" invece di "non aver build se un'altra condizione è soddisfatta" è più facile da implementare:

<!-- add on top of your build file --> 
<if> 
    <equals arg1="${variable1}" arg2="${variable2}" /> 
    <then> 
    <property name="runBuild" value="true"/> 
    </then> 
    <else> 
    <property name="runBuild" value="false"/> 
    </else> 
</if> 


<!-- add to the target that shall be executed conditionally --> 
<target name="myTarget" if="${runBuild}"> 
... 

<!-- exit message as separate target --> 
<target name="exitTarget" unless="${runBuild}"> 
    <echo message="No Change, exit" /> 
</target> 
0

Internamente <fail> lancia un BuildException per fallire il processo di compilazione, quindi, finché si utilizza questa attività, si otterrà l'uscita di form ant con errori.

Personalmente non so se ci sia qualche altro compito di "normalmente" uscire dalla compilazione, ma scriverne uno da soli non è affatto difficile.

Scrivi compito che esegue il seguente codice dovrebbe funzionare ...

public void execute() { 
    // do something as you like 
    System.exit(0); 
} 
10

Uso integrato (dal JDK 6) motore javascript, non sono necessarie librerie aggiuntive (antcontrib, ecc.)!

1. Java System.exit()

<script language="javascript"> 
self.log("Ending intentionally \n...\n..\n."); 
java.lang.System.exit(0); 
</script> 

si può ottenere una generazione non riuscita durante l'esecuzione in Eclipse: generazione non riuscita javax.script.ScriptException: sun.org.mozilla. javascript.internal.WrappedException: org.eclipse.ant.internal.launching.remote.AntSecurityException Wrapped => quindi utilizzare API Ant invece

2. api Ant

<script language="javascript"> 
self.log("Ending intentionally \n...\n..\n."); 
project.fireBuildFinished(null); 
</script> 

uscita di Eclipse, viene stampato nessun BUILD SUCCESSFUL:

[script] Ending intentionally 
    [script] ... 
    [script] .. 
    [script] . 
Total time: 410 milliseconds 

uscita della console, COSTRUIRE successo è stampato 2 volte:

[script] Ending intentionally 
    [script] ... 
    [script] .. 
    [script] . 

BUILD SUCCESSFUL 
Total time: 0 seconds 

BUILD SUCCESSFUL 
Total time: 0 seconds 

Wrap in un macrodef per il riutilizzo, fe:

<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}") &lt; parseInt("@{param2}") : "@{param1}" &lt; "@{param2}"; 
    break; 
    case "gt" : 
    b = "@{paramtype}" == "math" ? parseInt("@{param1}") &gt; parseInt("@{param2}") : "@{param1}" &gt; "@{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 &amp;&amp; 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> 

Esempi

<!-- compare int, default paramtype=math and when=true --> 
<stopbuild param1="10" param2="11" condition="lt"/> 

uscita:

[script] Stopping Build because 10 lt 11 is true !! 


<!-- compare strings, default when=true --> 
<stopbuild param1="abc" param2="abcd" paramtype="foo" condition="lt"/> 

uscita:

[script] Stopping Build because abc lt abcd is true !! 
+0

IMO, è una soluzione interessante ma molto più complicata della risposta accettata. – Stephan

+0

non è complicato, anzi è il più semplice. Non è necessario inserire un macrodef, che era solo per la dimostrazione. E dopotutto non ha bisogno di librerie esterne, semplicemente usando il motore javascript integrato. – Rebse

+0

C'è un inconveniente a questo approccio che è higlighted. Questo è il secondo approccio proposto. Questo è piuttosto pesante. – Stephan

Problemi correlati