Drone.io CI/CD en Docker y Raspberry Pi

Hace unos días estuvimos viendo como instalar Docker en una Raspberry Pi 3 y también vimos como desplegar Gitea en la Raspberry Pi 3. Ahora llega el momento de ejecutar nuestros test de integración automáticamente y si todo está correcto poder generar una “release” de nuestro código.

Conceptos básicos de Drone.io

Drone es una plataforma que permite realizar integración y entrega continua, o lo que viene siendo Continuos Integration y Continuos Delivery. Drone está escrito en Go, lenguaje que nos gusta mucho y hacemos muchos posts sobre él. Además, se integra con gran variedad de sistemas de control de versiones y se puede utilizar para generar nuestro proyecto, ejecutar tests o incluso entregar software.

Drone tiene una arquitectura servidor-agente. Esto significa que Drone se compone de dos o más partes. Una de ellas es el servidor, el resto de partes son los agentes. Estos últimos son los encargados de realizar las tareas que indicaremos a Drone para construir o realizar los test que se requieran.

Construir las imágenes

Drone se puede instalar prácticamente en cualquier lugar, por un lado, porque al estar programado en Go se puede compilar para gran variedad de arquitecturas, y por otro, por que se puede ejecutar fácilmente en Docker. Nosotros vamos a instalar Drone en Raspberry Pi 3 y sobre Docker. Lamentablemente no existe una imagen oficial de Docker para Raspberry Pi, así que tenemos que construirla nosotros.

Ya vimos en este post como construir la imagen Docker de Gitea para Raspberry Pi, de modo que no dedicaremos tanto tiempo a esta sección.

Te puede interesar  Usa y configura SSH "like a boss"

Servidor Drone

Desde un directorio de la Raspberry Pi, por ejemplo ~/drone, creamos dos ficheros Dockerfile, nosotros hemos creado Dockerfile.server, uno para compilar el servidor y otro para compilar el agente. El en fichero Dockerfile del servidor introduciremos el siguiente contenido:

Drockerfile

En el fichero Dockerfile distinguiremos dos líneas. La primera de ellas, la 5 (realmente de la 5 a la 11), es donde instalamos las dependencias necesarias para compilar Drone, obtenemos el propio Drone y nos situamos en el directorio de Drone para poder compilarlo. La segunda línea es la 17, esta línea realiza la compilación de Drone y guarda el binario en /usr/bin/drone-server.

Generar imagen

Para generar la imagen debemos utilizar el comando build de Docker, pero esta vez indicaremos el nombre del fichero (Dockerfile.server) dado que tiene el nombre por defecto y Docker no lo encontrará.

docker build -t cibernomadas/drone-agent -f Dockerfile.server .

NOTA: Fijarse en el punto final, éste es necesario.

Agente Drone

Al igual que hemos hecho en el caso del servidor, vamos a crear un fichero, Dockerfile.agent, en el directorio ~/drone.

Dockerfile

La versión del Dockerfile para el agente de Drone no difiere mucho del Dockerfile del servidor.

La diferencia radica en la línea 17. En esta ocasión se está construyendo el agente en vez del servidor.

Generar imagen

El comando para generar la imagen es idéntico al del servidor, pero obviamente cambiando el nombre del fichero Dockerfile.server por Dockerfile.agent.

docker build -t cibernomadas/drone-agent -f Dockerfile.agent  .

NOTA: Fijarse en el punto final, éste es necesario.

Te puede interesar  Puesta en marcha de Odoo en Debian - Parte 4

Ejecutar Drone

Después de generar las imágenes de Drone server y agent vamos a ejecutar por primera vez Drone.

Como hemos comentado al inicio, Drone se integra con muchos servicios de control de versiones, nosotros utilizaremos Gitea. Puedes ver como integrar Gitea en Raspberry Pi en este post.

Para ejecutar Drone utilizaremos docker-compose, como ya hemos visto en otras ocasiones creamos un fichero docker-compose.yml. En él introduciremos las instrucciones necesarias para ejecutar Drone. El fichero drocker-compose.yml lo situaremos en ~/docker/drone/docker-compose.yml.

En el fichero que hemos utilizado veremos dos secciones principalmente, los servicios y los volúmenes. Los volúmenes los utilizaremos para guardar en la Raspberry Pi los datos que se generen en el contenedor, así mantendremos persistencia. Por otra parte, los servicios contienen dos servicios, el servidor y el agente.

El servidor utiliza la imagen cibernomadas/drone-server, se expone el puerto 8000 para poder acceder a Drone. Podéis ver como también utilizamos el puerto 9000, pero este puerto se utiliza de forma interna para comunicarse el server y el agent. Dentro del server también vemos los volúmenes (volumen), este punto es donde se indica que directorio del contenedor se guardará en la Raspberrry Pi, por último, vemos la sección de environment. Esta última sección será donde configuraremos Drone. Nosotros hemos configurado el servidor para que “se entienda” con Gitea. Las variables de entorno significan lo siguiente:

  • DRONE_OPEN: Permite que los usuarios listados en DRONE_ORGS puedas hacer registrarse en Drone. En este caso no haría falta.
  • DRONE_ADMIN: Usuarios habilitados para hacer login en Drone.
  • DRONE_HOST: Dirección completa de donde se encuentra nuestro Drone.
  • DRONE_GITEA: Configura Drone para utilizar Gitea.
  • DRONE_GITEA_URL: Dirección completa de Gitea.
  • DRONE_SECRET: Token secreto para comunicarse el server de Drone y los agentes.
Te puede interesar  Instalar y configurar Wordfence

Dentro de lo servicios también se define el agente, éste dispone de una configuración más simple que el servidor. La imagen que se utiliza es la de cibernomadas/drone-agent. El volumen que se utiliza es el propio docker.sock, así puede ejecutar contenedores según necesidades o escuchar a cambios en Docker. Por lo que hace a las variables de entorno, se establece DRONE_SERVER, para saber donde está el servidor Drone y DRONE_SECRET, la clave secreta y compartida entre servidor y agentes.

Ejecutamos el comando docker-compose up, o docker-compose up -d si queremos dejar el proceso en segundo plano. Con esto ya tendremos nuestro sistema de CI/CD funcionando.

En la próxima entrada veremos como crear un repositorio en Gitea y automatizar ciertas operaciones.

Si te ha gustado, compártelo
Drone.io CI/CD en Docker y Raspberry Pi
Tagged on:                                                     

Deja un comentario

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