Ingeniería del Software · Oposiciones

Control de Versiones con Git
e Integración Continua

Temario completo: Git, flujos de trabajo, plataformas CI/CD, GitHub Actions, GitLab CI, Jenkins y DevOps.

Índice
  1. Control de versiones: conceptos
  2. Git: arquitectura y fundamentos
  3. Comandos Git esenciales
  4. Ramas y flujos de trabajo
  5. Plataformas de alojamiento Git
  6. Integración y Entrega Continua (CI/CD)
  7. GitHub Actions
  8. GitLab CI/CD
  9. Jenkins
  10. Comparativa de plataformas CI/CD
  11. DevOps y pipeline completo
  12. Seguridad en CI/CD (DevSecOps)
01

Control de Versiones: Conceptos Fundamentales

Sistema de Control de Versiones (VCS / SCM): herramienta que registra los cambios realizados sobre un conjunto de archivos a lo largo del tiempo, permitiendo recuperar versiones anteriores, comparar cambios y colaborar entre múltiples desarrolladores.

Tipos de sistemas de control de versiones

TipoDescripciónEjemplosLimitaciones
Local (LVCS)Base de datos local de parches entre versionesRCS, SCCSNo permite colaboración
Centralizado (CVCS)Un servidor central almacena todos los archivos versionadosSVN, CVS, PerforcePunto único de fallo; requiere conexión
Distribuido (DVCS)Cada cliente tiene una copia completa del repositorioGit, Mercurial, BazaarMayor complejidad inicial

Ventajas del control de versiones

📜

Historial completo

Registro de todos los cambios con autor, fecha y mensaje descriptivo.

🔀

Ramificación

Desarrollo paralelo de funcionalidades sin interferir entre equipos.

🔄

Reversibilidad

Capacidad de deshacer cambios y volver a cualquier estado anterior.

👥

Colaboración

Múltiples desarrolladores trabajando simultáneamente sobre el mismo código.

🔍

Trazabilidad

Vinculación de cambios con issues, tickets o requisitos del sistema.

🛡️

Respaldo

El repositorio actúa como copia de seguridad del código fuente.

02

Git: Arquitectura y Fundamentos

Git es un sistema de control de versiones distribuido, libre y de código abierto. Creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux. Diseñado con énfasis en velocidad, integridad de datos y soporte para flujos de trabajo distribuidos y no lineales.

Características diferenciales de Git

Los tres estados de Git

EstadoZona / ÁreaDescripciónComando principal
ModifiedWorking Directory (árbol de trabajo)Archivo modificado pero no preparado para commitgit status
StagedStaging Area (índice / index)Archivo marcado para incluirse en el próximo commitgit add
CommittedGit Directory (repositorio .git)Datos almacenados de forma segura en el repositorio localgit commit

Objetos internos de Git

ObjetoDescripciónIdentificado por
BlobContenido de un archivo (sin nombre ni metadatos)Hash SHA-1 del contenido
TreeDirectorio: lista de blobs y otros trees con sus nombresHash SHA-1 del árbol
CommitInstantánea del proyecto + metadatos (autor, fecha, mensaje, padre)Hash SHA-1 del commit
TagPuntero con nombre a un commit específico (versión)Nombre + hash SHA-1
BranchPuntero móvil a un commit (no es un objeto, es una referencia)Nombre de la rama
HEADPuntero especial que indica el commit actual (rama activa)Referencia simbólica

Repositorio local vs. remoto

Repositorio Local

  • Copia completa del historial
  • Operaciones sin red (rápidas)
  • Working directory, staging area y .git/
  • Branches locales independientes
  • Commits, merges, diffs offline

Repositorio Remoto (origin)

  • Servidor compartido (GitHub, GitLab…)
  • Referenciado como origin (por convención)
  • Sincronización con push/pull/fetch
  • Remote tracking branches (origin/main)
  • Punto de integración del equipo
03

Comandos Git Esenciales

Configuración inicial

