Drone.io CI/CD en Docker y Raspberry Pi – Parte II

¡Buenas de nuevo Nómadas! Hace poco que hablamos de instalar Docker en una Raspberry Pi, también vimos cono instalar un servicio de control de cambios con Gitea y ahora, nos queda completar el último post sobre como instalar Drone en la Raspberry Pi.

En este post de hoy veremos como conectar un repositorio Git de Gitea con Drone y como indicarle a Drone que realice ciertas tareas automáticamente.

Crear un repositorio en Gitea

Antes de poder utilizar Drone debemos de tener algún repositorio en Gitea, Github, Bitbucket, Gitlab, etc. Nosotros utilizaremos nuestro repositorio Gitea que instalamos en la Raspberry Pi.

Cuando accedemos a la interfaz de Gitea vemos arriba a la derecha el símbolo más (+). Desde ahí podremos crear nuevos repositorios, migraciones u organizaciones. Elegimos nuevo repositorio y rellenamos el formulario según convenga.

Nuevo repositorio en Gitea

Ahora, dejaremos el repositorio por el momento, luego volveremos.

Formulario de Gitea para un nuevo repositorio

Conectar Drone con Gitea

Drone ya conoce donde está nuestro servidor de Gitea (se lo indicamos en el docker-compose) y por lo tanto ya nos podemos autenticar en Drone con las mismas credenciales que utilizamos en Gitea. Si nuestro usuario está permitido en Drone (también definido en el docker-compose) accederemos al panel principal. Desde el panel principal veremos inmediatamente los repositorios a los que tiene acceso el usuario con el que hemos hecho login.

La verdad que Drone no dispone de una interfaz compleja, ésta contiene un listado de repositorios, la información sobre los “builds” de los mismos y un botón para sincronizar y actualizar el listado de repositorios. También es posible activar o desactivar repositorios para “escuchar” los cambios o no los proyectos de cada repositorio.

Imágenes para RPi

Bueno, ahora que ya tenemos nuestro repositorio de Gitea conectado con Drone, es cuando podremos empezar a realizar acciones automáticas sobre el repositorio. Pero tenemos un problema, y es que las imágenes Docker que se utilizan durante los procesos automáticos en Drone no están disponibles para Raspberry Pi (al menos algunas de ellas). Así que tendremos que crearlas nosotros mismos.

Las imágenes mínimas que necesitamos son dos, una de ellas ya la tenemos pues la utilizamos en la primera parte de este post. La segunda imagen será muy básica y Drone la utilizará para clonar el repositorio desde Gitea.

Te puede interesar  Telegram bots en golang (IV)

Plugins/git

La primera imagen que vamos a adaptar es la que Drone utiliza para clonar. Esta es la utilizada en el plugin-git y el repositorio oficial es https://github.com/drone-plugins/drone-git.

Lo que haremos es clonar el repositorio de plugin-git en la Raspberry Pi 3 en el directorio ~/drone-plugins/drone-git. Desde este directorio editaremos el fichero Dockerfile.arm para ajustar la imagen base.

Cambiaremos la línea 1

por:

Si os fijáis, en la penúltima línea del fichero Dockerfile.arm se indica a Docker que añada el fichero release/linux/arm/drone-git en la ruta /bin/. Así que ahora tenemos que compilar el binario drone-git para nuestras Raspberry Pi 3.

Desde el directorio donde hemos clonado el repositorio drone-git ejecutamos el siguiente comando:

Con este comando Docker nos proporcionara una Shell dentro del contenedor resin/raspberrypi3-alpine-golang. Desde la Shell dispondremos de las variables de entorno GOOS, GOARCH y CGO_ENABLED, así cuando compilemos el binario drone-git éste será valido para nuestra Raspberry Pi 3. Por último, se monta con la opción -v el directorio actual en /go/src/github.com/drone-plugins/drone-git dentro del contenedor, como si hubiéramos clonado el repositorio dentro del contenedor.

Desde la Shell que obtenemos al ejecutar el comando nos situamos en el directorio /go/src/github.com/drone-plugins/drone-git desde el cual ejecutamos el comando:

El comando construirá el binario drone-git que será utilizado durante el comando docker build que construirá la imagen final.

Cuando finalice la compilación salimos de la Shell con el comando exit.

Si se han seguido los pasos, al salir del contenedor estaremos en el directorio donde habíamos clonado el repositorio de drone-git, de no ser así debéis moveros a ese directorio (~/drone-plugin/drone-git). Al salir del contenedor ejecutamos el comando build de Docker tal que así:

Esperamos unos minutos y ya tendremos nuestra imagen lista para utilizarla en Drone.

.drone.yml

Hasta ahora hemos visto como conectar nuestro repositorio de Gitea a Drone, ahora vamos a ver como indicarle a Drone que acciones tiene que realizar con nuestro repositorio.

