Configurar CI con GitLab Pipelines
Cómo configurar pipelines de GitLab CI/CD para testing, building y deployment usando .gitlab-ci.yml con stages, jobs, caching y runners.
Descripción General
GitLab CI/CD es una plataforma de integración y despliegue continuo integrada que utiliza un archivo .gitlab-ci.yml para definir pipelines. Los jobs se ejecutan en contenedores Docker aislados en runners compartidos o auto-hospedados, facilitando la automatización de testing, building y releases.
Antes de los pipelines de CI/CD, los equipos ejecutaban tests y deployments manualmente desde máquinas locales. Esto generaba bugs de “funciona en mi laptop”, entornos inconsistentes y ninguna traza de auditoría sobre qué se desplegó y cuándo. GitLab CI/CD resuelve esto codificando cada paso del proceso de entrega en YAML versionado.
Cuándo Usar
Usa esta receta cuando:
- Configuras testing automatizado para un proyecto hospedado en GitLab en cada push o merge request.
- Construyes y publicas imágenes Docker a un registry como parte del proceso de release.
- Despliegas a staging o producción con variables de entorno y aprobaciones manuales.
- Ejecutas pipelines programadas para backups nocturnos, auditorías de dependencias o tareas de limpieza.
- Usas runners auto-hospedados para infraestructura privada o entornos de build especializados.
Lo que funciona
- Usa
npm cien lugar denpm installen CI para builds reproducibles que respeten estrictamentepackage-lock.json. - Cachea dependencias entre jobs usando la keyword
cachepara reducir drásticamente los tiempos de build. - Fija versiones de imágenes Docker en lugar de usar tags
latestpara garantizar builds reproducibles. - Usa
artifactspara pasar archivos entre stages (ej., bundles compilados de build a deploy). - Configura
onlyorulescon cuidado para evitar ejecutar jobs costosos de deploy en branches de feature. - Usa bloques
environmentpara jobs de deployment para trackear qué está desplegado y habilitar rollbacks.
Errores Comunes
- No cachear
node_moduleshace que cada job reinstale dependencias desde cero, desperdiciando minutos por ejecución. - Usar
onlyen lugar derules—ruleses la forma moderna y más flexible de controlar la ejecución de jobs. - Ejecutar DIND sin TLS puede exponer el socket Docker a otros jobs en el mismo runner.
- Almacenar secrets en
.gitlab-ci.yml— siempre usa variables de CI/CD desde la configuración del proyecto. - Olvidar
tagspara runners propios hace que los jobs se encolen indefinidamente en runners compartidos.
Tips de Rendimiento
- Usa
needspara ejecución DAG. Reduce el wall-clock time iniciando jobs tan pronto como sus dependencias terminen:
test:
needs: [build] # Inicia inmediatamente después de build
- Cachea por rama. Evita colisiones de caché entre ramas:
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- Usa
interruptible: truepara jobs de MR. Ahorra tiempo de runner cancelando pipelines reemplazados:
test:
interruptible: true
- Usa imágenes pequeñas. Reduce el tiempo de pull:
# Mal: imagen grande
image: node:20
# Bien: imagen slim
image: node:20-slim
# Mejor: alpine si es compatible
image: node:20-alpine
- Usa
before_scriptyafter_scriptcon cuidado. Se ejecutan para cada job en el archivo:
default:
before_script:
- npm ci --silent
after_script:
- echo "Job completado con exit code $?" Preguntas frecuentes
¿Qué es un GitLab Runner?
Un GitLab Runner es el agente que ejecuta los jobs de un pipeline. Puede ser compartido, específico de grupo o de proyecto, y corre en Linux, Windows, macOS o Kubernetes.
¿Cómo cacheo dependencias en GitLab CI?
Usa la palabra clave cache para persistir directorios como node_modules, .m2 o .pip entre pipelines. Usa key para delimitar cachés por rama o lockfile.
¿Cuál es la diferencia entre stages y jobs?
Los stages definen fases de ejecución (build, test, deploy) que corren secuencialmente. Los jobs son las tareas individuales dentro de un stage, que pueden correr en paralelo si comparten stage.
Recursos Relacionados
GitHub Actions: CI/CD
Cómo construir y desplegar con GitHub Actions usando workflows, matrices, caching y secrets.
RecipeFundamentos de Docker
Cómo containerizar una aplicación, escribir un Dockerfile y ejecutar contenedores con Docker Compose.
RecipeVariables de Entorno
Cómo leer, establecer y gestionar variables de entorno de forma segura en Python, JavaScript y Java.
RecipeDesplegar Contenedores en AWS ECS con Fargate
Como desplegar contenedores Docker en AWS ECS usando computacion serverless Fargate con Terraform y GitHub Actions
RecipeTareas en Segundo Plano (Background Jobs)
Cómo programar y ejecutar tareas en segundo plano usando cron, colas de trabajo y workers.
GuideCI/CD con GitHub Actions
Construye pipelines CI/CD desde cero con GitHub Actions. Cubre workflows, runners, matrix builds, caching, secrets, environments, deployment strategies y reusable workflows.