Configurar GitLab Runner Desde 0

Publicado el 2018.03.06

Mi tarea de esta tarde fue configurar un servidor VPS para ser usado como GitLab CI Runner. La idea de tener un runner de CI propio es no depender de los servidores compartidos, que en los momentos de mayor consumo esto puede significar esperas de hasta media hora entre un commit y el inicio del proceso de CI.

Bueno, a continuación el listado de pasos que seguí para dejar todo funcionando.

Configuración Inicial del VPS

El server que usé contaba con una instalación default de Debian 9 Stretch. Me conecté por primera vez al server, con los datos de login (usuario y contraseña, para el usuario root) provistos.

ssh root@server.ip

Creé un usuario tehuel, con el que voy a ejecutar todos los demás procesos

adduser tehuel

Le dí permisos de SUDO a este nuevo usuario. Para esto usé el comando visudo, y agregué una de las siguientes lineas:

tehuel ALL=(ALL:ALL) ALL
tehuel ALL=(ALL) NOPASSWD: ALL

La primera linea es para permitir ejecutar comandos con SUDO, la segunda permite ejecutar esos comandos sin que sea necesario ingresar una contraseña. Dejo constancia de las 2 posibilidades, pero yo agregué sólo una.

Deshabilitar ROOT login

Deshabilité el inicio de sesión del usuario root. Para esto modifiqué el archivo /etc/ssh/sshd_config, y reemplacé:

#PermitRootLogin yes
PermitRootLogin no

Habilitar Key-Based login

Después habilité el inicio de sesión usando pares de claves publica y privada en lugar de usar password. Yo ya contaba con unas claves generadas en mi máquina local, así que lo que necesitaba era asociar esas claves a mi nuevo usuario en el servidor remoto. Para esto, en mi máquina local ejecuté

ssh-copy-id -i .ssh/tehuel.pub tehuel@server.ip

Donde .ssh/tehuel.pub es la ruta (en mi maquina local) a la clave pública que decidí usar. Para terminar esto, me pide la contraseña del usuario, y si todo sale bien es la ultima vez que tengo que ingresar esa contraseña.

[Opcional] Instalación de Docker

Una opción para el runner de GitLab es correrlo usando Docker como executor. Para esto es que primero hay que instalar docker en el VPS donde va a funcionar todo.

La instalación de Docker ha hice siguiendo los pasos indicados en la documentación oficial.

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo docker -v

Ejecutar docker sin usuario root

Tal como lo explican los ‘pasos a seguir después de la instalación en Linux’ de la documentación, lo primero que hay que hacer es permitir el uso de Docker para un usuario no root. Para esto recomiendan crear un nuevo grupo docker (aunque en mi caso ese grupo ya había sido creado en la instalación) y agregar nuestro usuario a este grupo.

sudo groupadd docker
sudo usermod -aG docker $USER

Instalación de docker-compose

Otra vez la referencia es la documentación oficial, la guía de instalación de docker-compose en este caso.

Copié los comandos de Linux que están en la documentación, habiendo comprobado que la versión que se instalaba correspondía con la ultima release en Github

sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Teniendo docker y docker-compose funcionando, ya pude continuar.

Instalación de gitlab-runner

Hay varias opciones para instalar gitlab-runner. Dado que yo estoy usando Debian, y desde GitLab proveen un paquete oficial de instalación, fue el camino que decidí.

Referencia: La documentación oficial de instalación de gitlab-runner en linux.

Con el siguiente script agrego los repositorios de Gitlab, configuro las claves, y otras cosas más.

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

Hay una nota en la documentación indicando que tengo que pinnear la versión runner proveniente de GitLab para que tenga prioridad sobre la proveniente de los repos oficiales de Debian. Esto es debido a que la version de Debian en general está mas desactualizada.

No pude hacer andar el comando que indicaban en la nota, supongo que debido a problemas de copy-paste. Así que edito a mano el archivo.

sudo nano /etc/apt/preferences.d/pin-gitlab-runner.pref

Y dentro de ese archivo es que agrego el contenido:

Explanation: Prefer GitLab provided packages over the Debian native ones
Package: gitlab-runner
Pin: origin packages.gitlab.com
Pin-Priority: 1001

Ahora si, con todos los preparativos listos, procedo finalmente a la instalación de gitlab-runner

sudo apt-get install gitlab-runner

Registro del nuevo gitlab-runner en GitLab

Una vez más, seguir la documentación Oficial.

Ejecuto el asistente de registro, que me va a ir pidiendo los datos necesarios para el registro.

sudo gitlab-runner register

Configuración del Usuario gitlab-runner

Posteriormente a la instalación del runner, decidí usarlo para tareas de deploy hacia otros servidores. Para esto necesitaba que el runner (shell en mi caso) ya cuente con las claves necesarias para la conexión a los servidores. Para esto es que decidí agregar las claves directamente al usuario gitlab-runner.

Pendientes

Creo que voy a tener que separa esto en varios posts distintos, para hacerlo menos confuso y menos extenso que lo que es actualmente.