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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. Al pulsar en el grupo, nos dirigimos a Settings > CI/CD > Runners y nos aseguramos de que la opción Enable instance runners for this group esté habilitada.

  2. En el panel de la izquierda, buscamos Deploy > Runners. En la parte superior derecha, veremos un botón New 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.