Grails Fu

Grails meets Guru Meditations.

Inserire Il Numero Di Revisione Git Nel Nome Del File War (Modo Semplice)

| Comments

Nel mio ultimo progetto volevo un trovare un modo semplice di inserire il numero di revisione di git nel nome del file war, così ho installato il plugin build-info.

Questo plugin rende disponibile un gran numero di informazioni più o meno utili, tra le quali anche il numero di revisione di un eventuale Software di controllo di versione (Git e Subversion sono supportati). Sebbene non facesse esattamente ciò che volevo ho provato a vedere se, con qualche piccolo hack, sarei riuscito ad inserire il numero di revisione nel nome del file war, ma mi sono accorto che l’applicazione girava senza problemi con un run-app, mentre andava in crash quando cercavo di farla girare come war (run-war). Da un controllo nei file di log è saltata fuori un’eccezione (IllegalArgumentException) con un messaggio specifico: “Malformed \uxxxx encoding”.

La ricerca su Google non mi ha dato molta soddisfazione, se non quella di confermare un’ipotesi iniziale di qualche carattere non permesso in un non meglio specificato property file. Ho provato ad eliminare tutte le ultime modifiche che potessero avere qualche riferimento con l’errore in questione, ma senza ottenere risultati, così ho deciso di provare a rimuovere anche il plugin e, finalmente, l’applicazione è ritornata a funzionare.

Da quello che ho visto nel codice del plugin, nel file application.properties presente nel war erano stati inseriti anche i contenuti delle variabili d’ambiente al momento della creazione dell’archivio, ed è probabile che uno di questi mandasse in tilt la compilazione. Dato che comunque avrei dovuto gestire la cosa da me ho deciso che avrei fatto a meno del plugin (quasi) per intero.

La parte che estraeva il numero di revisione l’ho copiata all’interno del file BuildConfig.groovy, con qualche piccola modifica:

BuildConfig.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
grails.project.war.file = "target/${appName}-${appVersion}-${determineRevision()}.war"
...
def determineRevision() {
    // original code borrowed from build-info plugin
    // https://github.com/mjhugo/grails-build-info/blob/master/scripts/_Events.groovy
    def scmVersion = 'NO VERSION'
    try {
        def command = "git rev-parse HEAD"
        def proc = command.execute()
        proc.waitFor()
        if (proc.exitValue() == 0) {
            scmVersion = proc.in.text.take(5)
        }
    } catch (IOException e) {
        println e
    }
    scmVersion
}

In questo modo nel nome del file war saranno presenti anche i primi cinque caratteri della revisione git.

Comments