Lo primero que necesitamos es crear un fichero .drone.yml. Este fichero cumple con el formato YAML, el cual es un lenguaje muy sencillo y fácil de entender. En nuestro primer intento vamos a configurar este fichero en tres partes: workspace, clone y pipeline. Cada uno tiene una funcionalidad que ahora explicaremos, pero si queréis podéis ver toda la documentación en la web oficial. El workspace sirve para compartir un punto de montaje entre los distintos pasos del pipeline, de modo que siempre se puede hacer referencia a la ruta definida en el workspace. Por otra parte, tenemos clone, este punto indica qué imagen utilizará Drone para clonar el repositorio. Aquí es donde indicaremos nuestra imagen recién construida, de lo contrario Drone utilizará otra versión incompatible con Raspberry Pi. Por último, tenemos el pipeline, esto es la secuencia de acciones que realizará Drone de forma automática, que suele ser la forma de construir nuestro proyecto, aunque puede ser casi cualquier cosa que nos interese.

Como podéis ver, en nuestro .drone.yml hemos utilizado las acciones que hemos comentado antes. El workspace es la ruta donde Go encontrará nuestro código, esto es donde este configurado la variable GOPATH, que en la imagen resin/raspberrypi3-alpine-golang es /go. Por otro lado, indicamos que para clonar los proyectos se debe de utilizar la imagen cibernomadas/drone-plugin-git (construida unos pasos más arriba). Por último, el pipeline que utilizamos es muy sencillo, go get para descargar las dependencias necesarias y go build para construir el binario. Si os fijáis estamos utilizando la imagen resin/raspberrypi3-alpine-golang para construir nuestro proyecto cuando lo habitual en Drone sería golang, la imagen oficial de Go para una arquitectura x86 o amd64, pero no arm.

Te puede interesar  Bastionado de Wordpress Paso a Paso

Cuando hagamos un commit y subamos (push) nuestro fichero .drone.yml, Drone reconocerá el cambio y automáticamente se pondrá a ejecutar el pipeline.

Estado de ejecuciones del proyecto

Publicar una release

Lo visto hasta ahora puede parecer simple y realmente lo es, pero Drone tiene muchos más usos como por ejemplo, publicar una nueva release cuando termine el pipeline, o enviar un correo electrónico o una notificación por telegram o ejecutar cierto script en una máquina remota, etc. Podéis ver los plugins que tiene Drone en http://plugins.drone.io/.

Nosotros vamos a utilizar el plugin Gitea-release. El cual nos permitirá crear una nueva release en nuestro proyecto automáticamente.

Actualizar el fichero .drone.yml

El pipeline actual simplemente define como como obtener las dependencias de nuestro proyecto y como construirlo, ahora vamos a añadir como debe de publicarse la nueva release. Lo primero que haremos es generar el binario en una ruta especifica, así el siguiente punto del pipeline podrá acceder al mismo.

Además de modificar la compilación añadimos la configuración del plugin gitea-release.

La configuración es bastante auto-explicativa pero aún así describimos cada variable.

  • image: Imagen Docker a utilizar.
  • title: Titulo de la release
  • base_url: Dirección URL de nuestro Gitea
  • insecure: Indica si la conexión debe hacerse por HTTP o HTTPS, nosotros no utilizamos HTTPS (por ahora).
  • secrets: El token (API Key) con el que Drone se comunicará con Gitea. Ahora veremos como se crea.
  • files: Los archivos que se tienen que subir a la release
  • checksum: Las validaciones en distintos algoritmos de hashsing para el fichero/s de la release.
  • when: Indica cuando debe de ejecutarse esta tarea. Lo habitual es que las release hagan referencia a un tag.
Te puede interesar  Puesta en marcha de Odoo en Debian - Parte 3

El punto más “oscuro” es la parte de secrets, pero en realidad es una forma de ocultar la API Key, ya que si lo pensáis, el fichero .drone.yml queda visible por todo el mundo y no es una buena practica publicar claves. Así que drone soluciona esto con los secrets.

Usar secrets en Drone

Primero vayamos a nuestro Gitea y accedemos a la URL http://<ip de Gitea>/user/settings/applications. Desde ahí generamos un nuevo token, por ejemplo, le podemos dar el nombre Drone CI. Esta acción nos dará un hash que utilizaremos como API Key, así que cópialo y guárdalo, porque cuando cambies o actualices la página ya no lo volverás a ver. Ahora, desde Drone podemos ir a la URL http://<ip drone>/<usuario o organización>/<proyecto>/settings/secrets, en nuestro caso http://<ip raspberry pi>/Nomada/TelegramBot/settings/secrets, o desde el menú se puede acceder a los secrets.

Configuración de secrets en Drone

Desde el panel de los secrets tenemos un formulario donde daremos el nombre con el que queramos hacer referencia al secret, por ejemplo, gitea_token y en el segundo campo del formulario introducimos la API Key que hemos copiado de Gitea.

Drone formulario de secrts

Después de configurar Drone con los secrets y actualizar el fichero .drone.yml ya estamos listos para generar nuestra primera release. Para ello debemos generar un tag y subirlo a nuestro proyecto.

Para crear un tag y subirlo podéis utilizar las siguientes instrucciones desde un directorio donde hayáis clonado el repositorio.

Al finalizar el push veremos como Drone construye el proyecto como hasta ahora, pero, además generará una release en Gitea.

Resultado de auto publicar con Drone

A partir de ahora, solo tenéis que adaptar el pipeline a vuestro proyecto y listo.

Fichero .drone.yml completo:

Drone.io CI/CD en Docker y Raspberry Pi – Parte II
Etiquetado en:                                                     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *