DevToolBoxGRATIS
Blog

Cron para Serverless: GitHub Actions, Vercel Cron y Cloudflare Workers

9 min de lecturapor DevToolBox
Ad Space

Las expresiones cron son el lenguaje universal para programar tareas recurrentes. Cada plataforma serverless tiene sus propias peculiaridades.

Conceptos básicos de cron

Una expresión cron estándar tiene 5 campos:

┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *

Caracteres especiales comunes:

  • *cualquier valor
  • */5cada 5 unidades
  • 1,3,5valores específicos
  • 1-5rango de valores

Prueba tus expresiones cron con nuestro Cron Parser →

Plataforma 1: GitHub Actions

GitHub Actions usa el evento schedule.

Configuración

# .github/workflows/scheduled.yml
name: Scheduled Job
on:
  schedule:
    - cron: '30 5 * * 1-5'  # Weekdays at 5:30 AM UTC
    - cron: '0 12 1 * *'    # 1st of every month at noon UTC
jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "Running scheduled task"

Limitaciones

AspectoDetalles
Zona horariaSolo UTC
Intervalo mínCada 5 minutos (*/5 * * * *)
PrecisiónPosible retraso
BranchSolo branch por defecto
DesactivaciónTras 60 días inactividad

Horarios comunes

# Every 5 minutes
- cron: '*/5 * * * *'

# Every hour at minute 0
- cron: '0 * * * *'

# Daily at midnight UTC
- cron: '0 0 * * *'

# Daily at 9 AM Eastern (UTC-5, no DST)
- cron: '0 14 * * *'

# Weekdays at 8 AM UTC
- cron: '0 8 * * 1-5'

# Every Monday and Thursday at 6 PM UTC
- cron: '0 18 * * 1,4'

# First day of every month at midnight
- cron: '0 0 1 * *'

Tip: GitHub Actions puede retrasarse.

Plataforma 2: Vercel Cron Jobs

Configuración en vercel.json.

Configuración

// vercel.json
{
  "crons": [
    {
      "path": "/api/daily-report",
      "schedule": "0 8 * * *"
    },
    {
      "path": "/api/cleanup",
      "schedule": "0 0 * * 0"
    }
  ]
}

Ruta API

// app/api/daily-report/route.ts
import { NextResponse } from 'next/server';

export async function GET() {
  // Your scheduled logic here
  await sendDailyReport();
  return NextResponse.json({ ok: true });
}

// Vercel recommends setting maxDuration for long tasks
export const maxDuration = 60; // seconds

Limitaciones

PlanInt. mínMax Cron JobsLímite ejecución
Hobby (free)Once per day210s
ProOnce per hour4060s (default)
EnterpriseOnce per minute100900s

Important: Vercel usa UTC. Hobby: 1/día.

Plataforma 3: Cloudflare Workers

Configuración en wrangler.toml.

Configuración

# wrangler.toml
name = "my-worker"
main = "src/index.ts"

[triggers]
crons = [
  "*/5 * * * *",    # Every 5 minutes
  "0 12 * * 1-5",   # Weekdays at noon UTC
  "0 0 1 * *"       # First of every month
]

Código Worker

// src/index.ts
export default {
  async scheduled(
    controller: ScheduledController,
    env: Env,
    ctx: ExecutionContext
  ) {
    // controller.cron contains the cron pattern that triggered
    switch (controller.cron) {
      case '*/5 * * * *':
        await doHealthCheck(env);
        break;
      case '0 12 * * 1-5':
        await sendReport(env);
        break;
    }
  },
};

Limitaciones

AspectoDetalles
Zona horariaSolo UTC
Intervalo mín1x por minuto
Max cron triggers3 por Worker (gratis)
CPU10ms/30s
PrecisiónMuy fiable

Comparación plataformas

CaracterísticaGitHub ActionsVercel CronCF Workers
TimezoneUTCUTCUTC
Min interval (free)5 min1/day1 min
Min interval (paid)5 min1/min1 min
ReliabilityMedium (can delay)HighVery high
Max execution time6 hours10s-900s10ms-30s
Config location.github/workflows/vercel.jsonwrangler.toml
Trigger handlerWorkflow YAMLAPI routescheduled() event

Trampa de zonas horarias

Las tres usan exclusivamente UTC.

Hora localDesplazamiento UTCCron (9h local)
US Eastern (EST)UTC-50 14 * * *
US Pacific (PST)UTC-80 17 * * *
Central Europe (CET)UTC+10 8 * * *
China (CST)UTC+80 1 * * *
Japan (JST)UTC+90 0 * * *

El horario de verano cambia los offsets UTC.

10 expresiones cron listas

Horarios más comunes:

# Every 5 minutes
*/5 * * * *

# Every hour at :00
0 * * * *

# Every day at midnight UTC
0 0 * * *

# Every day at noon UTC
0 12 * * *

# Weekdays (Mon-Fri) at 9 AM UTC
0 9 * * 1-5

# Every Monday at 8 AM UTC
0 8 * * 1

# Every 6 hours
0 */6 * * *

# First day of every month at midnight
0 0 1 * *

# Every 15 minutes during business hours (8-17 UTC)
*/15 8-17 * * 1-5

# Last day of month at 11 PM UTC (approximate)
0 23 28-31 * *

Valida expresiones cron con Cron Parser →

Preguntas frecuentes

¿Qué zona horaria usa GitHub Actions?

Siempre UTC.

¿Intervalo mín de Vercel Cron?

Hobby: 1/día, Pro: 1/hora, Enterprise: 1/minuto.

¿Cloudflare Workers cada segundo?

No. Granularidad mín: 1 minuto.

Prueba estas herramientas relacionadas

Cron Expression Parser
Ad Space

Artículos relacionados

Validación YAML Docker Compose: 10 errores de sintaxis comunes y cómo corregirlos

Deja de perder tiempo con errores YAML de Docker Compose. Aprende a identificar y corregir los 10 errores más comunes.