DevToolBoxGRATIS
Blog

Cron per Serverless: GitHub Actions, Vercel Cron e Cloudflare Workers

9 min di letturadi DevToolBox
Ad Space

Le espressioni cron sono il linguaggio universale per pianificare attività ricorrenti. Ogni piattaforma serverless ha le sue peculiarità.

Basi delle espressioni cron

Un'espressione cron standard ha 5 campi:

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

Caratteri speciali comuni:

  • *qualsiasi valore
  • */5ogni 5 unità
  • 1,3,5valori specifici
  • 1-5intervallo

Testa le tue espressioni cron con il nostro Cron Parser →

Piattaforma 1: GitHub Actions

GitHub Actions usa l'evento schedule.

Configurazione

# .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"

Limitazioni

AspettoDettagli
Fuso orarioSolo UTC
Intervallo minOgni 5 minuti (*/5 * * * *)
PrecisionePossibile ritardo
BranchSolo branch predefinito
DisattivazioneDopo 60 giorni inattività

Pianificazioni comuni

# 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 può ritardare.

Piattaforma 2: Vercel Cron Jobs

Configurazione in vercel.json.

Configurazione

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

Route 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

Limitazioni

PianoInterv. minMax Cron JobsLimite esecuzione
Hobby (free)Once per day210s
ProOnce per hour4060s (default)
EnterpriseOnce per minute100900s

Important: Vercel usa UTC. Hobby: 1/giorno.

Piattaforma 3: Cloudflare Workers

Configurazione in wrangler.toml.

Configurazione

# 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
]

Codice 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;
    }
  },
};

Limitazioni

AspettoDettagli
Fuso orarioSolo UTC
Intervallo min1x al minuto
Max cron triggers3 per Worker (gratis)
CPU10ms/30s
PrecisioneMolto affidabile

Confronto piattaforme

FunzioneGitHub 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

Trappola fusi orari

Tutte e tre usano esclusivamente UTC.

Ora localeOffset UTCCron (9h locale)
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 * * *

L'ora legale cambia gli offset UTC.

10 espressioni cron pronte

Pianificazioni più comuni:

# 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 espressioni cron con Cron Parser →

Domande frequenti

Quale fuso orario per GitHub Actions?

Sempre UTC.

Intervallo min Vercel Cron?

Hobby: 1/giorno, Pro: 1/ora, Enterprise: 1/minuto.

Cloudflare Workers ogni secondo?

No. Granularità min: 1 minuto.

Prova questi strumenti correlati

Cron Expression Parser
Ad Space

Articoli correlati

Validazione YAML Docker Compose: 10 errori di sintassi comuni e come risolverli

Smetti di perdere tempo con errori YAML Docker Compose. Impara a identificare e correggere i 10 errori più comuni.