La Integración y Despliegue Continuos (CI/CD) son prácticas esenciales en el desarrollo moderno de software. Estas prácticas permiten a los equipos de desarrollo entregar cambios de código de manera más rápida y segura, automatizando las pruebas y el despliegue de aplicaciones. En este módulo, aprenderás cómo implementar CI/CD en tus proyectos de Node.js.
¿Qué es CI/CD?
Integración Continua (CI)
La Integración Continua es una práctica de desarrollo de software en la que los desarrolladores integran su código en un repositorio compartido varias veces al día. Cada integración es verificada por una construcción automatizada (incluyendo pruebas) para detectar errores lo antes posible.
Despliegue Continuo (CD)
El Despliegue Continuo es una extensión de la Integración Continua que automatiza el despliegue de una aplicación a un entorno de producción. Esto asegura que el software puede ser liberado de manera rápida y segura en cualquier momento.
Beneficios de CI/CD
- Detección temprana de errores: Los errores se detectan y corrigen rápidamente.
- Entrega rápida: Los cambios se despliegan más rápidamente.
- Mejora de la calidad: Las pruebas automatizadas aseguran que el código cumple con los estándares de calidad.
- Reducción de riesgos: Los despliegues frecuentes y pequeños reducen el riesgo de errores en producción.
Herramientas de CI/CD
Existen varias herramientas populares para implementar CI/CD en proyectos de Node.js. Algunas de las más utilizadas son:
- Jenkins
- Travis CI
- CircleCI
- GitHub Actions
- GitLab CI/CD
En este módulo, nos centraremos en GitHub Actions debido a su integración directa con GitHub y su facilidad de uso.
Configuración de CI/CD con GitHub Actions
Paso 1: Crear un Repositorio en GitHub
- Ve a GitHub y crea un nuevo repositorio.
- Clona el repositorio en tu máquina local.
Paso 2: Crear un Archivo de Workflow
- En tu repositorio, crea un directorio
.github/workflows
. - Dentro de este directorio, crea un archivo
ci.yml
.
Paso 3: Definir el Workflow
En el archivo ci.yml
, define el workflow de CI/CD. Aquí hay un ejemplo básico para un proyecto de Node.js:
name: CI/CD Pipeline on: push: branches: - main pull_request: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Node.js uses: actions/setup-node@v2 with: node-version: '14' - name: Install dependencies run: npm install - name: Run tests run: npm test deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Node.js uses: actions/setup-node@v2 with: node-version: '14' - name: Install dependencies run: npm install - name: Deploy to Heroku env: HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} run: | git remote add heroku https://git.heroku.com/<your-app-name>.git git push heroku main
Explicación del Workflow
- name: Nombre del workflow.
- on: Define los eventos que activan el workflow (push y pull_request en la rama main).
- jobs: Define los trabajos que se ejecutarán.
- build: Trabajo de construcción y pruebas.
- runs-on: Define el sistema operativo en el que se ejecutará el trabajo.
- steps: Pasos a seguir en el trabajo.
- Checkout code: Clona el repositorio.
- Set up Node.js: Configura la versión de Node.js.
- Install dependencies: Instala las dependencias del proyecto.
- Run tests: Ejecuta las pruebas.
- deploy: Trabajo de despliegue.
- needs: Define que este trabajo depende del trabajo de construcción.
- if: Condición para ejecutar el trabajo (solo en la rama main).
- steps: Pasos a seguir en el trabajo.
- Checkout code: Clona el repositorio.
- Set up Node.js: Configura la versión de Node.js.
- Install dependencies: Instala las dependencias del proyecto.
- Deploy to Heroku: Despliega la aplicación en Heroku.
- build: Trabajo de construcción y pruebas.
Paso 4: Configurar Secretos en GitHub
- Ve a la configuración de tu repositorio en GitHub.
- En la sección "Secrets", agrega un nuevo secreto llamado
HEROKU_API_KEY
con tu clave API de Heroku.
Paso 5: Probar el Workflow
- Realiza un commit y push de tus cambios al repositorio.
- Ve a la pestaña "Actions" en tu repositorio de GitHub para ver el progreso del workflow.
Ejercicio Práctico
Ejercicio 1: Configurar CI/CD para un Proyecto de Node.js
- Crea un nuevo proyecto de Node.js con un simple script de prueba.
- Configura un repositorio en GitHub y sube tu proyecto.
- Configura GitHub Actions siguiendo los pasos anteriores.
- Realiza un commit y push para activar el workflow.
- Verifica que el workflow se ejecute correctamente y que la aplicación se despliegue en Heroku.
Solución del Ejercicio 1
- Crea un nuevo proyecto de Node.js:
mkdir my-nodejs-app cd my-nodejs-app npm init -y npm install --save-dev jest
- Crea un archivo
sum.js
:function sum(a, b) { return a + b; } module.exports = sum;
- Crea un archivo
sum.test.js
:const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });
- Agrega un script de prueba en
package.json
:"scripts": { "test": "jest" }
- Sube el proyecto a un nuevo repositorio en GitHub.
- Configura GitHub Actions siguiendo los pasos anteriores.
- Realiza un commit y push para activar el workflow.
- Verifica que el workflow se ejecute correctamente y que la aplicación se despliegue en Heroku.
Conclusión
En este módulo, aprendiste sobre la importancia de la Integración y Despliegue Continuos (CI/CD) y cómo implementarlos en un proyecto de Node.js utilizando GitHub Actions. Estas prácticas te ayudarán a entregar software de alta calidad de manera rápida y segura. En el próximo módulo, aplicaremos estos conocimientos en proyectos del mundo real.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos