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.
¿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. Conectas tu repo de GitHub a Cloudflare Pages
- 2. Cloudflare detecta el framework (Astro, Next.js, Hugo, etc.)
- 3. Cada push a main se despliega automáticamente
- 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. Ve a tu repo en GitHub → Settings → Secrets and variables → Actions
- 2. Crea un secret:
CLOUDFLARE_API_TOKEN - 3. Pega tu token (desde Cloudflare Dashboard)
- 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. CLOUDFLARE_API_TOKEN: Cloudflare Dashboard → User → Tokens API → Create token → "Edit Cloudflare Workers" template
- 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
- Haces push a rama feature en GitHub
- GitHub Actions detecta cambio → ejecuta tests + lint + build
- Si todo OK, GitHub genera preview deploy en Cloudflare Pages
- Los revisores ven URL de preview en la PR
- Si hay issue, rechazas. Si está bien, apruebas merge
Flujo en main (producción)
- PR se mergea a main
- GitHub Actions ejecuta workflow nuevamente
- Build termina correctamente
- Deploy job se ejecuta → carga archivos a Cloudflare Pages
- Tu URL de producción (https://hostingrecomendado.net) se actualiza
- Usuarios ven los cambios nuevos
Mejores prácticas
cache: npm en setup-node para instalar más rápido ${{ secrets.NOMBRE }} 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
Cloudflare Pages vs Vercel
Comparativa de las dos plataformas con mejor CI/CD integrado
Desplegar Astro en Cloudflare Pages
Tutorial paso a paso para sitios estáticos ultra-rápidos
Static Site Generators: Guía 2026
Astro, Next.js, Hugo y más. Cuándo usar cada uno.
Hub Hosting
Comparativa de todos los proveedores con CI/CD
¿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 →