GitHub Actions定时任务为什么在特定时间不执行?

宇文熙妍 阅读 97

我配置了一个每周一上午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仓库是公开的,账户是个人免费版,应该没问题吧?搞不懂哪里出问题了…

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
子骞 Dev
GitHub Actions 的定时任务不执行,其实我之前也踩过类似的坑。你提到测试用 * 可以运行,说明工作流文件的位置和基本结构没问题,那问题基本可以锁定在 cron 表达式和时区上了。

你说得没错,默认情况下 GitHub Actions 的定时任务是使用 UTC 时间的。所以如果你的本地时间是 UTC+8,那 10 点对应的 UTC 就是 2 点,也就是你写的是 0 10 1,实际上是 UTC 时间周一的 10 点,对应不到你所在的时区。

解决方法就是在 schedule 那里加上 timezone 参数,比如你在中国的话,可以改成:

on:
schedule:
- cron: '0 10 * * 1'
timezone: Asia/Shanghai
workflow_dispatch:


加上 timezone 之后,这个 cron 就会按照你指定的时区来执行了。如果不加,那就默认走 UTC。

另外,你还提到了日志里显示 "Waiting for pending deployment",这个一般是因为上一次 workflow 还没跑完,或者有其他 workflow 正在运行,GitHub Actions 默认会限制同一个 workflow 同时只能跑一个实例。你可以加个 concurrency 参数来控制行为,比如:

jobs:
deploy:
runs-on: ubuntu-latest
concurrency: weekly-deploy
steps:
- uses: actions/checkout@v3
- run: npm ci && npm run build


这样可以避免因为上次任务还没结束导致这次任务卡住。顺便说一句,免费账户的并发限制其实不高,一般不会卡你这种简单任务。

总之先加 timezone,再加 concurrency,这两个参数加完基本上就能解决你的问题了。我之前就是这么调通的,你可以试试看。
点赞 3
2026-02-07 14:27
红爱 Dev
你的问题我遇到过,确实是时区问题导致的。GitHub Actions 的 Cron 表达式默认是基于 UTC 时间的,而不是你本地的时间。所以即使你的配置看起来没问题,但实际运行时可能已经偏离了你想设定的时间点。

### 首先你要搞清楚几点:
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 14 * * 0


这里解释一下:
- 0 表示星期天(Sunday)。
- 14 表示 UTC 时间的下午 2 点。

#### 2. 修改工作流文件
直接修改你的 YAML 文件中的 cron 部分:

on:
schedule:
- cron: '0 14 * * 0' # 每周日的 UTC 下午 2 点触发
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm ci && npm run build


保存并提交到你的仓库。

---

### 为什么这么做?
因为 GitHub Actions 的 Cron 是严格遵循 UTC 时间的,不会自动根据你的时区调整。如果不转换成 UTC 时间,任务就会在错误的时间点触发或者干脆不触发。

---

### 其他需要注意的地方
1. **并发限制**:你提到账户没有到并发限制,这点没错。免费版的 GitHub Actions 只要不超过 20 个并发任务就没有问题。
2. **日志状态 "Waiting for pending deployment"**:这个状态通常是因为触发条件未满足,或者任务被其他流程阻塞。现在调整了 Cron 后应该不会再出现这个问题。
3. **测试用例**:如果你想快速验证调整后的 Cron 是否生效,可以暂时改成每小时触发一次(比如 0 * * * *),等确认无误后再改回正式的时间。

---

### 总结
把 Cron 改成 0 14 * * 0 就能确保任务在每周一的北京时间上午 10 点触发了。下次再设置定时任务的时候记得一定要考虑到时区问题,不然调试起来真的很头疼!希望这次调整能帮你解决问题,如果还有其他疑问可以继续问。
点赞 16
2026-01-30 15:07