sábado, 30 de agosto de 2008

FindBugs, Hudson, Groovy y errores de alta prioridad

Usando Groovy encontré una manera fácil de forzar el fallo de un "build" cuando FindBugs haya encontrado problemas con prioridad alta. Este script Groovy puede agregarse en un scritp Ant o como un ultimo paso dentro de un proyecto Hudson. Esto es necesario porque el plugin de Findbugs para Hudson (en la versión estable) no se puede configurar para que marque el build como inestable dependiendo de la cantidad de warnings de ALTA prioridad (aunque esto ya está en desarrollo, e implementado en HEAD).

Usando Groovy + XPath:


import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.*

content = new File("ant_build/findbugs/findbugs-report.xml").getText("UTF-8")

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
doc = builder.parse(new ByteArrayInputStream(content.bytes))
xpath = '/BugCollection/BugInstance[@priority="1"]'
expr = XPathFactory.newInstance().newXPath().compile(xpath)
nodes = expr.evaluate(doc, XPathConstants.NODESET)
if(nodes.length>0) {
throw new RuntimeException("FindBugs reporto ${nodes.length} warning(s) de prioridad ALTA")
}


Usando GPath es mucho más fácil:


def bugCollection = new XmlParser().parseText(content)
highPriorityBugs = bugCollection.BugInstance.findAll { it['@priority'] == '1' }
if(highPriorityBugs.size()>0) {
throw new RuntimeException("FindBugs reporto ${highPriorityBugs.size()} warning(s) de prioridad ALTA")
}


El 'target' de Ant puede definirse así:


<target name="groovy">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
<classpath>
<fileset dir="lib/groovy">
<include name="*.jar"></include>
</fileset>
</classpath>
<groovy>
<!--[CDATA[ // SCRIPT GROOVY AQUI ]]-->
</groovy>
</taskdef>
</target>

.

No hay comentarios: