Construyendo tu propio repositorio maven:
Utilizando NEXUS
En esta serie de artículos, te mostraré cómo crear y gestionar tu propio repositorio privado de dependencias o librerías compartidas, para ser utilizadas dentro de tus proyectos. De esta forma, podrás además controlar de manera adecuada el ciclo de vida de estos artefactos.
Una librería compartida podría catalogarse como una funcionalidad especializada y empaquetada, de tal forma que pueda ser utilizada por varios proyectos como una dependencia externa. Típicamente las necesidades de tener una librería compartida surgen cuando en un equipo de desarrollo se construyen componentes que son utilitarios y que son de carácter transversal, es decir, varios componentes (microservicios u otros) se pueden beneficiar de dicha funcionalidad estándar. Por ejemplo un traductor de mensajería (de json a objeto Java o viceversa), un convertidor de horarios (de horario local al formato UTC o viceversa), un conector de arquitectura para abstraer la complejidad de integrarse a distintos orígenes y destinos (kafka, pubsub, jms, entre otros).
El otro factor que pudiera hacerte pensar en una librería como dependencia son restricciones para el uso de servicios rest por razones especificas de tu caso de negocio, del componente en si o de la infraestructura.
Es importante establecer un procedimiento para que los equipos de desarrollo puedan acceder a dichas librerías de forma expedita. Otro punto importante es que se propicie una comunidad que le dé soporte a los bug productivos y aporte a la evolución de dichas librerías.
En este contexto, presentaremos dos tipos de repositorio que podemos utilizar para este fin. Un repositorio en Nexus o un repositorio en un Bucket (Cloud Storage de Google Cloud Platform). Tu puedes incursionar en replicar este modelo en otros bucket de otras nubes (AWS, Azure) u otros gestores de repositorios (Artifactory)
Comenzaremos con la gestión de dependencias en un repositorio Nexus.
Utilizando un repositorio Nexus
Nexus es uno de los administradores de repositorios más populares en el mercado. Cuando la compañía quiere publicar una version especifica de algún driver (por ejemplo, un conector de una base de datos o a un servidor de aplicaciones) o una librería corporativa o el equipo de desarrollo necesita publicar un artefacto transversal al proyecto, puede utilizar Nexus como repositorio privado.
Vamos a la acción!
Requisitos:
- Repositorio Nexus (https://www.sonatype.com/product-nexus-repository)
Herramientas y software utilizado:
- Intellij
- Gradle 6.3+
- Java 8
Repositorios:
Subiendo una librería
[github: nexus-publish]
El procedimiento para subir una nueva librería, o una versión de ésta, al repositorio Nexus es muy sencillo. Basta con incorporar en el archivo build.gradle el plugin maven-publish y configurar el objeto publishing y repositories. A continuación se presenta un ejemplo:
build.gradle
plugins {
id ‘maven-publish’
}publishing {
publications {
maven(MavenPublication) {
artifact(“build/libs/$rootProject.name-$version”+”.jar”){
extension ‘jar’
}
}
}
repositories {
maven {
name ‘nexus’
url project.repoUrl
credentials {
username project.repoUser
password project.repoPassword
}
}
}
}
Podemos hacer referencia a las variables mencionadas, desde el archivo gradle.properties, de la siguiente manera:
gradle.properties
repoUrl=https://nexus.mycompany.com/repository/snapshot
repoUser=myuser
repoPassword=mypwd
Una buena práctica para proteger los datos sensibles, es utilizar variables de entorno. De esta manera evitas configurar dichas variables explícitamente en tus proyectos y no expones datos confidenciales. Si tienes un pipeline de CI/CD, éste lo puedes configurar para que dichas variables estén disponibles en el entorno al momento de la compilación.
repositories {
maven {
name ‘nexus’
url System.getenv(‘NEXUS_URL’)
credentials {
username System.getenv(‘NEXUS_USER’)
password System.getenv(‘NEXUS_PASSWORD’)
}
}
}
Para pruebas locales, las variables de entorno (NEXUS_URL, NEXUS_USER, NEXUS_PASSWORD) las puedes configurar desde un terminal de la siguiente manera:
[Mac]:
$ export NEXUS_URL=https://nexus.mycompany.com/repository/snapshot/
$ export NEXUS_USER=myuser
$ export NEXUS_PASSWORD=mypwd
Una vez que hayas ejecutado las variables de entorno, ejecuta:
$ gradle clean build publish
Ya tienes tu artefacto en el repositorio nexus listo para ser utilizado.
Descargando una libreria
[github: nexus-fetch]
Una vez que tenemos nuestras librerías en el repositorio nexus, podemos comenzar a utilizarlas desde nuestros proyectos. Para el proceso de descarga, debes hacer referencia en tu proyecto a la dependencia especifica que requieras y manteniendo la configuración del repositorio nexus dentro de los repositorios maven.
build.gradle
dependencies {
compile group: 'com.pudulabs', name: 'repositories', version:"${version}"
}
Como podemos observar, ya tenemos la librería “repositories” incorporada a nuestro proyecto y podemos comenzar a utilizar sus servicios como parte integra de nuestro entorno de desarrollo.
Nos vemos en el próximo capitulo, que por cierto estará muy entretenido, ya que nos adentraremos en el uso de Cloud Storage como repositorio maven.
Un abrazo!