Movimientos sociales en España
Tengo cierto temor a que al final los movimientos que estamos viendo estos días en España sean tergiversados por unos o por otros.
Por eso publico una imagen que circula por las redes sociales y que a mi modo de ver resumen muy bien el origen de los movimientos. Con el contenido de este manifiesto estoy completamente de acuerdo.
Prometo recuperar próximamente la temática del blog. 🙂
Segundo cumpleaños
Hoy hace dos años desde que empecé con este blog y al igual que hice en el primer cumpleaños realizaré un resumen de la temporada.
Si hace un año estaba bastante satisfecho de la marcha del blog, este segundo año no lo estoy tanto. Mi insatisfacción se refiere sobre todo a lo poco que he publicado este año. Cambios laborales y personales (mi segundo hijo) me hacen tener menos tiempo que dedicarle a esto. Sigo aprendiendo cosas pero no saco el tiempo para compartirlas con vosotros. Así que como propósito de enmienda o en grande en esa lista TODO tengo el conseguir ese tiempo para publicar al menos una vez al mes (lejos ya de la entrada o dos entradas semanales que me ponía como objetivo en un principio).
En cuanto a datos de acceso, sigo estando bastante contento. El promedio de visitas diarias ha subido y está en el entrono de las 80, con un record de 174 visitas en un día y 40.945 visitas totales. Para mí está bien.
En cuanto a temas, CakePHP sigue caliente (a ver si le dedico alguna entrada en un futuro próximo).
De nuevo daros las gracias a todos los que visitáis Tus Ceros y Mis Unos, ¡permaneced a la escucha!.
Análisis estático de código en Hudson para proyectos Ant
En esta entrada vamos a explicar cómo configurar algunas herramientas de análisis estático de código en Hudson para proyectos que utilicen Ant.
Partimos de un servidor Hudson instalado (y con una JDK y Ant configurados) y un proyecto que utilice Ant para su construcción (tendremos su build.xml
que compila las fuentes y crea un jar por ejemplo).
Por ahora vamos a integrar tres herramientas de análisis estático de código: PMD, CPD (integrado en PMD) y FindBugs. Necesitaremos descargar y extraer en un directorio ambas herramientas.
Partimos de un script de Ant como el que sigue:
<?xml version="1.0"?> <project name="TCYMU" default="compile" basedir="."> <property name="src.dir" value="${basedir}/src"/> <property name="lib" value="${basedir}/lib"/> <property name="classes" value="${basedir}/classes"/> <target name="clean" description="Limpia el proyecto"> <delete dir="${classes}"/> <delete dir="${dist}"/> </target> <target name="init" description="Crea el directorio de compilacion y destino" depends="clean"> <mkdir dir="${classes}"/> <mkdir dir="${dist}"/> <path id="compile.class.path"> <pathelement path="${lib}/*.jar"/> </path> </target> <target name="compile" description="Compilacion" depends="init"> <javac debug="on" srcdir="${src.dir}" destdir="${classes}" classpathref="compile.class.path"/> </target> </project>
Crearemos una nueva tarea en Hudson, introduciremos un nombre y seleccionaremos la opción de «Crear un proyecto de estilo libre».
Después seleccionaremos una JDK, configuraremos el control de versiones (en mi caso Subversion) y en la sección de «Ejecutar» seleccionaremos «Ejecutar Ant» e introducimos el nombre de nuestra tarea de Ant para compilar. Con esto ya podríamos lanzar la primera ejecución en Hudson para comprobar que funciona.
Para integrar los tres análisis voy a utilizar una misma estrategia basada en variables de entorno que nos permitirá que nuestra configuración Ant sea válida tanto en local como en el servidor Hudson. Para ello en la configuración de Hudson definiremos dos variables de entorno que apunten a los directorios de PMD y FindBugs.
Hecho esto modificamos el build.xml
para incluir las nuevas tareas:
<?xml version="1.0"?> <project name="TCYMU" default="compile" basedir="."> <property environment="env"/> <property name="src.dir" value="${basedir}/src"/> <property name="lib" value="${basedir}/lib"/> <property name="classes" value="${basedir}/classes"/> <property name="reports" value="${basedir}/reports"/> <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"> <classpath> <pathelement location="${env.PMD_HOME}/lib/pmd-4.2.5.jar"/> </classpath> </taskdef> <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"> <classpath> <pathelement location="${env.PMD_HOME}/lib/pmd-4.2.5.jar"/> </classpath> </taskdef> <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> <classpath> <pathelement location="${env.FINDBUGS_HOME}/lib/findbugs-ant.jar"/> </classpath> </taskdef> <target name="clean" description="Limpia el proyecto"> <delete dir="${classes}"/> <delete dir="${dist}"/> </target> <target name="cleanReports" description="Elimina el directorio de compilacion y destino"> <delete dir="${reports}"/> </target> <target name="init" description="Crea el directorio de compilacion y destino" depends="clean"> <mkdir dir="${classes}"/> <mkdir dir="${dist}"/> <path id="compile.class.path"> <pathelement path="${lib}/*.jar"/> </path> </target> <target name="compile" description="Compilacion" depends="init"> <javac debug="on" srcdir="${src.dir}" destdir="${classes}" classpathref="compile.class.path"/> </target> <target name="pmd"> <mkdir dir="${reports}"/> <pmd rulesetfiles="ruleset.xml"> <formatter type="xml" toFile="${reports}/pmd.xml"/> <fileset dir="${src.dir}"> <include name="**/*.java"/> </fileset> </pmd> </target> <target name="cpd"> <mkdir dir="${reports}"/> <cpd minimumTokenCount="50" format="xml" outputFile="${reports}/cpd.xml"> <fileset dir="${src.dir}"> <include name="**/*.java"/> </fileset> </cpd> </target> <target name="findbugs" depends="compile"> <mkdir dir="${reports}"/> <findbugs home="${env.FINDBUGS_HOME}" output="xml" outputFile="${reports}/findbugs.xml" jvmargs="-Xmx1024m"> <sourcePath path="${src.dir}" /> <class location="${classes}" /> </findbugs> </target> </project>
Las novedades que presenta son bastantes:
- Configuro la propiedad
environment
para tener acceso a las variables de entorno. - Configuramos un nuevo directorio que albergará el resultado de los distintos análisis. Es el directorio que he llamado reports.
- Defino las tareas Ant que se incluyen con PMD y FindBugs mediante la etiqueta
taskdef
, y buscando los jars a través de las variables de entorno. - Defino la tarea
pmd
indicando xml como formato de salida, el directorio que contiene el código fuente y el archivo de salida. PMD puede realizar análisis en base a un buen número de reglas. Podemos configurar las reglas que utilizaremos bien mediante etiquetas anidadas en la tarea Ant o mediante un archivo separado de reglas (lo que se indica en la tarea Ant comorulesetfiles
). En mi caso he utilizado para probar la configuración que aparece bajo «Add some rule references to it» en la sección de crear un conjunto de reglas en la web de PMD. En el siguiente enlace podemos encontrar más información sobre la configuración de PMD. - Defino la
cpd
de forma muy parecida a la depmd
. Se indica xml como formato de salida, el directorio que contiene el código fuente y el archivo de salida. Para CPD no hay archivo de reglas. En el siguiente enlace se puede encontrar más información sobre la configuración de CPD. - Defino la tarea Ant para FindBugs. Además de directorio de fuentes y archivo y formato de salida, necesitamos indicarle el directorio de instalación de FindBugs y el directorio donde encontrar las clases compiladas ya que FindBugs las utiliza para su análisis. Por este último motivo declaramos la tarea de
findbugs
dependiente de la de compilación. Más información en el capítulo de tarea Ant de FindBugs.
Para la integración necesitaremos instalar algunos plugins para Hudson. Iremos al apartado de plugins dentro de la configuración de Hudson e instalaremos Static Analysis Utilities, PMD Plug-in, Duplicate Code Scanner Plug-in y FindBugs Plug-in.
Por último modificaremos la configuración de nuestra tarea Hudson. En la sección de «Acciones para ejecutar después» activaremos el visualizador de PMD, CPD y FindBugs. En la configuración de ant lanzaremos las tareas cleanReports
, pmd
, cpd
y findbugs
.
Tras mandar a Hudson que nos ejecute el proyecto obtendremos una salida similar a la siguiente:
y podremos ver detalles de nuestro análisis siguiendo los enlaces:
Hasta aquí esta entrada que seguro no será la última sobre Hudson, seguid atentos.
Comentarios recientes