Generar releases de un proyecto Java con Gradle

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

Utilizar las etiquetas de las herramientas de control de versiones permite conservar ciertos hitos o commits importantes para consultarlos en el futuro. Generar una versión de un proyecto suele implicar generar una etiqueta en la herramienta de control de versiones. Dado que la generación de nuevas versiones es parte del ciclo de vida de un proyecto hay plugins tanto para Maven como para Gradle que ofrecen como funcionalidad automatizar esta proceso.

Java

La generación de releases es una tarea habitual en un proyecto, la release es una forma de identificar de forma exacta la versión que se utiliza para desplegar en un entorno o en producción o es la versión que utilizan otros proyectos para utilizarla como una dependencia.

Hay varias nomenclaturas para denominar a las versiones. En Java hay varios plugins para las herramientas de construcción Maven o Gradle para los proyectos Java que permite generar releases.

Las releases de un proyecto o artefacto

En el ciclo de vida de un proyecto o repositorio hay ciertos hitos importantes como cómo son los momentos en los que se desea generar una nueva versión a partir de un commit ya sea para ser desplegada en un servidor o ser usada por otros proyectos como una dependencia.

Las releases son los commits a los que se les asigna una versión y a partir de los cuales se generan los artefactos del repositorio o proyecto. Una forma de recordar esos hitos en el repositorio de control de versiones como Git es creando un tag. Un tag es simplemente asignar una etiqueta con un nombre más semántico y fácilmente identificable que el hash del commit.

Una forma habitual para los nombres de las versiones o releases es utilizar una nomenclatura compuesta de tres números separados por un punto, por ejemplo 1.2.6, un número mayor en esta versiones implica una versión más reciente y seguramente con más funcionalidades y mejorada. Cada uno de estos números se denominan major.minor.patch donde por norma general el major se incrementa en cada versión destacada o incompatible respecto a las versiones anteriores, minor se incrementa cuando hay cambios importantes con alguna funcionalidad destacada añadida pero que siguen siendo compatibles con versiones anteriores y patch se incrementa cuando los cambios de la nueva versión son menores como corrección de errores o fallos de seguridad pero sin nuevas funcionalidades.

Dado que la construcción y ciclo de vida del proyecto se gestiona generalmente con una herramienta de construcción la generación de releases se automatiza con Maven o Gradle en el caso de proyectos Java.

Plugin de release para Gradle

Gradle no dispone de un plugin oficial para generar releases de un proyectos y hay que recurrir a plugins desarrollados por un tercero. En Gradle hay dos plugins destacables que permiten automatizar la generación de releases en un proyecto. El segundo no ha generado una nueva versión desde hace cinco años con lo que parece más recomendable el primero por estar mejor mantenido actualmente

El plugin de Axion para generar releases la forma que utiliza para generar una release es creando un tag en el repositorio de código fuente siguiendo la nomenclatura major.minor.patch según las etiquetas ya creadas e incrementando el número de uno de estos tres elementos.

Que la release consista simplemente en crear una etiqueta tiene la ventaja de que no es necesario crear commits adicionales en el repositorio de código fuente lo que potencialmente invalida la versión probada en un proceso de aseguramiento de calidad.

Plugin de release para Maven

El plugin de release de Maven es ofrecido de forma oficial por los desarrolladores de esta herramienta de construcción.

Su forma de funcionamiento también incrementa las versiones siguiendo la nomenclatura major.minor.patch pero dado que en Maven la versión del proyecto se especifica en los archivos descriptores de construcción pom.xml implica que el proceso de release crea commits en el repositorio de código fuente.

Ejemplo usando el plugin de release para Gradle

Usar el plugin de Axion en Gradle requiere añadir el plugin en la lista de plugins del proyecto. El plugin ofrece una sección en la que personalizar algunas opciones de configuración según las preferencias que se deseen en la sección scmVersion. Para diferenciar las etiquetas de releases del resto de etiquetas se puede establecer en prefijo, en el ejemplo con la letra v.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
plugins {
    id 'java-gradle-plugin'
    id 'maven-publish'
    id 'pl.allegro.tech.build.axion-release' version '1.13.14'
}

scmVersion {
    tag {
        prefix = 'v'
    }
}

project.with {
    group = 'io.github.picodotdev.blogbitix.build.gradle.plugin'
    version = scmVersion.version
}

repositories {
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    implementation 'net.sourceforge.pmd:pmd:6.44.0'
    implementation 'com.puppycrawl.tools:checkstyle:10.1'
    implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.6'
    implementation 'org.owasp.dependencycheck:org.owasp.dependencycheck.gradle.plugin:7.1.0.1'
    implementation 'org.owasp.dependencycheck:org.owasp.dependencycheck.gradle.plugin:7.1.0.1'
    implementation 'pl.allegro.tech.build:axion-release-plugin:1.13.14'

    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
}

publishing {
    repositories {
        maven {
            name = "ArtifactsRespotiry"
            url = uri("https://maven.pkg.github.com/picodotdev/github-packages")
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
                password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
            }
        }
    }
}

gradlePlugin {
    plugins {
        javaGradlePlugin {
            id = 'io.github.picodotdev.blogbitix.build.gradle.plugin'
            implementationClass = 'io.github.picodotdev.blogbitix.build.gradle.plugin.JavaGradlePluginPlugin'
        }
    }
}

tasks.named('test') {
    useJUnitPlatform()
}
build.gradle

El comando principal para generar una nueva versión es tan simple como utilizar una tarea ofrecida por el plugin.

1
2
$ ./gradlew release

gradlew-release.sh

En la versión actual del proyecto se obtiene con otra tarea añadida por el proyecto. En esencia busca entre los tags en el repositorio y según el commit actual devuelve la versión actual.

1
2
$ ./gradlew currentVersion
Project version: 0.1.1
gradlew-currentversion.sh

Dado que las releases son simplemente etiquetas en el repositorio de código fuente estas pueden verse con el comando de Git para listar las etiquetas.

1
2
3
$ git tag
v0.1.0
v0.1.1
git-tag.sh

El comportamiento por defecto de la tarea release es incrementar el componente menos significativo es incrementado que estando la versión compuesta de tres elementos significa que se incrementa el número de patch, el plugin ofrece también la posibilidad de especificar el número de versión que se desea o incrementar otro elemento.

1
2
3
4
$ ./gradlew markNextVersion -Prelease.version=2.0.0
$ ./gradlew markNextVersion -Prelease.incrementer=incrementMajor
$ ./gradlew markNextVersion -Prelease.incrementer=incrementMinor
$ ./gradlew markNextVersion -Prelease.incrementer=incrementPatch
gradlew-marknextversion.sh

En caso de utilizar GitHub al generar la versión y etiqueta y subirla al repositorio lo añade en la sección de releases en la página de GitHub del proyecto.


Comparte el artículo: