Automatic versioning jar with #Gradle build tool

Desde que comencé a utilizar Gradle en mis proyectos Java hace ya varios años, muchas han sido las tareas que he podido resolver con su ayuda.

Créanme cuando les digo que la administración de dependencias y la automatización de la construcción del proyecto, son tan solo un par de cosas de las muchas que podemos hacer con esta fabulosa herramienta. Y si no, pregúntenle al equipo de Microsoft. 😀

Sin embargo, una de las cosas que no había realizado era justamente automatizar el versionamiento del jar

Gradle Plugins

Al ser una actividad relativamente común, es natural pensar que ya ha sido resuelta por alguien. Y como yo no soy amigo de andar inventando la rueda, lógicamente me dí una vuelta por el catálogo de plugins de Gradle (https://plugins.gradle.org).

Como era de esperar, la lista de alternativas es bastante amplia.

Pero, les puedo decir que ni se molesten en revisarla. Personalmente me he pasado todo un día haciéndolo, e incluso probando muchos de los plugins y la verdad…

Ay, ya! Quien soy yo para quitarles la diversión.

Revísenla y pasen el rato, leyendo documentaciones escuetas y probando soluciones casi siempre complejas o incompletas.

Igual y luego me dejan en los comentarios lo que haya sido su experiencia.

Lo cierto es que, luego de haber invertido todo un día en ello, decidí que Einsten tenía razón cuando dijo:

«Everything should be made as simple as possible, but not simpler.»

Albert Einstein

Así que en lugar de seguir gastando tiempo en probar soluciones ajenas, pase a escribir la propia.

Mi solución

Mi propuesta es realmente simple, pero no por ello menos efectiva.

Definí la siguiente semántica de versionamiento:

[MajorVersion].[MinorVersion].[PatchVersion]-[LabelVersion]([BuildVersion])

Y coloqué en un archivo que nombré: version.properties las definiciones, incluyendo una definición UpgradeVersion que sirve para que podamos configurar el tipo de cambios que estamos realizando y una NoneVersion que utilizo para cuando no queremos que cambie la version.

Los valores validos para UpgradeVersion son:

  • Major
  • Minor
  • Patch
  • None

version.properties

LabelVersion=RC
MajorVersion=1
PatchVersion=1
UpgradeVersion=Patch
BuildVersion=1123
MinorVersion=5
NoneVersion=0

Luego, solo hice dos piezas de código:

Una con la cual recupero y uso los datos para construir el valor que configuro como version, la cual coloqué en el doFirst de la tarea compileJava

Y la otra con la cual realizo la actualización para la siguiente construcción, que coloqué en el doLast

Aquí, quiero hacer un alto para expresar mi agradecimiento a
Malini Kennady y James Justinic por mostrarme el camino…

How to change value in properties file from gradle build.

Malini Kennady

En resumidas cuentas, mi tarea compileJava quedó como les comparto en el archivo automatic-versioning.gradle

automatic-versioning.gradle

compileJava{
	doFirst {
	    def propertyFile = file "/version.properties"
    	def props = new Properties()
    	propertyFile.withReader { props.load(it) }
    	print "Actual Version: "
    	version = props.getProperty('MajorVersion') + '.' + props.getProperty('MinorVersion') + '.' + props.getProperty('PatchVersion') + '-' + props.getProperty('LabelVersion') + '(' + props.getProperty('BuildVersion') + props.getProperty('MajorVersion') + props.getProperty('MinorVersion') + props.getProperty('PatchVersion') + ")"
    	println("version = ${version}")
	}
    doLast {
		def propertyFile = file "/version.properties"
    	def props = new Properties()
    	propertyFile.withReader { props.load(it) }
    	print "Upgrade Version: "
    	println props.getProperty('UpgradeVersion') + "Version"
    	if(props.getProperty('UpgradeVersion')!="None") {
	    	props.setProperty(props.getProperty('UpgradeVersion') + "Version", Integer.toString(Integer.parseInt(props.getProperty(props.getProperty('UpgradeVersion') + "Version"))+1))
	 	}
	 	props.setProperty("BuildVersion", Calendar.getInstance().get(Calendar.MONTH)+1 + "" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "" + Calendar.getInstance().get(Calendar.HOUR_OF_DAY))
	 	propertyFile.withWriter { props.store(it, null) }
 		print "Next Version: version = "
 		propertyFile.withReader { props.load(it) }
	    println props.getProperty('MajorVersion') + '.' + props.getProperty('MinorVersion') + '.' + props.getProperty('PatchVersion') + '-' + props.getProperty('LabelVersion') + '(' + props.getProperty('BuildVersion') + props.getProperty('MajorVersion') + props.getProperty('MinorVersion') + props.getProperty('PatchVersion') + ")"
	}
}

Solo tienen que colocar el fragmento de código del archivo automatic-versioning.gradle en su archivo build.gradle.

Y listo, se habrá hecho la magia.

Como les dije, simple pero efectivo.

Espero te haya parecido útil este artículo

No olvides visitarme en mi perfil de GitHub: https://github.com/era5mx en donde encontrarás esta solución y otras más.

………….

Quiero man.tener.me informado: Seguir en Twitter @eldavid_oficial https://twitter.com/eldavid_oficial

Regálame un ME GUSTA. Y si eres solidario, COMPARTE para que otros puedan aprovecharlo


Un comentario en “Automatic versioning jar with #Gradle build tool

  1. Pingback: Automatic versioning jar with #Gradle build tool – Nettech Post

Deja una respuesta

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.