Evita el tiempo de inactividad ⌚❔ de CI/CD 🚀 con un GitLab Runner autohospedado (self-hosted) usando Docker 🐳
¿Por qué querría tener mi propio runner de GitLab?
Hay varios motivos por los que tener tu propio runner de GitLab es beneficioso en comparación con lo que nos ofrece GitLab por sí mismo o el propio plan gratuito:
-
Reducir los tiempos de compilación y despliegue.
Tener nuestro propio runner equivale a utilizar la máquina que elijamos. Debemos tener en cuenta que GitLab, al final, nos ofrece máquinas que utilizan más usuarios y tienen sus limitaciones. Al tener nuestros propios runners dedicados, sabemos que esos runners solo están trabajando para nosotros.
-
Ejecutar los procesos de CI/CD en tu propio equipo.
Siempre pensamos que cuando tenemos un flujo de CI/CD, debe ejecutarse en un servidor aparte, pero no tiene por qué ser así. Si levantamos, como veremos a continuación, el Docker en nuestra máquina, funcionará exactamente igual que si tuviéramos un servidor dedicado para ello.
-
Presupuesto.
El plan gratuito de GitLab nos ofrece una serie de minutos limitados, pero muchas veces estos no son suficientes. Al tener nuestro propio runner, podemos ejecutar la CI/CD cuantas veces queramos sin las limitaciones del plan gratuito. Esto, combinado con el punto 2, nos puede hacer ahorrar dinero básicamente.
-
Cuando el caos reina a sus anchas.
Es realmente frustrante que no se pueda desplegar en los entornos simplemente porque el entorno de CI/CD se haya caído/no tenga runners disponibles. Lanzando el runner en nuestra máquina, podremos solventar esto.
Requisitos
Para seguir esta guía, evidentemente, el requisito esencial es tener Docker instalado en el equipo en el que se va a lanzar el runner. También es necesario tener permisos de maintainer en el repositorio en el que se encuentra el contenido al que le queremos aplicar nuestro proceso de CI/CD con el runner.
Levantando nuestro runner con contenedores
Para este tutorial, yo voy a utilizar Docker Compose, ya que me parece más cómodo, pero perfectamente se podría utilizar docker run
también.
docker-compose.yml
version: "3.5"
services:
gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./gitlab-runner:/etc/gitlab-runner
restart: always
Como podemos observar en el docker-compose anterior, compartimos el .sock de docker para permitir al runner levantar contenedores. También, en la misma carpeta donde se encuentra el archivo docker-compose.yml
, he creado una carpeta llamada gitlab-runner
, que contiene un archivo config.toml
. En este archivo configuraremos los detalles de nuestro runner. Aqui un ejemplo basico:
config.toml
concurrent = 4
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "My GitLab self-hosted runner"
url = "https://gitlab.com/"
token = "xxxxx"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
shm_size = 0
Importante: Para generar nuestro token, debemos dirigirnos a nuestro repositorio en Settings > CI/CD > Runners
. Al darle a Expandir, encontraremos un botón New Project Runner
.
Seguimos los pasos que nos indica GitLab. Es importante que, si queremos que se aplique a todos los trabajos, seleccionemos la casilla Run untagged jobs
. Al pulsar Create runner
, nos dará el token correspondiente.
Con todo esto, ya tendríamos nuestro runner listo para comenzar a construir nuestras aplicaciones. Recuerda que, evidentemente, tendrás que definir el proceso de construcción en el archivo gitlab-ci.yml
en el correspondiente repositorio.
La URL dependerá de si el repositorio se encuentra alojado en gitlab.com o si su empresa tiene alojada la instancia de GitLab por sí misma que tendrás que cambiar el parámetro indicando la URL.
¿Cómo puedo asignar un runner a un grupo?
El proceso es realmente similar a agregarlo a un repositorio específico.
-
Al pulsar en el grupo, nos dirigimos a
Settings > CI/CD > Runners
y nos aseguramos de que la opciónEnable instance runners for this group
esté habilitada. -
En el panel de la izquierda, buscamos
Deploy > Runners
. En la parte superior derecha, veremos un botónNew group runner
. Seguimos los pasos y al final nos dará un token, al igual que cuando agregamos el runner a un repositorio específico. Lo agregamos a nuestra configuración y con ello ya lo tendríamos preparado.