Introducción a CI/CD para proyectos TypeScript
El desarrollo de software moderno es impensable sin automatización. CI/CD (Continuous Integration / Continuous Delivery) es una práctica que permite a los equipos de desarrollo entregar cambios a producción de forma rápida y segura. Para proyectos en TypeScript, especialmente en el ecosistema Node.js, configurar un pipeline de CI/CD se convierte en una tarea crítica.
En este artículo, analizaremos cómo configurar un pipeline de CI/CD completo para un proyecto TypeScript usando GitHub Actions. Aprenderá a automatizar la ejecución de pruebas, la compilación del proyecto y el despliegue en un hosting. El material está dirigido a desarrolladores que ya conocen TypeScript y desean implementar prácticas modernas de DevOps.
¿Qué es GitHub Actions y por qué es conveniente para TypeScript?
GitHub Actions es un sistema de CI/CD integrado que permite crear flujos de trabajo automatizados (workflows) directamente en el repositorio de GitHub. Las principales ventajas son:
- Límite gratuito — para repositorios públicos están disponibles 2000 minutos de compilación al mes.
- Integración con GitHub — no es necesario configurar servicios de terceros.
- Flexibilidad — admite cualquier lenguaje, incluido TypeScript, mediante la ejecución de comandos de shell.
- Gran ecosistema — actions listos para desplegar en AWS, Vercel, Netlify y otras plataformas.
Para proyectos TypeScript, GitHub Actions es ideal, ya que permite ejecutar fácilmente comandos npm o yarn, usar almacenamiento en caché de dependencias y tareas paralelas.
Estructura básica del archivo de workflow
Un workflow en GitHub Actions se describe en archivos YAML que se almacenan en el directorio .github/workflows/. Veamos una configuración mínima para un proyecto TypeScript.
Cree el archivo .github/workflows/ci.yml:
name: CI Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build-and-test: runs-on: ubuntu-latest
strategy: matrix: node-version: [18.x, 20.x]
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}
- name: Install dependencies run: npm ci
- name: Lint check run: npm run lint
- name: Type check run: npx tsc --noEmit
- name: Run tests run: npm test
- name: Build project run: npm run buildAnálisis de los elementos clave:
on— desencadenadores de ejecución (push en main/develop, pull request).runs-on— sistema operativo para la ejecución (ubuntu-latest).matrix— ejecución paralela en diferentes versiones de Node.js (18 y 20).actions/checkout— action estándar para clonar el repositorio.actions/setup-node— instalación de la versión especificada de Node.js.npm ci— instalación limpia de dependencias desde el archivo lock (más rápido y fiable que npm install).
Adición de almacenamiento en caché para acelerar la compilación
Para no descargar las dependencias cada vez, agregue almacenamiento en caché:
- name: Cache Node.js modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-Este paso almacena en caché ~/.npm basándose en el hash de package-lock.json. En ejecuciones posteriores, si las dependencias no han cambiado, se restaurará la caché, lo que ahorrará entre 30 y 60 segundos.