定时工作流是什么
GitHub Actions 用 on.schedule 加 cron 语法为工作流设定时触发:时间一律按 UTC 计算,高峰期可能延迟执行。仓库长时间无活动时定时工作流会被自动停用,需要手动重新启用,因此定时任务要配手动兜底入口和失败通知,别指望它永远安静地跑。
基本信息
| 语法 | cron: '0 18 * * *'(UTC 时区) |
|---|---|
| 时区 | 一律 UTC,换算本地时间要手动加偏移 |
| 延迟 | 高峰期可能延迟数分钟到更久 |
| 停用 | 仓库长期无活动后自动停用 |
| 兜底 | 保留 workflow_dispatch 手动补跑 |
| 通知 | 失败任务要有结果通知渠道 |
| 分散 | 多个定时任务错开分钟数,减少同时排队 |
定时加手动触发
定时加手动触发
name: nightly-sync
on:
schedule:
- cron: '0 18 * * *' # 每天 UTC 18:00,即北京时间 02:00
workflow_dispatch: # 手动补跑入口
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./scripts/sync.sh # 实际任务脚本典型使用场景
- 夜间巡检:依赖更新检查、安全扫描、数据同步
- 报表生成:每日或每周定时产出并提交到仓库或制品
- 缓存预热:业务高峰前定时预热缓存或派生数据
- 合规任务:定期导出审计数据、检查凭据轮换
- 补跑:定时漏跑后用手动触发补齐
- 清理任务:定时清理过期产物与临时分支
- 预览环境回收:定时销毁超期的分支预览站点
常见现象与对策
| 现象 | 原因 | 对策 |
|---|---|---|
| 没按本地时间跑 | cron 按 UTC | 手动换算或两套表达式对照 |
| 任务延迟 | 高峰期排队 | 任务做成幂等,不依赖精确时点 |
| 突然不执行 | 长期无活动被停用 | 定期检查并重新启用 |
| 失败无感知 | 没有通知 | 失败时发通知到团队渠道 |
| 无法手动补跑 | 没配手动触发 | 保留 workflow_dispatch |
| 时区换算写错 | 固定偏移换算出错 | 注释标注两地时间 |
关键定时任务做成幂等:延迟或补跑时不会产生重复副作用。
忽略自动停用:夜间任务长期未执行无人察觉,定时任务要有健康检查。
cron 最小间隔为 5 分钟,别写更密的表达式。
多个仓库的定时任务错开分钟数:同时整点触发会排队,分散到不同分钟更稳。