Executors - Shell, Docker y mas

Por: Artiko
gitlabrunnersexecutorsdockershell

Executors

El executor define como el runner ejecuta los jobs. Cada executor tiene diferentes niveles de aislamiento, rendimiento y complejidad.

Comparativa rapida

ExecutorAislamientoSetupIdeal para
ShellNingunoSimpleScripts basicos, tareas del sistema
DockerContenedorMedioMayoría de proyectos
Docker MachineContenedor + VMComplejoAutoscaling
KubernetesPodComplejoInfraestructura K8s existente
SSHNingunoSimpleMaquinas remotas
VirtualBoxVMMedioAislamiento 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 →