Un pipeline de GitLab CI/CD se define en un único archivo, .gitlab-ci.yml, en la raíz del repositorio. Ahí se declaran los stages (etapas, como build, test, deploy), que corren en secuencia, y dentro de cada uno, jobs (trabajos), que corren en paralelo. Cada job produce opcionalmente artifacts, archivos que sobreviven al job y pasan a los siguientes dentro del mismo pipeline, distintos de la cache, que se comparte entre pipelines. Las rules deciden si un job corre según la rama, y needs le permite a un job saltarse la espera de una etapa completa. Nada se ejecuta solo: hace falta un runner, compartido por GitLab o propio, que toma los jobs de la cola y corre su script. Los secretos van en las variables de CI/CD, nunca en el YAML versionado. Esta guía no repite qué es CI/CD en general —ya está en la guía de GitHub Actions—: se concentra en la sintaxis y las piezas propias de GitLab.
Ver índice de contenidos
Anatomía de .gitlab-ci.yml: stages y jobs
Todo pipeline de GitLab CI/CD —integración y entrega continuas integradas en GitLab— arranca en un archivo con nombre fijo, .gitlab-ci.yml, en la raíz del repositorio. La idea general de un pipeline (construir, probar, desplegar) ya está explicada en la guía de GitHub Actions; acá vamos directo a la sintaxis propia de GitLab.
La clave stages declara el orden de las etapas. Cada job se asigna a una con la clave stage, y define su script: los comandos que se ejecutan.
stages:
- build
- test
- deploy
# Un job de la etapa build
build-job:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
# Dos jobs de la etapa test: corren en paralelo
unit-tests:
stage: test
script:
- npm test
lint:
stage: test
script:
- npm run lint
# Un job de la etapa deploy: espera a que termine test
deploy-prod:
stage: deploy
script:
- ./deploy.sh
La distinción que ordena todo lo demás: un stage es una fase y las fases corren en secuencia, en el orden en que aparecen en stages; un job es una tarea concreta dentro de una fase, y todos los jobs de la misma etapa corren en paralelo. En el ejemplo, unit-tests y lint arrancan juntos apenas termina build-job, y deploy-prod recién arranca cuando ambos terminaron. Si un job falla, por defecto la etapa siguiente no se ejecuta: el pipeline se detiene ahí.
Artifacts y cache: la confusión más común
needs rompiendo el orden lineal para que deploy-preview arranque apenas termina build.Una de las confusiones más comunes al empezar con GitLab CI/CD: artifacts y cache guardan archivos entre ejecuciones, pero para propósitos distintos.
| Propiedad | artifacts | cache |
|---|---|---|
| Para qué sirve | Pasar el resultado de un job a los jobs posteriores del mismo pipeline | Acelerar ejecuciones reutilizando algo que no cambia seguido |
| Alcance | Se comparte entre jobs de una misma corrida del pipeline | Se comparte entre pipelines distintos, corridas separadas |
| Ejemplo típico | El build compilado, un reporte de pruebas | node_modules/, paquetes ya descargados |
| Ciclo de vida | Configurable con expire_in; se puede descargar desde la interfaz | Se reutiliza si la clave de cache coincide con una corrida anterior |
build-job:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 week
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
Acá dist/ es un artifact: el resultado del build, que deploy-prod va a necesitar más adelante en el mismo pipeline. node_modules/ va en cache: no es un resultado, es una dependencia que conviene no volver a descargar en la próxima corrida.
Rules y needs: condicionar y reordenar la ejecución
rules: cuándo corre un job
Por defecto, un job corre en cada pipeline. La clave rules agrega condiciones if y when para decidir si corre o no, según la rama, una variable o el tipo de pipeline.
deploy-prod:
stage: deploy
script:
- ./deploy.sh
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
Acá deploy-prod solo está disponible cuando el pipeline corre sobre main, y queda como manual: alguien tiene que apretar el botón, en vez de que corra solo. Es la forma típica de proteger un despliegue a producción.
needs: adelantarse a las etapas
El orden de stages es estricto por defecto: ningún job de deploy arranca hasta que todos los jobs de test terminaron, aunque no dependa de todos ellos. La clave needs rompe esa espera: declara de qué jobs concretos depende uno, y lo deja arrancar apenas esas dependencias puntuales terminan, sin importar la etapa.
deploy-preview:
stage: deploy
needs: [build-job]
script:
- ./deploy-preview.sh
Con needs: [build-job], deploy-preview no espera al stage test: arranca apenas termina build-job, en paralelo con unit-tests y lint. El pipeline queda más rápido, pero más difícil de leer: usalo cuando el ahorro sea real, no como reemplazo general del orden por stages.
El runner: sin él no se ejecuta nada
Todo lo anterior es configuración: describe qué tiene que pasar. Quien lo ejecuta es el runner, una aplicación en Go, distribuida como un binario, que se conecta al proyecto, toma los jobs de la cola y corre su script dentro de un ejecutor: shell, Docker, Docker con autoescalado, o SSH.
Compartido o propio, pero siempre uno
GitLab.com ofrece runners compartidos, ya alojados y listos apenas creás el proyecto: para pipelines chicos o medianos alcanzan sin configurar nada. Un runner propio (self-hosted) se registra contra el proyecto con un token, y tiene sentido con hardware específico, red privada, o para evitar el límite de minutos gratuitos. Sea cual sea la elección, la regla no cambia: sin un runner disponible, ningún job se ejecuta.
Secretos y minutos: qué no va en el YAML y cuánto cuesta
Secretos: variables protegidas y enmascaradas
Las credenciales que un job necesita para desplegar —una clave de servidor, un token, una contraseña— se cargan en la sección de variables de CI/CD del proyecto, nunca dentro de .gitlab-ci.yml, porque ese archivo se versiona y queda visible para quien tenga acceso al repositorio. La guía de administración de secretos cubre el panorama general; acá, el punto específico de GitLab.
Cada variable se puede marcar como protegida (solo en pipelines de ramas o etiquetas protegidas, como main) y como enmascarada (oculta con asteriscos en los registros). GitLab advierte explícitamente que el enmascarado no es una garantía total de seguridad: un script que transforme o concatene el valor puede terminar exponiéndolo en el log igual. Tratalo como reducción de exposición accidental, no como cifrado.
Minutos y planes: cuánto sale correr pipelines
Según la página oficial de precios de GitLab, consultada el 29 de julio de 2026, el plan gratuito incluye 400 minutos de cómputo por mes en los runners compartidos de GitLab.com y 10 GiB de almacenamiento. Con un runner propio, ese límite no aplica, porque el cómputo lo pone tu propia infraestructura. Por encima hay niveles pagos, como Premium, y un nivel Ultimate para organizaciones grandes. Estas cifras cambian seguido: conviene confirmarlas en la página de precios vigente antes de planificar un proyecto alrededor de un número puntual.
Errores frecuentes
- Confundir stage con job. El stage ordena las fases en secuencia; varios jobs de la misma fase corren en paralelo.
- Pensar que sin runner «simplemente se ejecuta». El runner es quien corre el YAML. Sin uno disponible, no pasa nada.
- Escribir secretos en el YAML. Se versiona: las credenciales van en las variables de CI/CD del proyecto.
- Confiar en el enmascarado como si fuera cifrado. Reduce la exposición en los logs, pero no es una garantía total.
- Usar
needssin entender que rompe el orden lineal. Acelera el pipeline, pero puede volverlo difícil de seguir. - Guardar dependencias en
artifactsen vez decache. Infla el pipeline y no aprovecha la reutilización entre corridas.
Preguntas frecuentes
¿Qué es un runner y necesito instalar uno propio?
Un runner es la aplicación, escrita en Go y distribuida como un solo binario, que se conecta a GitLab, toma los jobs pendientes de la cola y ejecuta el script de cada uno dentro de un ejecutor concreto: shell, Docker, Docker con autoescalado o SSH. Sin un runner disponible, ningún job se ejecuta, por más completo que esté el .gitlab-ci.yml: el YAML describe qué hacer, pero el runner es quien lo hace. No hace falta instalar uno propio para empezar: GitLab.com ofrece runners compartidos, ya alojados, listos apenas creás el proyecto, y el plan gratuito incluye minutos mensuales para usarlos. Un runner propio, o self-hosted, se justifica cuando hace falta hardware específico como una GPU, acceso a una red privada, evitar el límite de minutos, o dependencias particulares preinstaladas. Se instala descargando el binario o corriéndolo en un contenedor, y se registra contra el proyecto con un token. Para proyectos chicos o medianos, los compartidos suelen alcanzar sin configuración adicional.
¿Cuál es la diferencia entre stages y jobs?
Un stage, o etapa, es una fase del pipeline, como build, test o deploy, y las etapas corren en secuencia, en el orden en que aparecen en la clave stages: primero termina build, después arranca test, y recién después deploy. Un job, o trabajo, es una tarea concreta dentro de una etapa, con su propio script, y todos los jobs de una misma etapa corren en paralelo, no en secuencia. Si test tiene dos jobs, unit-tests y lint, ambos arrancan apenas termina build, sin esperarse entre ellos, y deploy recién arranca cuando los dos terminaron. Esta combinación hace eficiente un pipeline: las etapas imponen el orden que el proceso necesita —no desplegar código sin probar—, y el paralelismo dentro de cada etapa aprovecha que tareas independientes no tienen por qué esperarse. Un error común es creer que el orden lo da la posición en el archivo: lo determina el stage de cada job. Y si un job falla, la etapa siguiente no arranca: el pipeline se detiene ahí.
¿Para qué sirve needs si ya existe el orden de stages?
El orden de stages es estricto: por defecto, ningún job de deploy arranca hasta que todos los jobs de test terminaron, aunque ese job en particular no dependa de todos ellos. La clave needs rompe esa espera innecesaria: le permite a un job declarar de qué jobs concretos depende, sin importar la etapa, y arrancar en cuanto esas dependencias puntuales terminan, en vez de esperar a que termine la etapa entera. Un caso típico: un job de deploy que solo necesita el artefacto de build, sin depender de test; con needs: [build], arranca apenas build termina, en paralelo con test. El resultado es un pipeline más rápido, porque corren en paralelo tareas sin dependencia real entre sí aunque estén en etapas distintas. Conviene usarlo con cuidado: un pipeline con muchos needs cruzados puede volverse difícil de seguir, porque el orden real ya no coincide con el de las etapas. Reservalo para casos donde el ahorro sea claro.
¿Dónde guardo credenciales para que el pipeline despliegue sin exponerlas?
Las credenciales que el pipeline necesita para desplegar —una clave de servidor, un token, una contraseña— se cargan en la sección de variables de CI/CD del proyecto, nunca escritas dentro de .gitlab-ci.yml, porque ese archivo se versiona y queda visible para quien tenga acceso al repositorio. Cada variable se puede marcar como protegida, disponible solo en pipelines de ramas o etiquetas protegidas como main, y como enmascarada, oculta con asteriscos en los registros. Es clave entender los límites reales: GitLab advierte explícitamente que el enmascarado no es una garantía total de seguridad, porque un script que transforme o concatene el valor antes de imprimirlo puede terminar exponiéndolo en el log igual. Enmascarar no es cifrar: reduce la exposición accidental, no protege criptográficamente. Por eso conviene además separar entornos con variables distintas para pruebas y producción, y limitar quién puede editar la configuración de CI/CD.
¿Qué diferencia hay entre artifacts y cache?
Es una de las confusiones más comunes al empezar con GitLab CI/CD, porque ambos guardan archivos entre ejecuciones, pero resuelven problemas distintos. Los artifacts son archivos que produce un job —el resultado de una compilación, un reporte de pruebas— y que sobreviven después de que el job termina: quedan asociados a esa ejecución, se pueden descargar desde la interfaz, y sobre todo se pasan automáticamente a los jobs posteriores del mismo pipeline, con una caducidad configurable vía expire_in. La cache, en cambio, no pasa el resultado de un job a otro dentro del mismo pipeline: acelera ejecuciones futuras reutilizando algo que no cambia seguido, como una carpeta node_modules. La diferencia clave: la cache se comparte entre pipelines distintos, no solo entre jobs de una misma corrida; si dos ejecuciones usan la misma clave de cache, la segunda reaprovecha lo que la primera descargó. En resumen, artifacts pasa el resultado de este pipeline a un job posterior, y cache evita repetir un trabajo costoso en cada pipeline nuevo.
¿Cuántos minutos de CI/CD tengo en el plan gratuito?
Según la página oficial de precios de GitLab, consultada el 29 de julio de 2026, el plan gratuito incluye 400 minutos de cómputo por mes en los runners compartidos de GitLab.com, junto con 10 GiB de almacenamiento. Ese límite aplica al uso de runners compartidos: con uno propio, autogestionado, no aplica, porque el cómputo lo pone tu hardware. Por encima del plan gratuito hay niveles pagos, como Premium, y un nivel Ultimate para organizaciones grandes. Estas cifras son datos comerciales que GitLab actualiza seguido, así que conviene confirmarlas en la página de precios vigente antes de planificar un proyecto alrededor de un número puntual. Para un proyecto chico con pipelines livianos, los minutos gratuitos suelen alcanzar; con pipelines largos o mucha gente contribuyendo, es habitual toparse con el límite y evaluar un plan pago o un runner propio.
Fuentes
Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 29 de julio de 2026.
Aportes de la comunidad Underc0de
- Underc0de, foro. Sección QA (Quality Assurance). No hay un aporte previo sobre GitLab CI/CD en el foro: el único hilo cercano, de 2015, trata de autoalojar Gogs y su título lo confunde con GitLab, así que no se cita como fuente. Se enlaza la sección donde la comunidad trata integración continua y pruebas.
Documentación oficial
- GitLab. Get started with GitLab CI/CD. La introducción oficial a la plataforma.
- GitLab. CI/CD pipelines. Cómo se estructuran y disparan los pipelines.
- GitLab. CI/CD YAML syntax reference. La referencia completa de
stages,artifacts,cache,rulesyneedsusada en esta guía. - GitLab. GitLab Runner. Instalación, registro y ejecutores del runner.
- GitLab. CI/CD variables. Variables protegidas y enmascaradas, y su advertencia sobre los límites del enmascarado.
- GitLab. Pricing. Minutos incluidos en el plan gratuito y precio de los planes pagos, consultado el 29 de julio de 2026.