Construyendo tu propio repositorio maven

Utilizando Google Cloud Storage

Oliver Fierro
GDG Cloud Santiago
5 min readApr 13, 2020

--

En este articulo presentaré como crear tu propio repositorio maven de librerías, utilizando el producto Cloud Storage de Google Cloud Platform.

Cloud Storage te permite gestionar en forma muy eficiente el ciclo de vida de tus objetos. Puedes crear diversos buckets, donde puedes almacenar múltiples objetos (documentos, imágenes, documentos, jar). Le puedes asignar a tu bucket una serie de características, incluyendo políticas de respaldo o borrado.

Plugin Publishing de Maven

Esta técnica utiliza un plugin de maven que permite trabajar en forma bastante simple la publicación y descarga de dependencias maven, integrado con tu repositorio privado.

Algunas consideraciones previas que te van a servir para enfrentar mejor este desafío.

Versionamiento de artefactos

Los artefactos versionados pueden clasificarse en snapshot y release. Snapshot suele utilizarse para avanzar la version del artefacto en modo desarrollo. Por su parte, Release quiere indicar una version estable del artefacto. Hay muchos detalles sobre el versionamiento que puedes aplicar, según la complejidad y precision que quieras aplicar en tu gestión de componentes.

Existe una norma referente a la nomenclatura del versionamiento de artefactos. Si quieres indagar en mayor profundidad puedes revisar esta referencia: https://octopus.com/blog/maven-versioning-explained

Para efectos de este ejercicio, vamos a proceder a aplicar los conceptos más básicos:

Nomenclatura de versionamiento

  • Major: Cambio mayor
  • Minor: Cambio menor
  • Incremental: Hotfix
  • Qualifier: Un calificador (por ejemplo: alpha, beta, SNAPSHOT, RELEASE)

SNAPSHOT: versión activa en desarrollo

RELEASE: versión estable del artefacto (generalmente QA o Producción)

El versionado de nuestro artefacto se compondría de la siguiente manera:

<major version>.<minor version>.<incremental version>-<qualifier>

Ejemplos:

  • myartefact-1.0.0-SNAPSHOT.jar
  • myartefact-1.0.0-RELEASE.jar
  • myartefact-1.0-alpha.jar

Cuenta de Servicio Google Cloud Platform

Para poder interactuar con la plataforma de Google Cloud, debes tener instalado el SDK que te permitirá autenticarte y poder utilizar los comandos gcloud.

https://cloud.google.com/sdk/docs/downloads-interactive

Para estos efectos, considera ejecutar “gcloud auth login” y “gcloud auth application-default login”.

https://cloud.google.com/sdk/gcloud/reference/auth/login

https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login

Recuerda configurar tu cuenta de servicio de Google Cloud, con permisos de escritura sobre el bucket que vas a utilizar. Puedes usar tu cuenta de Google (rol de Owner) o crear una nueva cuenta de servicio con el rol específico (rol de Creator/Viewer sobre el bucket). En el caso que crees una cuenta de servicio, recuerda descargar el archivo “json” desde Google Cloud y configurar localmente la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, apuntando al archivo json de tu cuenta de servicio.

$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/serviceaccount.json

Publicar y obtener un artefacto desde un bucket (Cloud Storage)

Utilizaremos como base para este ejercicio un proyecto gradle.

Requisitos

  • Bucket de Cloud Storage

Herramientas

  • intellij
  • gradle 6.3+

Github

https://github.com/oliverfierro77/gcs-mvn-publish.git

https://github.com/oliverfierro77/gcs-mvn-pull.git

Publicando la dependencia

Primero que todo, debes crear un proyecto base en gradle. Puedes utilizar https://start.spring.io/ como apoyo. También puedes descargarte la plantilla de este ejercicio, para ir revisándolo en la medida que avanzas en este desafío.

Una vez que tienes tu proyecto, debes editar el archivo build.gradle e incorporar lo siguiente:

  1. El plugin ‘maven-publish’
  2. La configuración del objeto publishing
  3. La configuración del repositorio: En el valor de la “url”, debes respetar el prefijo “gcs” que es una palabra reservada para hacer referencia al bucket en Google Cloud. En el ejemplo indicado más abajo tenemos:

gcs://: Hace referencia a un bucket de Google Cloud

my-mvn-repository/: Es el nombre de tu bucket en Google Cloud

maven/release: Opcional. Representa el path dentro de tu bucket e indica la clasificación de las versiones de tus artefactos (por ejemplo, snapshot y release).

build.gradle

plugins {
id ‘maven-publish
}
version = ‘0.0.2-RELEASE’
publishing {
publications {
maven(MavenPublication) {
artifact(“build/libs/publisher-${version}.jar”) { //nombre de tu artefacto
extension ‘jar’
}
}
}
repositories {
maven {
url “gcs://my-mvn-repository/maven/release” //path de tu bucket
}
}
}

Ejecuta:

$ gradle clean build publish

Voilà!, ya tenemos nuestro artefacto en Cloud Storage.

bucket de versiones RELEASE
bucket de versiones SNAPSHOT

Descargando la dependencia

Para descargar la dependencia, primero debes crear un proyecto gradle para implementar la lógica que realizará el pull del artefacto desde Cloud Storage.

Una vez que tengas tu nuevo proyecto, simplemente debes ir a tu archivo build.gradle y hacer referencia al repositorio “gcs” y a la dependencia correspondiente. En este caso, vamos a hacer referencia al artefacto “publisher”.

Es importante indicar la versión exacta que vas a utilizar, la cual podría ser una versión en evolución o una versión estable.

build.gradle

version = '0.0.1-RELEASE'repositories {
mavenCentral()
maven {
url “gcs://my-mvn-repository/maven/release
//url “gcs://my-mvn-repository/maven/snapshot”
}
}
dependencies {
compile group: 'com.pudulabs', name: 'publisher', version: "${version}"
}

Ejecuta:

$ gradle clean build

Proyecto pull-publisher

Ya tenemos nuestra dependencia publisher-0.0.1-RELEASE.jar lista para ser utilizada.

Un truco adicional, para poder utilizar tus artefactos snapshot y release a la vez, según el sufijo de su versión:

build.gradle

maven {
def releasesRepoUrl = “gcs://my-mvn-repository/maven/release”
def snapshotsRepoUrl = “gcs://my-mvn-repository/maven/snapshot”
url = version.endsWith(‘SNAPSHOT’) ? snapshotsRepoUrl : releasesRepoUrl
}

Algunos tips adicionales:

  • Si tienes algún comportamiento no consistente en la compilación o actualización de dependencias con gradle, puedes intentar limpiar el cache previamente:

$ rm -rf ~/.gradle/caches/

Espero que les haya ayudado a tener alternativas de versionamiento de sus artefactos, lo cual es uno de los mecanismos mas importantes para controlar el desarrollo de componentes, sobre todo en proyectos complejos con equipos de trabajo de mediana o gran envergadura y/o fábricas remotas.

Próximamente veremos más alternativas de gestión de artefactos, estilo maven. Hasta el próximo desafío.

Un abrazo!

Oliver Fierro

--

--

Oliver Fierro
GDG Cloud Santiago

Cloud Architect & Tech Lead | Speaker & Writter | Co-organizer @GDG Cloud Santiago Chile