Executors - Shell, Docker y mas
Executors
El executor define como el runner ejecuta los jobs. Cada executor tiene diferentes niveles de aislamiento, rendimiento y complejidad.
Comparativa rapida
| Executor | Aislamiento | Setup | Ideal para |
|---|---|---|---|
| Shell | Ninguno | Simple | Scripts basicos, tareas del sistema |
| Docker | Contenedor | Medio | Mayoría de proyectos |
| Docker Machine | Contenedor + VM | Complejo | Autoscaling |
| Kubernetes | Pod | Complejo | Infraestructura K8s existente |
| SSH | Ninguno | Simple | Maquinas remotas |
| VirtualBox | VM | Medio | Aislamiento completo |
Shell Executor
Ejecuta comandos directamente en la maquina donde corre el runner.
[[runners]]
executor = "shell"
Ventajas: Sin overhead, acceso directo al sistema, facil de depurar.
Desventajas: Sin aislamiento, los jobs pueden dejar basura, dependencias globales.
Cuando usarlo: Tareas de sistema como deploys, backups, o cuando necesitas acceso al hardware.
Docker Executor
Cada job se ejecuta en un contenedor Docker limpio.
[[runners]]
executor = "docker"
[runners.docker]
image = "node:20-alpine"
privileged = false
volumes = ["/cache"]
Ventajas: Aislamiento por job, entorno reproducible, limpieza automatica.
Desventajas: Overhead de crear contenedores, Docker-in-Docker es complejo.
Cuando usarlo: El 90% de los casos. Builds, tests, linting, generacion de artefactos.
Docker-in-Docker (DinD)
Para construir imagenes Docker dentro de un job:
build_image:
image: docker:24
services:
- docker:24-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
script:
- docker build -t mi-app:latest .
Docker socket binding (alternativa)
Monta el socket Docker del host (menos seguro, mas rapido):
[runners.docker]
volumes = ["/var/run/docker.sock:/var/run/docker.sock"]
Kubernetes Executor
Cada job crea un Pod en un cluster Kubernetes.
[[runners]]
executor = "kubernetes"
[runners.kubernetes]
namespace = "gitlab-ci"
image = "alpine:latest"
cpu_request = "500m"
memory_request = "256Mi"
cpu_limit = "1"
memory_limit = "512Mi"
Ventajas: Autoscaling nativo, aprovecha infraestructura K8s existente.
Desventajas: Requiere cluster K8s, configuracion mas compleja, latencia al crear pods.
Cuando usarlo: Si tu infra ya es Kubernetes o necesitas escalar dinamicamente.
SSH Executor
Conecta via SSH a una maquina remota y ejecuta los comandos ahi.
[[runners]]
executor = "ssh"
[runners.ssh]
host = "192.168.1.100"
user = "deploy"
identity_file = "/home/gitlab-runner/.ssh/id_ed25519"
Cuando usarlo: Deploys a servidores especificos, maquinas que no pueden tener Docker.
Elegir el executor correcto
¿Tienes Kubernetes? ──Si──▶ Kubernetes Executor
│
No
│
¿Puedes instalar Docker? ──Si──▶ Docker Executor
│
No
│
¿Es una maquina remota? ──Si──▶ SSH Executor
│
No
▼
Shell Executor
Siguiente: Capitulo 4: Archivo config.toml →