Les expressions cron sont le langage universel pour planifier des tâches récurrentes. Mais quand on passe du crontab traditionnel aux plateformes serverless, chaque plateforme a ses particularités. Ce guide couvre tout pour planifier des jobs sur les trois plateformes serverless les plus populaires.
Bases des expressions cron
Une expression cron standard a 5 champs :
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *Caractères spéciaux courants :
*— toute valeur*/5— toutes les 5 unités1,3,5— valeurs spécifiques1-5— plage de valeurs
Testez vos expressions cron avec notre Cron Parser →
Plateforme 1 : GitHub Actions
GitHub Actions utilise l'événement schedule avec la syntaxe cron standard à 5 champs.
Configuration
# .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"Limitations clés
| Aspect | Détails |
|---|---|
| Fuseau horaire | UTC uniquement |
| Intervalle minimum | Toutes les 5 minutes (*/5 * * * *) |
| Précision | Délai possible de 5-15 min en charge |
| Branche | Branche par défaut uniquement |
| Désactivation | Désactivé après 60 jours d'inactivité |
Planifications courantes
# 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: Les workflows GitHub Actions peuvent ne pas s'exécuter à l'heure exacte. Pour plus de précision, utilisez un déclencheur webhook.
Plateforme 2 : Vercel Cron Jobs
Les Cron Jobs Vercel déclenchent des fonctions serverless. Configurez-les dans vercel.json.
Configuration
// vercel.json
{
"crons": [
{
"path": "/api/daily-report",
"schedule": "0 8 * * *"
},
{
"path": "/api/cleanup",
"schedule": "0 0 * * 0"
}
]
}La 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; // secondsLimitations clés
| Plan | Intervalle min | Max Cron Jobs | Limite d'exécution |
|---|---|---|---|
| Hobby (free) | Once per day | 2 | 10s |
| Pro | Once per hour | 40 | 60s (default) |
| Enterprise | Once per minute | 100 | 900s |
Important: Les Cron Jobs Vercel utilisent UTC. Sur Hobby, une fois par jour uniquement.
Plateforme 3 : Cloudflare Workers
Les Cron Triggers sont configurés dans wrangler.toml.
Configuration
# 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
]Code 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;
}
},
};Limitations clés
| Aspect | Détails |
|---|---|
| Fuseau horaire | UTC uniquement |
| Intervalle minimum | Une fois par minute |
| Max cron triggers | 3 par Worker (gratuit) |
| CPU | 10ms (gratuit) / 30s (payant) |
| Précision | Très fiable — exécution en edge |
Comparaison multiplateforme
| Fonctionnalité | GitHub Actions | Vercel Cron | CF Workers |
|---|---|---|---|
| Timezone | UTC | UTC | UTC |
| Min interval (free) | 5 min | 1/day | 1 min |
| Min interval (paid) | 5 min | 1/min | 1 min |
| Reliability | Medium (can delay) | High | Very high |
| Max execution time | 6 hours | 10s-900s | 10ms-30s |
| Config location | .github/workflows/ | vercel.json | wrangler.toml |
| Trigger handler | Workflow YAML | API route | scheduled() event |
Piège des fuseaux horaires
Les trois plateformes utilisent UTC exclusivement.
| Heure locale | Décalage UTC | Cron (9h locale) |
|---|---|---|
| US Eastern (EST) | UTC-5 | 0 14 * * * |
| US Pacific (PST) | UTC-8 | 0 17 * * * |
| Central Europe (CET) | UTC+1 | 0 8 * * * |
| China (CST) | UTC+8 | 0 1 * * * |
| Japan (JST) | UTC+9 | 0 0 * * * |
Attention : l'heure d'été modifie les décalages UTC.
10 expressions cron prêtes à l'emploi
Planifications les plus courantes :
# 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 * *Validez vos expressions cron avec notre Cron Parser →
Questions fréquentes
Quel fuseau horaire pour GitHub Actions ?
GitHub Actions utilise toujours UTC.
Quel intervalle minimum pour Vercel Cron ?
Hobby : 1/jour, Pro : 1/heure, Enterprise : 1/minute.
Cloudflare Workers peut-il tourner chaque seconde ?
Non. Granularité minimum : une minute.