Incluir información de la versión en el artefacto distribuible con Gradle

Publicado por pico.dev el , actualizado el .
blog-stack java planeta-codigo programacion
Comentarios

Tener trazabilidad entre el código fuente y el código que se está ejecutando en el entorno de producción es importante para saber cual es el origen de alguna excepción o error que se produzca. Con Gradle podemos conseguir esta trazabilidad haciendo unas pocas modificaciones al script de construcción.

Java
Gradle

Toda aplicación en último término genera un artefacto destinado a ejecutarse en el entorno de producción o un entregable a su destinatario. En Java según el tipo de aplicación el artefacto es un archivo jar ejecutable, un archivo war si es una aplicación web, un archivo zip si proporcionamos el código fuente o la documentación en formato Javadoc de las clases del proyecto. Un aspecto importante que tarde o temprano nos interesará conocer es que versión de la aplicación y por tanto que código está desplegada en el entorno de producción. Con Gradle no es muy complicado añadir la suficiente información para conseguir esta trazabilidad.

La forma tradicional es dar un número de versión al proyecto, hay diferentes nomenclaturas dependiendo del grado de precisión que necesitemos, suele bastar versión mayor, versión menor, y corrección de errores, los tres números que se van incrementando. Si usamos Jenkins para construir los artefactos nos puede interesar conocer el número de build que lo produjo o la fecha de creación. También nos puede interesar conocer el hash del último commit del código fuente del artefacto. Por otro lado puede que queramos que la aplicación nos informe de la versión que se está ejecutando ya que en algunas corporaciones el acesso al entorno de producción está restringido a sus administradores.

Para conseguir esta trazabilidad haremos dos modificaciones al archivo de construcción de Gradle, modificar el nombre del artefacto con el nombre de la build y el hash del commit e incluir en él un archivo properties con la información de la versión con el que la aplicación sea capaz de informar que versión es la que se está ejecutando. El hash del commit de Git se obtiene con el comando git log -n 1 –format=%h ejecutando con las facilidades que proporciona Groovy.

El nombre del artefacto se modifica con una clase cuyo método toString() proporciona la versión que podemos asignar a la propiedad version de la clase Project definida con el archivo de construcción Gradle. Para proporcionar la información de la versión en la aplicación se incluye un archivo al construir el artefacto modificando la tarea jar y generando el archivo con la tarea createBuildInfoFile. Este es el archivo de construcción de Gradle y la clase que contiene la información de la versión que se coloca en el directorio buildSrc.

En el caso de un artefacto jar Gradle lo genera en build/libs/GradleVersion-1.0.b42.fea4d2f.jar. Ejecutando el jar con java -jar build/libs/GradleVersion-1.0.b42.77c083e.jar cuya clase con el método main informa de la versión leyendo el archivo properties incluído en el jar obtenemos la siguiente salida en la terminal.

En este caso el artefacto que he usado ha sido un archivo jar si se tratase de una aplicación web y de un archivo war en el archivo de construcción de Grade se puede aplicar esto de forma similar. La aplicación podría devolver la versión como una cabecera HTTP o el en código fuente de HTML como un comentario que genere sus páginas web.

El libro Gradle in Action proporciona una aplicación más detallada de muchos conceptos de Gradle, otro buen punto de partida es la propia documentación de Gradle.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando export BUILD_NUMBER=42 && ./gradlew build.