Actualizado mayo 2026

CI/CD con Cloudflare Pages y GitHub Actions en 2026

Automatiza tu pipeline: desde el commit hasta el deploy en producción. GitHub Actions ejecuta tests, lint, builds y despliega automáticamente en Cloudflare Pages. Incluye preview deploys para cada PR y rollbacks al instante.

⏱️ Lectura: 10 min 📋 3 ejemplos YAML completos 🚀 Deploy automático + tests

¿Qué es CI/CD y por qué lo necesitas?

CI/CD significa Continuous Integration / Continuous Deployment. Es el proceso de automatizar todo lo que ocurre entre hacer push a tu código y que aparezca en producción.

Sin CI/CD, tenías que:

  • Descargar el repo, instalar dependencias manualmente
  • Ejecutar tests a mano y esperar a que terminen
  • Hacer build manualmente y esperar
  • Deployar manualmente a Cloudflare (o SSH a un servidor)
  • Rezar para que no haya roto nada

Con CI/CD, todo es automático. Haces push → GitHub Actions ejecuta todo → tu web está desplegada. Sin intervención manual.

Cloudflare Pages: el setup más simple

Cloudflare Pages ya incluye CI/CD integrado. No necesitas nada más:

  1. 1. Conectas tu repo de GitHub a Cloudflare Pages
  2. 2. Cloudflare detecta el framework (Astro, Next.js, Hugo, etc.)
  3. 3. Cada push a main se despliega automáticamente
  4. 4. Cada PR genera un deploy de preview único

✓ Zero config: No necesitas escribir workflows YAML si usas Cloudflare Pages. El deploy automático está incluido.

GitHub Actions: workflows personalizados

Si necesitas tests, lint, o steps personalizados ANTES de desplegar, usas GitHub Actions. Un workflow es un archivo YAML que describe los pasos del pipeline.

Estructura básica:

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run lint
      - run: npm run test
      - run: npm run build
      # Deploy a Cloudflare Pages
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: mi-proyecto
          directory: dist

Este workflow: instala Node, ejecuta lint y tests, hace build, y despliega a Cloudflare Pages.

Preview Deploys: revisar PRs en vivo

Cada PR en GitHub genera un deploy único en Cloudflare Pages:

  • Tu compañero de equipo hace PR → automáticamente tiene URL de preview
  • Tú haces review en una URL en vivo, no en local
  • Si todo está bien, merge a main y se despliega automáticamente
  • Si hay issue, rechazas la PR sin mergear

