Fundamentos del pipeline
Cómo funcionan los pipelines
PipelineContenedor principal; uno por commit/trigger
StageGrupo de jobs que se ejecutan en paralelo
JobTarea única (script) dentro de un stage
RunnerAgente que ejecuta los jobs
Activar pipelines
Push a ramaAutomático (por defecto)
Merge requestCon workflow:rules o only: merge_requests
ProgramadoCI/CD → Schedules en la configuración del proyecto
APIPOST /projects/:id/trigger/pipeline
ManualBotón Run Pipeline en el menú CI/CD
.gitlab-ci.yml
Configuración mínima
stages: [build, test, deploy] build-job: stage: build script: echo "Compiling..."
Palabras clave globales
stagesDefinir el orden de los stages
defaultValores por defecto para todos los jobs
variablesVariables globales de CI/CD
workflowControlar cuándo se crean los pipelines
includeImportar archivos YAML externos
Incluir plantillas
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
Jobs
Definición de job
test-unit: stage: test image: node:20 script: - npm ci - npm test
Palabras clave de job
scriptComandos shell a ejecutar (requerido)
before_scriptComandos antes del script principal
after_scriptComandos después (incluso si falla)
imageImagen Docker para el job
rulesCondiciones para incluir el job
needsDependencias DAG (omitir orden de stage)
allow_failureEl pipeline continúa si el job falla
retryContador de reintentos automáticos (0-2)
timeoutDuración máxima del job
Rules
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
Stages
Orden de stages
stages: - lint - build - test - deploy
Stages por defecto
.preSiempre se ejecuta primero
buildStage por defecto 1
testStage por defecto 2
deployStage por defecto 3
.postSiempre se ejecuta al último
DAG con needs
test-api: stage: test needs: ["build-api"] # no esperar al stage completo test-web: stage: test needs: ["build-web"] # ejecuta tan pronto como termine build-web
Variables
Definir variables
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # sobreescribir a nivel de job
Variables predefinidas
CI_COMMIT_SHAHash completo del commit
CI_COMMIT_BRANCHNombre de la rama
CI_COMMIT_TAGNombre del tag (si es pipeline de tag)
CI_PIPELINE_IDID único del pipeline
CI_PROJECT_DIRRuta de checkout del repo
CI_MERGE_REQUEST_IIDNúmero de MR (solo en pipelines de MR)
CI_REGISTRY_IMAGERuta de imagen del registro de contenedores
Protegidas y enmascaradas
ProtectedSolo disponibles en ramas/tags protegidos
MaskedOcultas en los logs de jobs
FileEscritas en archivo temporal; ruta en la variable
Artefactos
Guardar artefactos
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
Tipos de artefacto
pathsArchivos/directorios a almacenar
excludePatrones a omitir
expire_inAuto-eliminar después de la duración
reports:junitXML JUnit para resumen de pruebas en MR
reports:coverage_reportVisualización de cobertura Cobertura
Reporte JUnit
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
Caché
Cachear dependencias
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
Caché vs Artefactos
CacheAcelerar jobs; no garantizado; reutiliza la misma clave
ArtifactsPasar archivos entre jobs/stages; garantizado
Políticas de caché
pull-pushDescargar + subir (por defecto)
pullSolo descargar (más rápido para consumidores)
pushSolo subir (para productores)
Entornos
Definir entornos
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
Características de entornos
nameNombre del entorno (visible en la UI)
urlEnlace a la app desplegada
on_stopJob a ejecutar cuando se detiene el entorno
auto_stop_inAuto-detener después de la duración
action: stopMarca el job como la acción de parada
Review Apps
review: environment: name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.example.com on_stop: stop-review auto_stop_in: 1 week
Docker
Build y push de imagen
build-image: image: docker:24 services: [docker:24-dind] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Services (contenedores sidecar)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindImagen del servicio DinD
DOCKER_TLS_CERTDIREstablecer en '/certs' o '' para configuración TLS
DOCKER_HOSTtcp://docker:2376 (TLS) o :2375
Patrones comunes
Monorepo (changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
Compuerta de despliegue manual
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
Matriz paralela
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}