Tema:
Introduccion a gitlab ci.
Introducción
Gitlab Ci es una herramienta de ci/cd brindada por gitlab que nos permite llevar a cabo en su totalidad el proceso de despliegue de software por medio de pipelines de integracion continua.
Objetivo
Objetivo General:
- El objetivo de la practica es conocer la solucion de cicd brindada por gitlab y familiarizarnos con sus conceptos.
Desarrollo del tema
1) ¿Qué es GitLab CI/CD?
GitLab CI/CD (Continuous Integration / Continuous Delivery/Deployment) automatiza el ciclo de vida del software: - Build: compilar/empacar la app. - Test: ejecutar pruebas y análisis. - Delivery/Deploy: entregar o desplegar a entornos (dev/stage/prod).
2) El archivo .gitlab-ci.yml
Archivo declarativo en la raíz del repo que define: - stages (fases), jobs (tareas), rules (cuándo correr), - variables, artefactos, cache, environments, etc.
Ejemplo mínimo:
stages: [build, test, deploy]
build:
stage: build
script: echo "Compilando"
test:
stage: test
script: echo "Probando"
deploy:
stage: deploy
script: echo "Desplegando"
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
3) Conceptos clave
3.1 Pipelines
- Conjunto de jobs ejecutados según
.gitlab-ci.yml. - Se disparan por push, merge request, tag, schedule, manual, API.
3.2 Stages
- Fases del pipeline, ejecutadas en orden (p.ej.
build → test → deploy). - Los jobs dentro de la misma stage corren en paralelo.
3.3 Jobs
- Unidad de trabajo. Atributos frecuentes:
stage,script,image,services,needs,artifacts,cache,rules,when,retry,timeout,tags,environment.- Plantillas: con
extends:o anclas YAML para reutilizar.
3.4 Runners
- Agentes que ejecutan jobs.
- Shared runners (compartidos) o specific runners (dedicados).
- Ejecutores: docker, shell, kubernetes, vm, etc.
- Selección por
tags:del job.
3.5 Variables
- Definibles en:
.gitlab-ci.yml→variables:- Configuración del proyecto/grupo (enmascaradas/protegidas).
- Variables del sistema (
CI_*). - Uso:
$MI_VARo${MI_VAR}. Se pueden inyectar enrules: if,script, etc.
Ejemplo:
variables:
DOCKER_IMAGE: "myorg/myapp:${CI_COMMIT_SHORT_SHA}"
3.6 Artefactos y Cache
- artifacts: archivos que persisten entre jobs (dentro del pipeline).
- cache: acelera builds reutilizando dependencias entre pipelines.
artifacts: paths: [dist/, coverage/] expire_in: 7 days cache: key: ${CI_PROJECT_NAME} paths: [node_modules/]
3.7 Imagen y Servicios (contenerización)
image:define la imagen del job.services:levanta contenedores auxiliares (BD, etc.).image: node:20 services: - name: postgres:16 alias: db
3.8 Rules y Workflow
rules:controla ejecución a nivel job (reemplazaonly/except).- Condiciones:
if,changes,exists,allow_failure,when. workflow: rules:habilita/omite el pipeline completo.
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_BRANCH == "main"'
test:
stage: test
script: npm test
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- changes:
- src/**/*
3.9 DAG con needs
- Permite dependencias entre jobs sin respetar el orden de stages → pipelines más rápidos.
unit: stage: test script: npm run test lint: stage: test script: npm run lint package: stage: build script: npm run build needs: [unit, lint]
3.10 Environments y Deployments
environment:registra despliegues (dev/stage/prod), URL y controles.when: manualpara despliegues aprobados;when: delayedpara diferidos.
deploy_prod:
stage: deploy
script: ./scripts/deploy.sh
environment:
name: production
url: https://app.example.com
on_stop: stop_prod
when: manual
3.11 Reportes (test, cobertura, seguridad)
- Publicación de reportes para la UI de GitLab:
test: stage: test script: npm run test:junit artifacts: reports: junit: reports/junit.xml
3.12 Reutilización e includes
- Reutilizá fragmentos con
include:(archivo local, proyecto remoto, URL).include: - local: .gitlab/ci/base.yml - project: infra/pipelines file: templates/docker.yml
3.13 Child/Parent y Multi-proyecto
- Child pipelines (estáticos o dinámicos) para dividir responsabilidades.
- Multi-project pipelines con
trigger:para orquestar repos.
generate-child:
stage: build
trigger:
include: child.yml
strategy: depend
3.14 Schedules, Tags y MR pipelines
- Schedules: pipelines programados (cron) con variables propias.
- Tags: pipelines sólo para tags (releases).
- Merge Request pipelines: validan cambios antes de fusionar.
4) Patrón de pipeline recomendado (web app genérica)
stages: [verify, build, test, package, deploy]
.default:
image: alpine:3.20
lint:
stage: verify
image: node:20
script: [ "npm ci", "npm run lint" ]
rules:
- changes: [ "src/**/*", "package*.json" ]
unit:
stage: test
image: node:20
script: [ "npm ci", "npm test -- --ci --reporters=jest-junit" ]
artifacts:
when: always
reports:
junit: reports/junit.xml
needs: [lint]
build_image:
stage: package
image: docker:27
services: [ "docker:27-dind" ]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_TLS_CERTDIR: ""
IMAGE: "registry.example.com/app:${CI_COMMIT_SHORT_SHA}"
script:
- docker build -t "$IMAGE" .
- docker push "$IMAGE"
rules:
- if: '$CI_COMMIT_BRANCH'
needs: [unit]
deploy_staging:
stage: deploy
script: ./scripts/deploy.sh staging "$IMAGE"
environment:
name: staging
url: https://staging.example.com
auto_stop_in: 3 days
when: manual
needs: [build_image]
deploy_prod:
stage: deploy
script: ./scripts/deploy.sh production "$IMAGE"
environment:
name: production
url: https://app.example.com
when: manual
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
needs: [build_image]
5) Glosario rápido
- Pipeline: ejecución completa del CI.
- Stage: fase secuencial del pipeline.
- Job: tarea concreta ejecutada por un runner.
- Runner: agente que ejecuta jobs.
- Artifacts/Cache: persistencia de archivos y dependencias.
- Rules/Workflow: condiciones de ejecución (job/pipeline).
- Needs (DAG): dependencias entre jobs para paralelizar.
- Environment: registro y control de despliegues.
- Include/Extends: reutilización y plantillas.
- Child/Parent/Trigger: orquestación entre pipelines.
6) Buenas prácticas
- Mantener
.gitlab-ci.ymlpequeño y reutilizable (usainclude/extends). - Preferir
rules+workflowen lugar deonly/except. - Usar
needspara reducir tiempos (DAG). - Publicar reportes (junit/coverage) y artefactos clave.
- Proteger variables sensibles y entornos de producción.
- Nombrar stages y jobs de forma semántica y consistente.