Clave del éxito: Los preview deploys son URLs temporales (como https://pr-42--mi-proyecto.pages.dev). Se eliminan cuando cierras la PR. Cloudflare genera automáticamente si usas Pages + GitHub integration.

Testing en el pipeline

Ejecutar tests automáticos antes de desplegar garantiza que no rompiste nada:

Vitest: tests unitarios

Prueba lógica de TypeScript/JavaScript:

- run: npm run test -- --run
  # En package.json:
  # "test": "vitest"

Playwright: tests E2E (end-to-end)

Automatiza el navegador: haz clic, escribe, verifica que aparece el contenido:

- run: npm run build
- run: npx playwright install
- run: npm run test:e2e
  # En playwright.config.ts:
  # webServer: { command: 'npm run preview', port: 4173 }

Lighthouse CI: tests de rendimiento

Verifica que tu web mantiene buenas métricas de performance:

- name: Lighthouse CI
  uses: treosh/lighthouse-ci-action@v10
  with:
    configPath: ./lighthouserc.json
    uploadArtifacts: true

Secrets Management: tokens seguros

Jamás commits API tokens o credenciales al repositorio. Los guardas en GitHub Secrets:

  1. 1. Ve a tu repo en GitHub → Settings → Secrets and variables → Actions
  2. 2. Crea un secret: CLOUDFLARE_API_TOKEN
  3. 3. Pega tu token (desde Cloudflare Dashboard)
  4. 4. En tu workflow, accede con ${{ secrets.CLOUDFLARE_API_TOKEN }}

⚠️ Importante: GitHub oculta los secrets en logs. Aunque veas el workflow ejecutarse, el token real nunca aparece en la salida.

Rollbacks y versionado en Cloudflare Pages

Si algo sale mal en producción, vuelves atrás en segundos:

  • Rollback automático: Haz revert del commit en GitHub → GitHub Actions vuelve a buildear → nuevo deploy
  • Rollback manual: Cloudflare Pages guarda todo el historial. En Dashboard → Deployments, selecciona uno anterior y haz click en "Rollback"
  • Branch staging: Crea rama staging. Los pushs a staging se despliegan a una URL diferente. Tú tiendes sin riesgo.

Cloudflare mantiene 25 deployments automáticamente. Si necesitas versiones más antiguas, configura retención manual en Settings.

Ejemplo completo: Astro + GitHub Actions + Cloudflare Pages

Aquí va el workflow real que usaría para desplegar un sitio Astro:

name: Deploy Astro to Cloudflare Pages

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        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: Lint code
        run: npm run lint

      - name: Run tests
        run: npm run test -- --run

      - name: Build Astro
        run: npm run build

      - name: Run Lighthouse CI
        uses: treosh/lighthouse-ci-action@v10
        with:
          configPath: ./lighthouserc.json
          uploadArtifacts: true
          temporaryPublicStorage: true

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    steps:
      - name: Checkout repository
        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: Build Astro
        run: npm run build

      - name: Deploy to Cloudflare Pages
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: hostingrecomendado
          directory: dist
          gitHubToken: ${{ secrets.GITHUB_TOKEN }}

¿Qué hace?

  • En TODA PR: lint + tests + build + Lighthouse (sin desplegar)
  • Solo en merge a main: deploy a producción
  • Si algún paso falla, el pipeline se detiene

Configuración: variables de entorno

Necesitas 2 tokens de Cloudflare. Los encuentras aquí:

  1. 1. CLOUDFLARE_API_TOKEN: Cloudflare Dashboard → User → Tokens API → Create token → "Edit Cloudflare Workers" template
  2. 2. CLOUDFLARE_ACCOUNT_ID: En Cloudflare Dashboard → Pages → tu proyecto → Settings, verás "Account ID"

Una vez obtengas los tokens, los agregas como GitHub Secrets (Settings → Secrets and variables → Actions → New repository secret).

Arquitectura: cómo fluye todo

Flujo en una PR

  1. Haces push a rama feature en GitHub
  2. GitHub Actions detecta cambio → ejecuta tests + lint + build
  3. Si todo OK, GitHub genera preview deploy en Cloudflare Pages
  4. Los revisores ven URL de preview en la PR
  5. Si hay issue, rechazas. Si está bien, apruebas merge

Flujo en main (producción)

  1. PR se mergea a main
  2. GitHub Actions ejecuta workflow nuevamente
  3. Build termina correctamente
  4. Deploy job se ejecuta → carga archivos a Cloudflare Pages
  5. Tu URL de producción (https://hostingrecomendado.net) se actualiza
  6. Usuarios ven los cambios nuevos

Mejores prácticas

Caching de dependencies: Usa cache: npm en setup-node para instalar más rápido
Matrix builds: Prueba en múltiples versiones de Node.js automáticamente
Status checks: En Settings → Branch protection rules, requiere que pasen todos los checks antes de mergear
Evita: Hardcodear secrets en el YAML. Siempre usa ${{ secrets.NOMBRE }}
Evita: Workflows que tardan más de 5 minutos en CI (indica problemas en tu código)

Preguntas frecuentes

¿Cuándo debo usar GitHub Actions vs deploy nativo de Cloudflare Pages? +

Deploy nativo: Si solo necesitas build automático (Astro, Next.js estático, Hugo). Zero config. Cloudflare detecta framework y maneja todo.

GitHub Actions: Si necesitas tests, lint, Lighthouse CI, o pasos personalizados ANTES de desplegar. Más control, más potencia.

Conclusión: Comienza con deploy nativo. Si después necesitas tests, añade GitHub Actions.

¿Cuánto tiempo tarda un deploy en Cloudflare Pages? +

Típicamente 1-3 minutos. Cloudflare descarga tu código, ejecuta build command, y despliega a su red global. Los tests y Lighthouse CI pueden añadir 2-5 minutos más.

Si necesitas más rápido, optimiza tu build step (reduce dependencias, cachea assets, usa esbuild en lugar de Webpack).

¿Qué pasa si mi PR falla los tests en GitHub Actions? +

GitHub marca la PR como "Checks failing". No puedes mergear a main si tienes branch protection rules habilitadas (recomendado).

Tienes que: ver el error en Actions → arreglarlo en tu rama → hacer push nuevamente → tests pasan → puedes mergear.

¿Cómo obtengo el Cloudflare Account ID? +

Ve a Cloudflare Dashboard → Pages → tu proyecto → clic en "Settings" (esquina superior derecha) → scrollea a "Account". Verás "Account ID". Cópialo y pégalo como GitHub Secret.

¿Puedo desplegar a múltiples ramas (main, staging, develop)? +

Con Cloudflare Pages nativo: Sí, automáticamente. Cada rama que conectes a Pages genera una URL diferente (staging.tudominio.pages.dev, develop.tudominio.pages.dev).

Con GitHub Actions: Puedes condicionar el deploy: if: github.ref == 'refs/heads/main' para que solo main se despliegue a producción.

Stack recomendado para 2026

Framework: Astro (SSG) o Next.js (con SSG export). Ambos compilan a HTML estático.

CI/CD: GitHub Actions (incluido gratis).

Testing: Vitest (unitarios) + Playwright (E2E) + Lighthouse CI (performance).

Linting: ESLint + Prettier en tu workflow. Rechaza PRs que no pasen linting.

Hosting: Cloudflare Pages. Deploy automático desde Git, preview por PR, CDN global, rollbacks al instante.

Coste total: €0 si usas Cloudflare Pages + GitHub (ambos gratis). GitHub Actions incluye 2000 minutos/mes gratis para repos públicos e ilimitados para privados (según plan).

Artículos relacionados

¿Cuál es el stack perfecto para tu proyecto?

Usa nuestra herramienta de recomendación inteligente. Te guía a través de tus necesidades (SSG vs SSR, presupuesto, features) y te recomienda el hosting exacto + pipeline CI/CD.

Ir a la herramienta →