# Configuración de identidad (global) git config --global user.name "Nombre Apellido" git config --global user.email "correo@ejemplo.com" git config --global core.editor "code --wait" git config --list # Ver configuración actual

Tabla de comandos por categoría

Repositorio e historial

ComandoDescripciónOpciones destacadas
git initInicializa repositorio Git en el directorio actual--bare (servidor sin working dir)
git clone <url>Clona repositorio remoto en local--depth 1 (shallow), -b <rama>
git statusMuestra el estado del árbol de trabajo e índice-s (formato corto)
git logMuestra historial de commits--oneline --graph --all --decorate
git diffDiferencias entre working dir e índice--staged, HEAD, rama1..rama2
git show <hash>Muestra info y cambios de un commit--stat
git blame <file>Muestra quién modificó cada línea-L 10,20 (rango de líneas)

Staging y commits

ComandoDescripciónOpciones destacadas
git add <archivo>Añade archivo al staging area. (todo), -p (interactivo por hunks)
git commit -m "msg"Crea un nuevo commit--amend (modifica último commit), -a
git reset <hash>Mueve HEAD al commit indicado--soft, --mixed (defecto), --hard
git revert <hash>Crea commit que deshace otro (seguro para compartir)--no-commit
git stashGuarda cambios sin confirmar temporalmentepop, list, drop, apply
git cherry-pick <hash>Aplica un commit concreto en la rama actual-n (sin hacer commit)
git tag <nombre>Crea una etiqueta (versión)-a (anotada), -d (borrar)

Ramas

ComandoDescripciónOpciones destacadas
git branchLista ramas locales-a (todas), -d (borrar), -m (renombrar)
git checkout <rama>Cambia a una rama existente-b (crea y cambia)
git switch <rama>Cambia de rama (comando moderno, Git 2.23+)-c (crea y cambia)
git merge <rama>Integra una rama en la actual--no-ff, --squash, --abort
git rebase <rama>Reaplica commits sobre otra base-i (interactivo), --onto

Repositorio remoto

ComandoDescripciónOpciones destacadas
git remote add origin <url>Añade un repositorio remoto-v (ver remotos), remove
git fetch <remote>Descarga cambios del remoto sin integrarlos--all, --prune
git pullfetch + merge (o rebase con --rebase)--rebase, --ff-only
git push <remote> <rama>Sube commits locales al remoto-u (tracking), --force-with-lease, --tags

Diferencia: merge vs. rebase

Aspectogit mergegit rebase
HistorialConserva el historial real (ramificado)Reescribe el historial (lineal)
Commit extraCrea un merge commitNo crea commit extra
ConflictosSe resuelven una vezPueden repetirse commit a commit
Uso recomendadoRamas de larga duración, integración finalFeature branches antes del merge (limpiar historial)
Regla de oroSeguro en ramas compartidasNunca rebase de ramas públicas/compartidas
ResultadoPreserva cuándo y cómo se integróParece que el desarrollo fue siempre lineal

reset vs. revert

ComandoModifica historialCuándo usarloRiesgo
git reset --softSí (mueve HEAD)Deshacer commits locales, mantener stagedBajo (local)
git reset --mixedDeshacer commits locales, mantener cambiosBajo (local)
git reset --hardDescartar todo hasta un commit. ¡Irreversible!Alto
git revertNo (añade commit)Deshacer en ramas compartidas/remotasNinguno
04

Ramas y Flujos de Trabajo (Branching Strategies)

Git Flow (Vincent Driessen, 2010)

Flujo estructurado con ramas de larga duración. Adecuado para proyectos con releases periódicas y programadas.

