Repositorio de artefactos privado con Nexus
Escrito por
el .
java
planeta-codigo
programacion
Enlace permanente
Comentarios
Los repositorios de software almacenan los artefactos, son utilizados por las herramientas de construcción que los descargan y almacenan de forma local para posteriores usos las dependencias que los proyectos declaran en el archivo de construcción. Los desarrolladores de los artefactos publican en los repositorios de software las nuevas versiones. Nexus es un repositorio de software con soporte para repositorios de software de varios tipos, Maven para Java, imágenes de Docker, paquetes npm para JavaScript además de artefactos para los lenguajes Python y Go.
Los proyectos de software son complejos, las librerías permiten crear módulos de las aplicaciones y reutilizar código ya implementado sin tener que implementar la misma funcionalidad en cada proyecto. Todos los lenguajes de una forma u otra permiten reutilizar librerías. En Java las librerías son archivos jar, en Docker imágenes de contenedores y en JavaScript paquetes npm.
Para reutilizar las librerías los proyectos declaran las librerías de las que dependen, la herramienta de construcción se encargan de descargarlas y almacenarlas en un repositorio local para evitar una nueva descargacon su transferencia de red en usos posteriores. En Java las herramientas de construcción Gradle y Maven automatizan la descarga y enlazado de las dependencias declaradas con el código del proyecto. Para JavaScript una herramienta de dependencias es npm.
Las librerías requieren de la funcionalidad de un repositorio de librerías o artefactos que permite descargarlas cuando un proyecto las declare como dependencias. En Java el repositorio más popular es Maven Central, las imágenes para iniciar un contenedor de Docker también tienen su propio repositorio de imágenes de Docker con Docker Hub o el repositorio de librerías JavaScript que utiliza npm.
Los repositorios anteriores son públicos donde los desarrolladores suben sus artefactos cada vez que publican una nueva versión de sus librerías o frameworks. Una organización en sus proyectos utiliza numerosas dependencias de los repositorios oficiales de cada lenguaje o herramienta pero también con seguridad desarrollará sus propias librerías que necesita compartir en diferentes proyectos de forma interna sin compartirlos en los repositorios públicos.
Contenido del artículo
Repositorio de artefactos con Nexus
Nexus es un software que ofrece la funcionalidad de repositorio de artefactos. Permite a una organización compartir de forma privada los artefactos entre los diferentes proyectos. Soporta diferentes tipos de repositorios según el tipo de artefactos, librerías jar para Java, paquetes npm para JavaScript, imágenes de contenedores para Docker, paquetes de Python y Go.
Nexus OSS es la versión de código abierto que permite su uso sin coste, la versión Nexus Pro tiene características empresariales como autenticación SSO.
Github Packages permite hacer las funcionalidades de repositorio de artefactos pero no soporta todos los tipos de artefactos de todos los lenguajes. Google Artifact Registry también ofrece un servicio para almacenar los artefactos resultado de compilación, Amazon con AWS CodeArtifact también tiene su servicio administrado de artefactos.
Ejemplo de repositorio con Nexus
Nexus ofrece una imagen de Docker que permite iniciar el servidor de Nexus de forma fácil como un contenedor. El siguiente script lo inicia en el puerto 8081 y en el puerto adicional 8082 para el repositorio de Docker.
|
|
El usuario administrador es admin y la contraseña aleatoria generada al inicio del contenedor se almacena en el archivo /nexus-data/admin.password del sistema de archivos del contenedor.
|
|
Publicar un artefacto a un repositorio Maven local
Usando Gradle o Maven las dependencias de un proyecto se cachean en un directorio local del directorio de inicio del usuario, ~/.gradle o ~/.m2. Al desarrollar es posible publicar una versión de una librería en estos repositorios de caché. Para publicar un artefacto en un repositorio de Maven con Gradle se utiliza el plugin Maven Publish.
|
|
Publicar un artefacto a un repositorio Maven en Nexus con Gradle
Gradle ofrece el plugin Maven Publish para publicar artefactos en repositorios de Maven. Hay que configurar y definir los artefactos y los repositorios en los que se puede publicar. El plugin añade varias tareas de Gradle con las que elegir de forma específica que artefacto publicar, en que repositorio, el grupo del artefacto, su nombre y versión.
Este es un archivo de construcción de Gradle con un repositorio Maven de Nexus en el que publicar los artefactos de la librería.
|
|
|
|
Una vez publicado el artefacto otro proyecto puede declararlo como una dependencia en la sección dependencies y añadir el repositorio de Maven donde buscar dependencias en la sección repositories. Al ejecutar el programa Gradle descarga la dependencia y la añade al proyecto como cualquier dependencia del repositorio de mavenCentral.
|
|
El programa trata las clases de la librería del repositorio de Nexus como cualquier otra clase de una librería de Maven Central.
|
|
|
|
|
|
|
|
Publicar una imagen Docker a un repositorio repositorio en Nexus
Para usar el repositorio de imágenes de Docker en Nexus es necesario crear un repositorio y configurar Nexus para que se ubique en un puerto diferente del del puerto estándar. En este caso el contenedor de Docker de Nexus además del puerto 8081 se inicia en el puerto 8082.
Para subir una imagen de un contenedor al repositorio hay que crear su tag y realizar la subida de la imagen. Crear una imagen de Docker con un Dockerfile genera una imagen de un contenedor en el repositorio local, una vez se ha generado se le añade la etiqueta y se sube al repositorio.
|
|
Una vez la imagen del contenedor se ha subido se puede utilizar especificando la URL del repositorio de imágenes. Para comprobar que la imagen se descarga del repositorio de Nexus primero se elimina de la caché local.
|
|
|
|
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub.