04 septiembre 2021

Usando JFrog Artifactory para distribuir nuestros paquetes

 
En un artículo anterior revisé algunas maneras de generar paquetes debian o rpm para las aplicaciones que desarrollásemos. Pero después de empaquetar tus aplicaciones hay que encontrar una manera para que tus usuarios puedan descargarse e instalarse esos paquetes.

Siempre se pueden dejar los paquetes en la sección de releases de tu repositorio en Github y que tus usuarios lo descarguen de allí, pero la pega de eso será que no habrá una manera fácil de anunciar las actualizaciones y distribuirlas. Es mucho mejor usar un repositorio de paquetes y dejar que el usuario instale el paquete mediante el gestor de paquete de su sistema (por ejemplo apt o yum).

Puedes intentar meter tu paquete en los repositorios oficiale de tu distribución pero probablemente no cumplas los requisitos para ello, por eso un repositorio personal es la vía más factible.

Durante bastante tiempo utilicé Bintray para alojar mis paquetes deb y rpm, pero Bintray finalizó su servicio en marzo de 2021, por lo que tuve que buscar una alternativa. Finalmente encontré JFrog Artifactory, el heredero oficial de Bintray.

JFrog Artifactory tiene una modalidad gratuita para proyectos open source. Si tu proyecto no es tan popular como para superar 50 GB de descarga mensual, esta modalidad debería ser más que suficiente para tus proyectos personales.

La única pega es que Artifactory es más complejo (y completo) que Bintray, por eso es más complejo ponerlo en marcha si lo usas para tus proyectos personales. En este artículo voy a explicar lo que he aprendido hasta ahora para que te resulte más fácil empezar con Artifactory de lo que me ha resultado a mí.

Una vez registrado en la plataforma, se accede al menú de configuración rápida:

Ahí se puede crear un repositorio de cualquiera de los paquetes soportados. Para este artículo voy a usar Debian. Haz click en el icono de Debian y selecciona crear un nuevo repositorio.

En la siguiente ventana se te pide dar un nombre (un prefix) para el repositorio:


En la captura de pantalla he llamado vdist a mi repositorio. Artifactory crea repositorios virtuales, remotos y locales. El único repositorio que me ha resultado útil hasta el momento es el local, por eso cuando sigas este artículo asegurate de seleccionar siempre la opción "debian-local".

La siguiente ventana es engañosamente simple ya que te puede hacer pensar que ya estás listo para subir paquetes siguiendo las instrucciones de las pestañas "Deploy" y "Resolve":

 
El problema es que necesitas configurar algunas cosas antes de que tu repositorio esté completamente funcional, como he tenido que aprender a las duras.
 
Lo primero es que necesitas permitir el acceso anónimo al repositorio para que la gente pueda descargar tus paquetes. Lo que confunde aquí es que el acceso anónimo está configurado (se puede ver el permiso en Administration > Identity y Access > Permissions) pero aparentemente no parece funcionar en absoluto, por lo que cuando intentas acceder a tu repositorio usando apt lo único que consigues es un unauthorized error. La trampa es que premiero necesitas permitir globalmente el acceso anónimo en Administration > Security > Settings:

 


Sólo después de chequear esa opción dejarás de recibir el error al usar apt.

Para que los usuarios configuren sus linux para usar el repositorio, sólo hay que incluir en el fichero /etc/sources.list lo siguiente:

 deb https://dlabninja.jfrog.io/artifactory/<REPOSITORY_NAME>-debian-local <DISTRIBUTION> <COMPONENT>

En mi ejemplo REPOSITORY_NAME es vdist, DISTRIBUTION es el nombre de la distribución a la que nos estamos enfocando (por ejemplo, en Ubuntu, podría ser trusty) y para COMPONENT uso main. Por cierto, dlabninja es el nombre que le dí a mi cuenta cuando me registré en Artifactory, el nombre que le des a la tuya será diferente.

Se podría pensar que ya estás listo para subir paquetes, pero me temo que no es así todavía. Si intentas usar apt para acceder al repositorio en este punto te saldrá un mensaje diciendo que el repositorio no está firmado y que el acceso a él está prohibido. Para solucionarlo hay que crear un par de claves GPG (pública y privada) para firmar los paquetes y subirlos a Artifactory.

