CI/CD para proyectos TypeScript: GitHub Actions nivel avanzado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué necesitas un CI/CD avanzado para TypeScript?

Un pipeline CI/CD básico que simplemente ejecuta npm test y npm build deja de ser eficiente tan pronto como tu proyecto TypeScript comienza a crecer. El tiempo de compilación aumenta, las pruebas toman horas y la gestión manual de versiones provoca errores. El nivel avanzado de configuración de GitHub Actions permite resolver estos problemas: acelerar el pipeline mediante el caché, ejecutar pruebas en paralelo para diferentes versiones de Node.js y SO, y automatizar el despliegue a producción.

En este artículo, analizaremos tres técnicas clave para proyectos TypeScript: el caché inteligente de node_modules, las compilaciones matriciales para verificar la compatibilidad y el despliegue automático utilizando actions/upload-pages-artifact. Todos los ejemplos están escritos en TypeScript y listos para integrarse en tu repositorio.



1. Caché inteligente de dependencias y compilación

El primer problema de los grandes proyectos TypeScript es la larga instalación de dependencias y la compilación. GitHub Actions proporciona un mecanismo de caché, pero debe configurarse correctamente. En lugar de almacenar en caché toda la carpeta node_modules (lo que puede provocar versiones obsoletas), es mejor almacenar en caché package-lock.json y la carpeta .cache del compilador.

Ejemplo de caché avanzado para TypeScript:

name: TypeScript CI (Advanced)on: [push, pull_request]

jobs: build: 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: Cache TypeScript cache uses: actions/cache@v4 with: path: | **/node_modules **/.tsbuildinfo key: ${{ runner.os }}-ts-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-ts- - run: npm ci - run: npm run build --if-present - run: npm test

La optimización clave aquí es el uso de hashFiles('**/package-lock.json') para generar una clave de caché única. Si package-lock.json no ha cambiado, el caché se restaura en segundos. La bandera --if-present permite omitir el script de compilación si no está definido.



2. Compilaciones matriciales: pruebas en diferentes versiones de Node.js y SO

TypeScript se compila a JavaScript, pero el comportamiento del código puede diferir en diferentes entornos de ejecución. La estrategia matricial de GitHub Actions permite ejecutar el mismo pipeline en múltiples combinaciones de SO y versiones de Node.js. Esto es crítico para bibliotecas y aplicaciones de servidor.

Ejemplo de configuración de matriz para un proyecto TypeScript:

jobs:  test:    runs-on: ${{ matrix.os }}    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        node-version: [18, 20, 22]        exclude:          - os: windows-latest            node-version: 22      fail-fast: false

steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npx tsc --noEmit - run: npm test - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.os }}-${{ matrix.node-version }} path: coverage/

Puntos clave: