DevToolBox免费
博客

Serverless 平台的 Cron 调度:GitHub Actions、Vercel Cron 和 Cloudflare Workers

9 分钟阅读作者 DevToolBox
Ad Space

Cron 表达式是调度重复任务的通用语言。从传统 crontab 迁移到 Serverless 平台时,各平台都有各自的限制和语法差异。本指南涵盖三大主流 Serverless 平台的 Cron 调度配置。

Cron 表达式基础(60 秒速览)

标准 cron 表达式包含 5 个字段

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

常用特殊字符:

  • *任意值
  • */5每 5 个单位(步进)
  • 1,3,5指定值(列表)
  • 1-5值范围

使用我们的 Cron 解析器测试表达式 →

平台 1:GitHub Actions

GitHub Actions 使用 schedule 事件,采用标准 5 字段 cron 语法。定时工作流仅在默认分支运行。

配置

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

关键限制

方面详情
时区仅 UTC
最小间隔每 5 分钟 (*/5 * * * *)
准确性高峰时可能延迟 5-15 分钟
分支仅默认分支
停用条件仓库 60 天无活动后自动停用

GitHub Actions 常用调度

# 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 定时工作流可能无法准时触发。如需精确控制,建议使用外部调度器的 webhook 触发。

平台 2:Vercel Cron Jobs

Vercel Cron Jobs 按计划触发 Serverless 函数。在 vercel.json 中配置。

配置

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

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

关键限制

套餐最小间隔最大 Cron 任务数执行时限
Hobby (free)Once per day210s
ProOnce per hour4060s (default)
EnterpriseOnce per minute100900s

Important: Vercel Cron 使用 UTC。Hobby 套餐每天最多一次,像 */5 * * * * 的表达式不会按预期工作。

平台 3:Cloudflare Workers(Cron Triggers)

Cloudflare Workers Cron Triggers 在 wrangler.toml 中配置,在全球边缘运行。

配置

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

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

关键限制

方面详情
时区仅 UTC
最小间隔每分钟一次
Max cron triggers每 Worker 3 个(免费版)
CPU 时间10ms(免费)/30s(付费)
准确性非常可靠,边缘执行

跨平台对比

特性GitHub 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

常见时区陷阱

三个平台都 exclusively 使用 UTC,这是配置 cron 时最常见的 bug 来源。以下是常用时区的 UTC 转换表:

本地时间UTC 偏移Cron(本地 9 点)
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 * * *

注意:夏令时会改变 UTC 偏移。EST(UTC-5)在夏季变为 EDT(UTC-4)。Cron 任务不会自动调整。

10 个即用 Cron 表达式

以下是常用调度示例,可直接复制:

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

使用 Cron 解析器验证表达式 →

常见问题

GitHub Actions cron 使用什么时区?

GitHub Actions 始终使用 UTC,无法更改。如需美东 9 点运行,需转换为 UTC(1PM 或 2PM,视夏令时而定)。

Vercel Cron Jobs 的最小间隔是多少?

Hobby(免费):每天 1 次;Pro:每小时 1 次;Enterprise:每分钟 1 次。

Cloudflare Workers Cron 能否每秒运行?

不能。Cloudflare Workers 最小粒度为 1 分钟。如需亚分钟级调度,需使用 Durable Objects 的 alarm() API。

试试这些相关工具

Cron Expression Parser
Ad Space

相关文章

Docker Compose YAML 验证:10 个常见语法错误及修复方法

别再浪费时间在 Docker Compose YAML 错误上。学会识别和修复 10 个最常见的语法错误。