Hi,
I'm using NAnt as part of a continuous build process managed by
CruiseControl.NET. CCNET determines whether or not a build is a success or a
failure on the basis of the exit code of the NAnt process that carries out the
build. If my NAnt build script fails to execute any tasks (e.g. if any of my
solutions don't compile), then NAnt terminates with a non-zero exit code -
that's all well and good, as CCNET recognises this as a build failure. However,
I also want to explicitly cause a build failure even if all the NAnt tasks
execute successfully. For example, if there are any NUnit tests failures or
FxCop rule violations, the NAnt script won't actually fail (because the NUnit
and FxCop tasks executed successfully). In order to cause the build to fail
when such non-fatal build errors are encountered, I have added a nant.onsuccess
target that executes a <fail/> task if any such errors were detected.
The main thrust of this technique is illustrated by the following cut-down
build script:
<project default="default">
<property name="non-fatal-errors" value=""/>
<target name="default">
... The main build work happens in here. If any non-fatal errors are
detected during the build,
appropriate error messages are appended to the non-fatal-errors
property ...
</target>
<property name="nant.onsuccess" value="on-success"/>
<target name="on-success">
<fail message="Non-fatal build errors detected:${non-fatal-errors}"
if="${string::get-length(non-fatal-errors) > 0}"/>
</target>
</project>
If the NAnt script succeeds, the on-success task runs and tries to explicitly
cause a build failure. If the <fail/> task is called anywhere from within a
'normal' target, a BuildException is raised and NAnt terminates with a non-zero
exit code. However, when a <fail/> task is called from within a
'nant.onsuccess' task, NAnt doesn't terminate with a non-zero exit-code.
I've managed to work around this by modifying the on-success target to write
the non-fatal-error property to a file on disk if it's non-empty
<echo file="error.txt" message="Non-fatal build errors
detected:${non-fatal-errors}" if="${string::get-length(non-fatal-errors) > 0}"/>
and I use a bootsrap NAnt script to first call my main script and then fail if
the main script wrote an error file. This is a rather inelegant solution - it
would be much better if the <fail/> task always caused NAnt to fail, regardless
of which target it executes in. Should the current behaviour be considered a
bug, and does anyone have a more elegant solution to this problem?
Regards,
Chris
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.503 / Virus Database: 269.15.26/1119 - Release Date: 08/11/2007
17:55
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NAnt-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/nant-users