Grails tip: mostrar la fecha y último commit de tu build

Un pequeño truco para saber en todo momento que versión de nuestra aplicación Grails hemos desplegado en nuestro servidor. La idea es que, cuando construyamos nuestro war, se introduzcan algunos valores en el application.properties, como la fecha+hora actual y el id del último commit de Subversión con el que se ha hecho la compilación. Después, crearemos un servicio que nos muestre esta información en un controlador, de manera que la podamos consultar o consumir desde algún script por ejemplo.

Modificando el application.properties durante la compilación.

Creamos un fichero llamado _Events.groovy en la carpeta scripts de nuestro proyecto (o si nuestro proyecto se compone de varias aplicaciones Grails y usamos un plugin in-place común para todas, lo podemos incluir en este plugin in-place)

import org.tmatesoft.svn.core.internal.io.dav.*
import org.tmatesoft.svn.core.internal.io.fs.*
import org.tmatesoft.svn.core.internal.io.svn.*
import org.tmatesoft.svn.core.wc.*

eventWarStart = { type ->

    DAVRepositoryFactory.setup()
    SVNRepositoryFactoryImpl.setup()
    FSRepositoryFactory.setup()

    SVNWCClient wcClient = SVNClientManager.newInstance().WCClient
    SVNInfo svninfo = wcClient.doInfo(new File(basedir), SVNRevision.WORKING)
    def svnCommit = "#${svninfo.revision.number} - ${svninfo.committedDate.format("yyyy-MM-dd HH:mm:ss")} (${svninfo.author})"
    println "| Commit: ${svnCommit}"

    metadata.'build.svn.commit' = svnCommit.toString()
    metadata.'build.date' = new Date().format("yyyy-MM-dd HH:mm:ss")
    metadata.persist()

}

Mostrando la información

Después creamos un controlador llamado SystemInfoController.groovy (o como queramos)

class SystemInfoController {
    def grailsApplication
    def index() {
        def versionInfo = "${grailsApplication.metadata.get("app.name")}-${grailsApplication.metadata.get("app.version")}
"+
                          "Build date: ${grailsApplication.metadata.get("build.date")}
"+
                          "SVN ${grailsApplication.metadata.get("build.svn.commit")}
"
        render versionInfo as String
    }
}

Ahora, después de construir con grails war y desplegar nuestra aplicación, solo tenemos que ir a nuestro proyecto: http://localhost:8080/mi-app/systemInfo y veremos algo como esto:

mi-app-1.5.0
Build date: 2012-03-29 16:16:44
SVN #1472 - 2012-03-29 16:16:20 (avilches)

Con esta información podremos saber la fecha exacta de la compilación y evitar esa típica situación de no saber si esta realmente desplegada la última versión o no (que siempre se resuelve mirando el tamaño del war generado y comparándolo con el del war desplegado, borrando todos los temporal, contruyendo y desplegando desde cero otra vez)