Para crear un certificado GPG puedes usar el siguiente comando:


Hay que meter el nombre identificativo, un correo y un password cuando te lo pida. Como nombre suelo usar el del repositorio. Toma nota del password que uses, si lo olvidas no hay manera de recuperarlo. La cadena que empieza en "F4F316" y acaba en "010E55" es el id del certificado. Tu id será similar. Te resultará útil para identificar tu certificado con los comandos gpg.

Puedes sacar una lista de los certificados:


Para subir las claves generadas, primero hay que exportarlas a un fichero. Ese proceso de exportación necesita generar dos ficheros: uno para tu clave pública y otro para tu clave privada:

 

Con el primer comando he exportado la clave pública y con el segundo la privada. Fíjate que le he puesto una extensión para poder identificarlas. Este es un buen momento para guardar esas claves en un lugar seguro.

Para subir esos ficheros a Artifactory necesitas ir a Administration > Artifactory > Security > Keys management:

 

Ahí, selecciona "+ Add keys" en la pestaña de "Signing keys". En la ventana que se abra mete el nombre para la clave (en este caso "vdist") y arrastra sobre la ventana los ficheros de las claves exportadas y mete la contraseña de la clave privada. Cuando lo hagas tendrás tu certificado correctamente importado en Artifactory y listo para ser usado.

Para configurar el certificado GPG en un repositorio ve a Administration > Repositories, selecciona tu repositorio y la pestaña "Advanced". Allí hay un combo "Primary key name" donde puedes seleccionar tu certificado. No olvides pulsar "Save & Finish" antes de salir o se perderán los cambios que hayas hecho:

 

Hecho eso, ddejará de salirte el error de repositorio sin firmar al usar apt, pero te seguirá saliendo el siguiente error:

(Click to enlarge)

En este caso el gestor de paquetes protesta porque aunque el repositorio está firmado con GPG no es capaz de reconocer su clave pública. Para resolverlo hay que subir la clave pública a uno de los servidores de claves PGP gratuitos de manera que nuestros usuarios puedan desscargárselos e importarlos. En estos casos yo suelo mandar mis claves públicas a ubuntu.keyserver.com:


Una vez que un registro público tiene una clave pública se sincroniza con los demás servidores PGP para compartirla. Nuestro usuario debe importar la clave pública y decirle a su gestor de paquetes que la clave pública es confiable. Para hacerlo en nuestro sistema debemos hacer sudo:

Si queremos instalar nuestro propio paquete, tendremos que hacer lo mismo.

Despues de eso, sudo apt update debería funcionar perfectamente:


Por fin estamos ya preparados para subir nuestro primer paquete a nuestro repositorio. Hay dos manera de hacerlo: manualmente y de manera automatizada.

Se pueden subir paquetes manualmente a través del interfaz web de Artifactory yendo a Artifactory > Artifacts > Selecting repository (in my example vdist-debian-local) > Deploy (el botón de la parte superior derecha). Eso abre una ventana emergente donde se puede arrastrar el fichero del paquete. Revisa que el campo de "Target repository" está correctamente fijado al tuyo (es fácil equivocarse y mandar el paquete al repositorio equivocado).

Además de lo anterior, Artifactory te deja subir paquetes desde la línea de comandos, lo que lo hace perfecto para automatizarlo en el marco de fujos de integración continua. Puedes ver el comando necesario en Artifactory > Artifacts > Set me up (el botón de la esquina superior derecha). Eso abre una ventana emergente con una pestaña denominada "Deploy" donde puedes ver el comando necesario para subir paquetes a un repositorio determinado:

Como se puede ver, los comandos tienen "place holders" en muchos campos. Si no estás seguro de qué poner en los campos USERNAME y PASSWORD, ve a la pestaña "Configure" y mete tu contraseña de tu usuario de Artifactory. Luego vuelve a las pestaña "Deploy" para ver cómo los campos de USERNAME y PASSWORD han sido rellenados por tí.