GitLab CI: configuración, stages y variables para automatización
Resumen
GitLab CI reúne en un solo lugar la automatización que necesitas para integrar código de forma continua, reducir riesgos y acelerar entregas con confianza. Con un único archivo de configuración, .gitlab-ci.yml, puedes construir, probar y desplegar cambios de manera consistente y con poca intervención humana.
¿Qué hace GitLab CI en Continuous Integration y DevOps?
GitLab CI es el hub central de automatización que orquesta builds, tests y deploys continuos. Minimiza el riesgo de bugs nuevos y evita versiones que no compilan o no funcionan. Toda la configuración vive en .gitlab-ci.yml, escrito en yaml, un formato similar a json pero más legible.
Automatización end-to-end desde que el desarrollador termina cambios hasta llegar a dispositivos de clientes.
Menos fricción: menos pasos manuales y mayor consistencia.
Configuración declarativa: se prioriza la claridad sobre la lógica compleja.
¿Cómo se conectan Continuous Delivery y Continuous Deployment?
Continuous Delivery: siempre hay un artefacto listo para producción, pero el release se realiza con una acción manual aprobatoria.
Continuous Deployment: el paso a producción se automatiza por completo; los releases suceden continuamente sin pasos manuales.
¿Cómo fluye el pipeline desde Source Control?
Nuevo branch, commits y push al repositorio central detonan jobs de build y test.
Si las pruebas fallan, se bloquea el merge con merge requests, evitando que código defectuoso llegue a producción.
Ambientes dinámicos para review apps: con clusters como Kubernetes, cada branch puede levantar una app vinculada a la interfaz del merge request para ver cambios con un clic.
Tras el merge, el deploy puede dispararse por Continuous Delivery (manual) o Continuous Deployment (automatizado).
¿Por qué los contenedores definen el ambiente?
image global: .gitlab-ci.yml declara un contenedor base para el pipeline.
Ejemplos: Node para Angular, Python para Flask.
Hay miles de imágenes disponibles con los artefactos necesarios para tu build.
¿Cómo se configura .gitlab-ci.yml con keywords y stages?
El archivo es declarativo y se organiza por keywords. La mejor práctica es mover la lógica compleja a scripts externos, por ejemplo en package.json (sección scripts) o bash, dejando a .gitlab-ci.yml definir “qué” se ejecuta y “cuándo”.
¿Qué stages y jobs necesitas?
Stages típicos: build, test y deploy. Puedes añadir otros como generar documentación o notificar en Slack.
Jobs: tareas con nombre propio asignadas a un stage específico.
variables: se pueden definir a nivel global o por job.
script: la “carnita”, donde se automatiza lo que ocurrirá.
image: node:latest
stages:- build
- test
- deploy
Compile:stage: Build
variables:ENV: dev
script:- ng build
only:- branches
# También puedes usar 'accept' para definir cuándo no corre.
¿Cuándo debe ejecutar cada job?
only y también accept permiten definir condiciones de ejecución.
Otros keywords útiles a explorar: before script y after script para tareas previas y posteriores al job.
¿Qué tipos de variables ofrece GitLab CI y para qué sirven?
GitLab CI expone múltiples tipos de variables para parametrizar y asegurar tus pipelines. Bien usadas, refuerzan la seguridad, trazabilidad y control de despliegues.
¿Qué variables automatizan builds y despliegues?
trigger variables: se inyectan automáticamente al detonar un nuevo build.
project variables: propias del proyecto, útiles para credenciales o tokens.
protected variables: visibles solo en proyectos o branches definidos, por ejemplo, secretos de producción expuestos únicamente en el branch master.
group variables: disponibles a nivel de grupo para compartir configuración.
variables de job: declaradas dentro de cada job en GitLabCI.yml.
variables globales: definidas en la raíz de .gitlab-ci.yml.
variables de deployment: usadas cuando se integran servicios de despliegue, como al conectar con Kubernetes.
predefined variables: expuestas por GitLab en cada trabajo. Útiles para auditoría y trazabilidad porque incluyen, por ejemplo, el commit SHA que detonó el build, los tags y las referencias del job.
¿Con qué keywords y variables comenzarías a automatizar tu pipeline en GitLab CI? Comparte en comentarios tus casos de uso y en qué parte integrarías before script y after script.
Almacenar las imágenes de Docker con Container Registry.
Almacene paquetes NPM con NPM Registry.
Almacene los repositorios Maven con Repositorio Maven.
Almacene Conan Repositories con Conan Repository.
Lanzar
Continuous Deployment, implementando automáticamente la aplicación en producción.
Continuous Delivery, haga clic manualmente para implementar su aplicación en producción.
Implemente sitios web estáticos con GitLab Pages.
Envíe funciones a solo una parte de sus pods y permita que un porcentaje de su base de usuarios visite la función implementada temporalmente con Canary Deployments.
Implementación de funciones detrás de Indicadores de funciones.
Agregue notas de lanzamiento a cualquier etiqueta de Git con GitLab Releases.
Vista del estado actual y el estado de cada entorno de CI que se ejecuta en Kubernetes con Deploy Boards.
Implementa tu aplicación en un entorno de producción en un clúster de Kubernetes con Auto Deploy.
Maquina!
Muchas gracias por el aporte! :D
Les dejo un gitlab-ci.yml funcional para SpringBoot que mide:
coverage (jacoco)
mutation (pitest)
Construye la imagen docker y la publica en el registry de gitlab.
Trigger Variables: Son variables automatizadas cuando se detona un nuevo build.
Project Variables (y Protected Variables): Son variables que se pueden definir para que sean expuestas únicamente en un proyecto específico o algunas ramas específicas.
Group Variables: Son variables que se pueden definir para que estén expuestas en un grupo específico.
YAML Job Level Variables and YAML Global Variables: Son variables que se pueden incluir en el archivo de configuración yaml.
Deployment Variables: Son variables enfocadas a almacenar información o credenciales para la integración con servicios externos, por ejemplo kubernetes, para hacer el deploy del proyecto.
Pre Defined Variables: Son variables predefinidas que se exponen por parte de GitLab en cada uno de los trabajos de automatización.
.gitlab-ci.yml
.
El archivo de configuración de GitLab CI funciona a traves de keywords. Cada una de estas keywords nos permiten configurar los trabajos.
Es un tipo de código declarativo, es decir que no necesitamos generar mucha lógica en el archivo, si se necesita incluir lógica adicional en el archivo, lo más conveniente es pasar esa lógica a otros archivos, de tal manera que gitlab-ci.yml nos especifique cuales son los trabajos de alto nivel.
.
Image: GitLab CI trabaja por medio de contenedores. Se debe declarar un contenedor al principio para poder definir el ambiente global en el cual vamos a trabajar, por ejemplo, si tenemos el proyecto bajo Angular el ambiente a escoger sería el de Node, pero si tenemos el proyecto en Flask el ambiente a escoger sería el de Python.
Stages: Son los pasos o fases específicos por los cuales va a pasar nuestro proceso de integración continua. Por lo general, se establecen 3 fases: build, test y deploy, pero se pueden incluir pasos adicionales como documentación.
Jobs: Se pueden nombrar los jobs como se considere. Cada Job va a pertenecer a un Stage, se le puede definir las Variables y los Scripts que es donde nosotros automatizamos.
Otro que investigue, y que me pareció muy util fue :
-merge_requests
Este sirve para especificar (por medio de only),que job correrá al momento de solicitar un merge, lo veo muy útil para ambiente de pruebas QA o de perfomance,de resto no se me ocurre para qué, de momento.
GitLab CI, sólo funciona con contenedores o también puede funcionar con aplicativos que no están en contenedores?
Hola @pcaa3000. No, tienes varios métodos de integración, te comparto la documentación para que los veas
Gracias @massimokris, revisaré la documenación.
Según lo que encontré acerca de before_script, es que es utilizado para cuando varios jobs comparten un mismo script, para esto se agrupan esos comandos en común dentro de esta etiqueta, como por ejemplo:
composer install
Y el keyword de after_script es la agrupación de scripts que se ejecutaría despues de cada job definido, incluso si fallan, particularmente lo vería con algo de utilizad para generar algún reporte, o notificar el resultado a algún administrador, pero tengo mis dudas aún.
Hola, en algunos equipos de trabajo, no contamos con Tests, por diferentes motivos, sin embargo, nos interesa implementar el resto, es posible saltar el paso de Test y solo hacer Build con Gitlab CI?
Pregunta, cual es la diferencia entre Gitlab CI y jenkins?
Ambos hacen básicamente lo mismo. Jenkins es más fácil de aprender y usar, tiene muchísimos plugins y puede ser tanto beneficioso como caótico, Jenkins tiene una interfaz gráfica.
Yo escogería Jenkins por encima de Gitlab CI, pero si ya tienes el repostiorio en Gitlab y estas envuelto en su ciclo, mejor usar el de Gitlab.
Hola!, tengo una duda acerca del comando 'image', cuando David menciona que se pueden seleccionar entre miles de imágenes, de dónde las obtiene? Gitlab tiene su propio repositorio de imágenes algo parecido a Dockerhub?
Asi es, por defecto va por las imagenes en Dockehub. Te dejo lo que pone en la documentación:
By default, the executor will only pull images from Docker Hub, however this can be configured in the gitlab-runner/config.toml by setting the Docker pull policy to allow using local images.
Leí acerca de refs , la cual dice que es una simplificación de only y except.
por ejemplo:
<code>- test:only:-master
-test
/esto quiere decir que el job "test" correrá solo si es ejecutado desde la rama master o test del repositorio, por lo que esta implícito que en el resto de ramas NO lo hará./
📚 Nombre de la clase
GitLab CI: configuración de stages y variables
🎯 Idea principal
GitLab CI permite definir pipelines estructurados mediante stages (etapas) y variables (configuración reutilizable).
Los stages organizan el flujo de ejecución, mientras que las variables permiten flexibilidad y seguridad.
Esta configuración hace que los pipelines sean ordenados, escalables y fáciles de mantener.
El objetivo es construir procesos automatizados claros y reutilizables.
⚡ Síntesis en 10 segundos
Stages = orden del pipeline
Variables = configuración dinámica
Flujo estructurado y reutilizable
Más control en CI/CD
Escalabilidad y mantenimiento
🔑 Puntos clave
Stages definen las fases del pipeline (build, test, deploy)