Antes de que existiera CI/CD como práctica estándar, desplegar era un ritual: alguien se conectaba por SSH al servidor un viernes por la tarde (nunca falla que sea un viernes), copiaba archivos a mano, cruzaba los dedos y esperaba que nada se rompiera. Si algo fallaba, tocaba deshacerlo también a mano, bajo presión, con gente esperando. CI/CD es la respuesta a ese ritual: convertir el despliegue en un proceso automático, repetible y aburrido — aburrido es bueno cuando hablamos de poner código en producción.

Qué significan realmente las siglas

CI/CD junta dos prácticas relacionadas pero distintas:

Juntas forman un pipeline: una secuencia de pasos automáticos que llevan el código desde que alguien hace git push hasta que esos cambios están funcionando de verdad, sin que nadie tenga que copiar archivos a mano.

Por qué importa aunque trabajes solo

CI/CD suele presentarse como algo de "equipos grandes", pero un proyecto personal se beneficia igual. Automatizar el despliegue elimina la fricción de publicar cambios pequeños con frecuencia (en vez de acumular semanas de trabajo en un único despliegue arriesgado), y las pruebas automáticas en cada cambio actúan como una red de seguridad que detecta errores antes de que lleguen a un usuario real. Si ya usas Git y GitHub para versionar tu código, montar un pipeline básico es más sencillo de lo que parece: la mayoría de plataformas lo integran directamente sobre el mismo repositorio.

Las etapas de un pipeline típico

Aunque cada proyecto ajusta los detalles, casi todos los pipelines de CI/CD siguen la misma secuencia lógica. Cada etapa despliega el ejemplo de configuración correspondiente en GitHub Actions, la herramienta de CI/CD integrada directamente en GitHub.

El pipeline arranca en un entorno limpio (una máquina virtual desechable), así que el primer paso siempre es instalar exactamente las mismas dependencias que usas en local, a partir del archivo de bloqueo (package-lock.json, poetry.lock...) para garantizar versiones idénticas.

yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci

Con las dependencias instaladas, se lanza la suite de tests automáticos. Si algún test falla, el pipeline se detiene aquí y nadie más avanza en el proceso — es exactamente el punto en el que quieres enterarte de un fallo, no tres pasos después con el código ya en producción. Esto es lo que hace que invertir en tests con Jest compense tanto: cada test que escribes se convierte en una comprobación automática permanente.

yaml
      - run: npm test -- --ci
      - run: npm run lint

Con los tests en verde, se genera la versión optimizada de la aplicación: el bundle de producción de un frontend, la compilación de TypeScript a JavaScript, o la imagen de Docker que empaquetará la app junto con todo lo necesario para ejecutarla igual en cualquier entorno.

yaml
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: dist/

Si todo lo anterior pasó, el pipeline publica el resultado en el entorno correspondiente. Es habitual condicionar este paso a la rama main, de forma que solo el código ya revisado y fusionado llegue a producción de forma automática; otras ramas pueden desplegarse a un entorno de pruebas aparte.

yaml
  deploy:
    needs: build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: build-output
      - run: npm run deploy

Entrega continua vs despliegue continuo, en la práctica

La diferencia entre CI y "solo CD" a veces se difumina, pero entre entrega y despliegue continuo es concreta y práctica: en entrega continua, el pipeline deja el cambio listo para publicarse y una persona aprieta un botón para confirmarlo (útil cuando el negocio necesita controlar el momento exacto del lanzamiento). En despliegue continuo, ese último paso también es automático — si pasa los tests, se publica sin que nadie lo apruebe manualmente. La mayoría de equipos empiezan con entrega continua y avanzan a despliegue continuo cuando confían lo suficiente en su cobertura de tests.

AspectoEntrega continuaDespliegue continuo
Paso final a producciónManual (un clic de aprobación)Automático
RequierePipeline con tests fiablesCobertura de tests muy alta y confianza en el proceso
Riesgo si un test se cuelaSe detecta antes de aprobarLlega directo a producción
Automatizar el despliegue no elimina la necesidad de buenos tests, la hace imprescindible: sin tests fiables, un pipeline automático solo despliega errores más rápido.

Por dónde empezar si nunca has montado un pipeline

No hace falta construir las cuatro etapas de golpe. Empieza por lo más barato de implementar y lo más rentable: ejecutar tests automáticamente en cada pull request. Solo con eso ya evitas que código roto se fusione a la rama principal. Añade el build automático después, y deja el despliegue automático para cuando el proyecto y la cobertura de tests lo justifiquen. GitHub Actions, GitLab CI y CircleCI tienen niveles gratuitos más que suficientes para proyectos personales y pequeños equipos.

JR

Javier Rodríguez Fernández

Programador con Grado Superior en Desarrollo de Aplicaciones Multiplataforma (DAM). Escribe en DevPulso sobre programación aplicada, sin relleno.