GitHub Actions定时任务为什么在特定时间不执行?
我配置了一个每周一上午10点自动部署的GitHub Actions,但上周和这周都没触发,日志里显示”Waiting for pending deployment”。检查过Cron表达式是0 10 * * 1,工作流文件也正确放在.github/workflows下,账户也没到并发限制…
尝试过把时间改成* * * * *测试,可以正常运行。但恢复原定时后又不执行了。难道和时区设置有关?工作流里没写timezone参数,默认是UTC吗?
这是我的工作流配置片段:
on:
schedule:
- cron: '0 10 * * 1'
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm ci && npm run build
GitHub仓库是公开的,账户是个人免费版,应该没问题吧?搞不懂哪里出问题了…
你说得没错,默认情况下 GitHub Actions 的定时任务是使用 UTC 时间的。所以如果你的本地时间是 UTC+8,那 10 点对应的 UTC 就是 2 点,也就是你写的是 0 10 1,实际上是 UTC 时间周一的 10 点,对应不到你所在的时区。
解决方法就是在 schedule 那里加上 timezone 参数,比如你在中国的话,可以改成:
加上 timezone 之后,这个 cron 就会按照你指定的时区来执行了。如果不加,那就默认走 UTC。
另外,你还提到了日志里显示 "Waiting for pending deployment",这个一般是因为上一次 workflow 还没跑完,或者有其他 workflow 正在运行,GitHub Actions 默认会限制同一个 workflow 同时只能跑一个实例。你可以加个 concurrency 参数来控制行为,比如:
这样可以避免因为上次任务还没结束导致这次任务卡住。顺便说一句,免费账户的并发限制其实不高,一般不会卡你这种简单任务。
总之先加 timezone,再加 concurrency,这两个参数加完基本上就能解决你的问题了。我之前就是这么调通的,你可以试试看。
### 首先你要搞清楚几点:
1. GitHub Actions 的 Cron 确实是基于 UTC 时间。
2. 你配置的是
0 10 * * 1,这表示的是每周一的 **UTC 时间上午 10 点**,而不是你本地时间(比如北京时间)。3. 如果你所在的时区和 UTC 有差异(比如北京是 UTC+8),那你需要调整 Cron 表达式来对齐正确的时间。
---
### 解决方案步骤
#### 1. 计算正确的 UTC 时间
如果你希望任务在每周一的北京时间上午 10 点执行,那需要将这个时间转换为 UTC 时间。北京时间比 UTC 快 8 小时,所以每周一的北京时间上午 10 点实际上是上周日的 UTC 时间下午 2 点(10 - 8 = 2)。因此,你需要将 Cron 表达式改为:
这里解释一下:
-
0表示星期天(Sunday)。-
14表示 UTC 时间的下午 2 点。#### 2. 修改工作流文件
直接修改你的 YAML 文件中的
cron部分:保存并提交到你的仓库。
---
### 为什么这么做?
因为 GitHub Actions 的 Cron 是严格遵循 UTC 时间的,不会自动根据你的时区调整。如果不转换成 UTC 时间,任务就会在错误的时间点触发或者干脆不触发。
---
### 其他需要注意的地方
1. **并发限制**:你提到账户没有到并发限制,这点没错。免费版的 GitHub Actions 只要不超过 20 个并发任务就没有问题。
2. **日志状态 "Waiting for pending deployment"**:这个状态通常是因为触发条件未满足,或者任务被其他流程阻塞。现在调整了 Cron 后应该不会再出现这个问题。
3. **测试用例**:如果你想快速验证调整后的 Cron 是否生效,可以暂时改成每小时触发一次(比如
0 * * * *),等确认无误后再改回正式的时间。---
### 总结
把 Cron 改成
0 14 * * 0就能确保任务在每周一的北京时间上午 10 点触发了。下次再设置定时任务的时候记得一定要考虑到时区问题,不然调试起来真的很头疼!希望这次调整能帮你解决问题,如果还有其他疑问可以继续问。