RamaDuraciónPropósitoSe fusiona en
main / masterPermanenteCódigo en producción. Solo commits de release y hotfix
developPermanenteIntegración de features. Refleja el estado del próximo releasemain
feature/*TemporalDesarrollo de nuevas funcionalidadesdevelop
release/*TemporalPreparación de release: bugfixes menores, version bumpdevelop y main
hotfix/*TemporalCorrecciones urgentes sobre produccióndevelop y main

GitHub Flow

Flujo simplificado usado por GitHub. Adecuado para entrega continua (CD) y proyectos web con despliegues frecuentes.

1

Crear rama desde main

Nombre descriptivo: feature/login-oauth, fix/header-bug.

2

Hacer commits

Commits pequeños y frecuentes con mensajes descriptivos.

3

Abrir Pull Request (PR)

Solicitud de revisión del código. Inicia la discusión y la revisión por pares.

4

Revisión y CI

Los pipelines CI ejecutan pruebas automáticamente. Los revisores aprueban o piden cambios.

5

Merge a main

Una vez aprobado, se fusiona. main siempre está en estado desplegable.

6

Desplegar

El merge a main desencadena el despliegue automático a producción.

GitLab Flow

Extensión de GitHub Flow que añade ramas de entorno: mainpre-productionproduction. Permite promocionar el código entre entornos de forma controlada.

Trunk-Based Development (TBD)

Todos los desarrolladores integran sus cambios directamente en main (trunk) varias veces al día. Las ramas de features duran horas, no días. Requiere Feature Flags para código incompleto. Base de la integración continua real.

FlujoRamas principalesComplejidadIdeal para
Git Flowmain, develop, feature, release, hotfixAltaReleases programadas, versionado semántico
GitHub Flowmain + feature branchesBajaDespliegue continuo, SaaS
GitLab Flowmain + ramas de entornoMediaMúltiples entornos (staging, prod)
Trunk-Based Devmain (trunk)Baja (proceso)Equipos maduros, CI/CD real

Convenciones de commits: Conventional Commits

Formato estándar: <tipo>[ámbito opcional]: <descripción>
Permite generar CHANGELOGs automáticos y calcular versiones semánticas.
TipoSignificadoEjemplo
featNueva funcionalidadfeat(auth): add OAuth2 login
fixCorrección de bugfix(api): handle null response
docsCambios en documentacióndocs: update README
styleFormato, sin cambio funcionalstyle: apply prettier
refactorRefactorización sin fix ni featrefactor(db): simplify query builder
testAñade o corrige teststest: add unit tests for parser
choreMantenimiento, build, CIchore: upgrade dependencies
BREAKING CHANGECambio incompatible (sube major)feat!: remove deprecated API
05

Plataformas de Alojamiento Git

PlataformaPropietarioTipoCI/CD integradoPrecio baseDestacado
GitHubMicrosoftSaaS / On-premise (GHE)GitHub ActionsGratis (plan Free)Mayor comunidad OSS, Copilot, Marketplace
GitLabGitLab Inc.SaaS / Self-hostedGitLab CI/CD (integrado)Gratis (plan Free)DevSecOps completo en una sola plataforma
BitbucketAtlassianSaaS / ServerBitbucket PipelinesGratis (≤5 usuarios)Integración nativa con Jira y Confluence
Azure DevOpsMicrosoftSaaS / On-premiseAzure PipelinesGratis (limitado)Ecosistema Microsoft, Boards, Artifacts
GiteaComunidadSelf-hostedGitea ActionsGratuito (OSS)Ligero, ideal para despliegue propio
ForgejoComunidadSelf-hostedGratuito (OSS)Fork de Gitea, gobernanza comunitaria

Funcionalidades clave comunes

FuncionalidadGitHubGitLabBitbucketAzure DevOps
Pull / Merge Requests
CI/CD nativo
Registry de contenedores
Gestión de proyectos / Issues~✔ (Boards)
Wiki / Docs
Self-hosted gratuito✔ (GHE pago)✔ (CE)Pago (Server)On-prem pago
Escaneo de seguridad (SAST)✔ (limitado free)✔ (Ultimate)✔ (con plugins)
Pages (hosting estático)
06

Integración y Entrega Continua (CI/CD)

CI (Continuous Integration): práctica de integrar cambios de código en un repositorio compartido frecuentemente (varias veces al día), verificando cada integración mediante una build automatizada y pruebas automáticas. Concepto popularizado por Martin Fowler y Kent Beck.
CD — Continuous Delivery: extensión de CI donde el software siempre está en un estado potencialmente entregable a producción. La decisión de desplegar es manual.

CD — Continuous Deployment: cada cambio que pasa las pruebas automáticas se despliega automáticamente a producción sin intervención humana.

Pipeline CI/CD típico

📝
Commit
🔨
Build
🧪
Unit Tests
🔗
Integration Tests
🔍
Code Analysis
📦
Package / Artifact
🚀
Deploy Staging
Deploy Prod

Etapas del pipeline en detalle

EtapaDescripciónHerramientas comunesFalla si…
Source / TriggerEvento que dispara el pipeline (push, PR, schedule)Git, webhooks
BuildCompilación del código fuenteMaven, Gradle, npm, Make, DockerError de compilación
Unit TestPruebas de unidades aisladasJUnit, Jest, pytest, NUnitTest fallido
Code QualityAnálisis estático, cobertura, estiloSonarQube, ESLint, CheckstyleUmbral de calidad no superado
Security ScanAnálisis de vulnerabilidades (SAST/DAST/SCA)Snyk, Trivy, OWASP ZAP, BanditVulnerabilidad crítica detectada
Integration TestPruebas de integración entre componentesTestcontainers, Postman/NewmanTest de integración fallido
Package / ArtifactEmpaquetado del artefacto (JAR, Docker image, ZIP)Docker, Helm, npm packError de empaquetado
PublishPublicación en registry o repositorio de artefactosDocker Hub, Nexus, Artifactory, GHCRError de autenticación / red
Deploy StagingDespliegue en entorno de pre-producciónKubernetes, Ansible, TerraformFallo en el despliegue
E2E / Acceptance TestPruebas extremo a extremo en stagingSelenium, Cypress, PlaywrightFlujo de usuario roto
Deploy ProductionDespliegue en producción (manual o automático)ArgoCD, Spinnaker, FluxGate de aprobación rechazado

Estrategias de despliegue

EstrategiaDescripciónRiesgoRollback
RecreatePara la versión antigua, despliega la nuevaAlto (downtime)Lento
Rolling UpdateReemplaza instancias gradualmenteMedioMedio
Blue-GreenDos entornos idénticos; se redirige el tráfico de golpeBajoInmediato
Canary ReleasePequeño % de usuarios recibe la nueva versión primeroMuy bajoInmediato
A/B TestingGrupos de usuarios reciben versiones distintasBajoConfigurable
Feature FlagsLa nueva funcionalidad se activa/desactiva por configuraciónMuy bajoInstantáneo
Shadow DeployEl tráfico real se duplica a la nueva versión (sin afectar usuarios)NingunoN/A
07

GitHub Actions

Plataforma de CI/CD integrada en GitHub, basada en workflows definidos en archivos YAML dentro del directorio .github/workflows/. Lanzada en versión GA en noviembre de 2019.

Componentes de GitHub Actions

ComponenteDescripción
WorkflowProceso automatizado configurable. Definido en YAML. Se dispara por eventos.
EventActividad que desencadena el workflow: push, pull_request, schedule, workflow_dispatch, etc.
JobConjunto de steps que se ejecutan en el mismo runner. Los jobs se ejecutan en paralelo por defecto.
StepTarea individual dentro de un job. Puede ser un comando shell o una Action.
ActionAplicación reutilizable que realiza una tarea compleja. Publicadas en GitHub Marketplace.
RunnerServidor que ejecuta los jobs. GitHub-hosted (Ubuntu, Windows, macOS) o self-hosted.
SecretsVariables cifradas para tokens, contraseñas y claves API.
EnvironmentConjunto de reglas de protección y secretos asociados a un entorno (staging, production).
ArtifactArchivos generados durante el workflow que se pueden descargar o compartir entre jobs.
CacheReutilización de dependencias entre ejecuciones para reducir tiempo de build.

Ejemplo de workflow CI

# .github/workflows/ci.yml name: CI Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm test -- --coverage - name: Build run: npm run build - name: Upload artifact uses: actions/upload-artifact@v4 with: name: dist path: ./dist

Runners GitHub-hosted

RunnerOSCPURAMAlmacenamiento
ubuntu-latestUbuntu 22.042 vCPU7 GB14 GB SSD
windows-latestWindows Server 20222 vCPU7 GB14 GB SSD
macos-latestmacOS 13 Ventura3 vCPU14 GB14 GB SSD
08

GitLab CI/CD

CI/CD completamente integrado en GitLab, configurado mediante el archivo .gitlab-ci.yml en la raíz del repositorio. Uno de los sistemas CI/CD más completos del mercado, parte de la plataforma DevSecOps de GitLab.

Conceptos clave de GitLab CI/CD

ConceptoDescripción
PipelineProceso completo de CI/CD. Formado por stages y jobs.
StageFase del pipeline (build, test, deploy). Los jobs del mismo stage se ejecutan en paralelo.
JobUnidad de trabajo ejecutada por un Runner. Define el script y condiciones de ejecución.
RunnerAgente que ejecuta los jobs. Tipos: shared, group, specific. Puede ser Docker, Shell, Kubernetes executor.
ArtifactArchivos generados por un job y accesibles en jobs posteriores o descargables.
CacheArchivos reutilizados entre pipelines (p.ej. node_modules).
EnvironmentsRepresentación de un entorno (staging, production) con historial de despliegues.
Variables CI/CDVariables predefinidas (CI_COMMIT_SHA, CI_PROJECT_NAME…) y personalizadas.
Rules / only / exceptCondiciones para controlar cuándo se ejecuta un job.
includeReutilización de configuraciones CI desde ficheros externos o plantillas.
TriggerDisparar pipelines de otros proyectos (pipelines multi-proyecto).
DAG (needs:)Grafo acíclico dirigido: un job puede iniciar cuando sus dependencias directas terminan, sin esperar todo el stage.

Ejemplo de .gitlab-ci.yml

stages: - build - test - deploy variables: DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA build-image: stage: build image: docker:24 script: - docker build -t $DOCKER_IMAGE . - docker push $DOCKER_IMAGE unit-tests: stage: test image: python:3.11 script: - pip install -r requirements.txt - pytest --junitxml=report.xml artifacts: reports: junit: report.xml deploy-staging: stage: deploy environment: staging rules: - if: $CI_COMMIT_BRANCH == "develop" script: - kubectl set image deployment/app app=$DOCKER_IMAGE

Tipos de pipelines en GitLab

TipoDescripción
Branch pipelineSe ejecuta en cada push a una rama
Merge Request pipelineSe ejecuta en el contexto del MR, sobre la rama fusionada
Tag pipelineDisparado al crear un tag (release)
Scheduled pipelineEjecución periódica (cron)
Multi-project pipelineUn pipeline dispara pipelines en otros proyectos
Parent-child pipelinePipeline que genera subpipelines dinámicamente
09

Jenkins

Servidor de automatización de código abierto basado en Java. El más antiguo y extendido de los sistemas CI/CD. Creado originalmente como Hudson en 2004 (Sun Microsystems); renombrado a Jenkins en 2011 tras el fork comunitario.

Conceptos fundamentales de Jenkins

ConceptoDescripción
Job / ProjectUnidad de trabajo: Freestyle project, Pipeline, Multibranch Pipeline, etc.
BuildEjecución de un job. Tiene número, estado (success, failure, unstable) y log.
PipelineDefinición de CI/CD como código mediante Jenkinsfile (DSL Groovy).
JenkinsfileArchivo en el repositorio que define el pipeline. Puede ser Declarativo o Scripted.
Node / AgentMáquina donde se ejecutan los builds. El master coordina; los agents ejecutan.
ExecutorSlot de ejecución en un node. Un node puede tener múltiples executors.
WorkspaceDirectorio temporal en el agent donde se ejecuta el build.
PluginJenkins tiene más de 1800 plugins. Extienden casi cualquier funcionalidad.
TriggerSCM polling, webhook, cron, upstream job, manual.
Shared LibraryCódigo Groovy reutilizable entre múltiples Jenkinsfiles.

Ejemplo de Jenkinsfile declarativo

pipeline { agent { docker { image 'maven:3.9-openjdk-17' } } environment { MAVEN_OPTS = '-Xmx512m' } stages { stage('Checkout') { steps { checkout scm } } stage('Build') { steps { sh 'mvn clean package -DskipTests' } } stage('Test') { steps { sh 'mvn test' } post { always { junit 'target/surefire-reports/*.xml' } } } stage('Deploy') { when { branch 'main' } steps { withCredentials([usernamePassword(...)]) { sh './deploy.sh' } } } } post { failure { mail to: 'team@ejemplo.com', subject: 'Build failed' } } }

Jenkins vs Jenkinsfile declarativo vs scripted

AspectoPipeline DeclarativoPipeline Scripted
SintaxisEstructura fija con bloques predefinidosGroovy completo, máxima flexibilidad
Curva de aprendizajeBajaAlta (requiere conocer Groovy)
Validación previaSí (linting en interfaz)No
Manejo de errorespost sectiontry/catch/finally
RecomendadoSí (uso general)Solo cuando se necesita lógica compleja
10

Comparativa de Plataformas CI/CD

CaracterísticaGitHub ActionsGitLab CI/CDJenkinsAzure PipelinesCircleCI
TipoSaaS (integrado)SaaS / Self-hostedSelf-hostedSaaS / On-premSaaS
Config. como código✔ YAML✔ YAML✔ Groovy DSL✔ YAML✔ YAML
Integración con GitGitHub nativoGitLab nativoPlugin (cualquier SCM)Azure Repos / GitHubGitHub, GitLab, Bitbucket
Runners / AgentesGitHub-hosted + self-hostedShared + self-hostedMaster + agentsMicrosoft-hosted + self-hostedCloud + self-hosted
ParalelizaciónJobs en paraleloJobs en paralelo + DAGParallel stepsJobs en paraleloParallelism nativo
Marketplace / PluginsGitHub Marketplace (Actions)Templates / CI Components>1800 pluginsAzure DevOps ExtensionsOrbs
Docker nativo✔ (Docker executor)✔ (plugin)
Kubernetes nativo✔ (actions)✔ (K8s executor)✔ (plugin)✔ (AKS)✔ (orb)
Coste (open source)Gratis (2000 min/mes)Gratis (400 min/mes)Gratuito (infra propia)Gratis (1800 min/mes)Gratis (6000 créditos/mes)
Curva de aprendizajeBajaMediaAltaMediaBaja-Media
MantenimientoNinguno (SaaS)Bajo (SaaS) / Medio (self)Alto (propio)Ninguno (SaaS)Ninguno (SaaS)
Mejor paraProyectos GitHub, OSSDevSecOps completoEmpresas con infra propiaEcosistema MicrosoftProyectos con alta paralelización

Otras herramientas de CI/CD relevantes

HerramientaTipoDestacado
Travis CISaaSPionero del CI basado en YAML para GitHub OSS
Bitbucket PipelinesSaaS (Atlassian)Integración nativa con Jira; config. en bitbucket-pipelines.yml
TeamCitySaaS / On-prem (JetBrains)UI muy completa; integración IDE; configuración Kotlin DSL
Drone CISaaS / Self-hosted100% container-native; pipelines como contenedores Docker
TektonKubernetes-nativePrimitivas CI/CD para Kubernetes (CRDs); base de OpenShift Pipelines
ArgoCDGitOps (Kubernetes)CD declarativo; sincroniza cluster K8s con estado en Git
Flux CDGitOps (Kubernetes)Operador GitOps para Kubernetes; parte de CNCF
SpinnakerSelf-hosted (Netflix)CD multi-cloud; pipelines complejos con aprobaciones manuales
11

DevOps y el Pipeline Completo

DevOps es una cultura, filosofía y conjunto de prácticas que combinan el desarrollo de software (Dev) y las operaciones de TI (Ops) con el objetivo de acortar el ciclo de vida del desarrollo y entregar software con alta calidad de forma continua.

El bucle infinito de DevOps

FaseActividadesHerramientas típicas
PlanGestión de requisitos, backlog, roadmap, sprintsJira, Azure Boards, GitHub Issues, Linear
CodeDesarrollo, revisión de código, pair programmingVS Code, IntelliJ, Git, GitHub/GitLab
BuildCompilación, empaquetado, análisis estáticoMaven, Gradle, npm, Docker, SonarQube
TestPruebas unitarias, integración, e2e, rendimientoJUnit, pytest, Cypress, k6, JMeter
ReleaseVersionado, changelogs, aprobacionesSemantic-release, GitLab Releases, GitHub Releases
DeployDespliegue en entornos, estrategias de releaseArgoCD, Spinnaker, Helm, Terraform, Ansible
OperateGestión de infraestructura, escalado, IaCKubernetes, Terraform, AWS/Azure/GCP, Ansible
MonitorObservabilidad: logs, métricas, trazas, alertasPrometheus, Grafana, ELK Stack, Datadog, Jaeger

Métricas DORA (DevOps Research & Assessment)

Las 4 métricas clave para medir el rendimiento de un equipo DevOps:

MétricaDescripciónElite performers
Deployment Frequency¿Con qué frecuencia se despliega a producción?Múltiples veces al día
Lead Time for ChangesTiempo desde commit hasta producciónMenos de 1 hora
Change Failure Rate% de despliegues que causan incidentes en prod0–5 %
Time to Restore ServiceTiempo de recuperación ante un fallo en prodMenos de 1 hora

Infrastructure as Code (IaC)

HerramientaTipoLenguajeUso principal
TerraformDeclarativoHCLProvisioning multi-cloud (AWS, Azure, GCP)
AnsibleImperativo (playbooks)YAMLConfiguración de servidores, sin agente
PuppetDeclarativoDSL propioGestión de configuración a escala
ChefImperativoRuby DSLGestión de configuración, entornos complejos
PulumiDeclarativo / ImperativoPython, JS, Go…IaC con lenguajes de programación reales
HelmDeclarativoYAML + Go templatesGestión de aplicaciones en Kubernetes
12

Seguridad en CI/CD: DevSecOps

DevSecOps: integración de la seguridad (Shift Left) en todas las fases del pipeline CI/CD, en lugar de tratarla como una fase final separada.

Tipos de análisis de seguridad en el pipeline

TipoSiglaDescripciónHerramientas
Static Application Security TestingSASTAnaliza el código fuente sin ejecutarloSonarQube, Semgrep, Bandit, SpotBugs
Dynamic Application Security TestingDASTPrueba la aplicación en ejecución buscando vulnerabilidadesOWASP ZAP, Burp Suite, Nikto
Software Composition AnalysisSCAAnaliza dependencias y librerías externas en busca de CVEsSnyk, OWASP Dependency-Check, Trivy
Container Image ScanningEscanea imágenes Docker en busca de vulnerabilidadesTrivy, Clair, Grype, Docker Scout
Infrastructure as Code ScanningIaC ScanAnaliza ficheros Terraform, Helm, K8s manifestsCheckov, tfsec, Terrascan
Secret DetectionDetecta credenciales, tokens y claves expuestos en el códigoGitLeaks, TruffleHog, detect-secrets

Buenas prácticas de seguridad en CI/CD

⚠️ Supply Chain Security: los ataques a la cadena de suministro de software (como el ataque a SolarWinds o el incident de xz-utils) hacen crítico verificar la integridad de las dependencias y acciones de terceros usadas en los pipelines CI/CD.