GitHub Actions 手动触发正常,为何定时任务不执行?
先确认触发配置的缩进
0 22 * * * 在未指定时区时表示每天 UTC 22
schedule 和 workflow_dispatch 都应放在 on 下面。
如果仓库中的文件与贴出的片段完全一致,触发配置的层级就有误;如果只是粘贴时丢失了缩进,还不能确定根因。手动执行正常也不能证明默认分支上的定时配置正确。GitHub 的 schedule 配置说明列出了触发配置的嵌套结构和默认时区规则。
正确的触发配置
检查默认分支 .github/workflows/run.yml 中的触发部分,确保结构如下,并保留已有的 jobs 配置:
on:
schedule:
- cron: '0 22 * * *'
workflow_dispatch:
直接查看 main 分支上的文件原文,不要只检查本地文件或其他分支。
定时工作流只在默认分支运行,使用该分支的最新提交。修改合并到默认分支后,需要等待下一次计划触发时间,手动运行不能替代这项验证。默认分支要求
API 没有 schedule 字段,是否说明配置未生效?
不能这样判断。列出工作流和获取单个工作流的 REST API 返回的是工作流元数据,不提供完整的 YAML 触发配置。官方响应示例包含 id、path、state 等字段,没有 schedule 字段。
state: active 表示工作流处于启用状态,不能确认定时事件一定会触发;响应中缺少 schedule 也不能证明定时配置未被识别。工作流 REST API 文档
页面上的时钟图标或“Scheduled”字样同样不应作为唯一判断依据。可以直接查看是否有由 schedule 事件创建的运行记录。
查询实际的定时运行记录
如果已经安装并登录 GitHub CLI,可以运行下面的只读查询,将 OWNER 和 REPO 替换为实际仓库信息:
gh api 'repos/OWNER/REPO/actions/workflows/run.yml/runs?event=schedule&per_page=10'
该接口支持通过 event 筛选运行记录。工作流运行记录 API 文档
- 如果返回了运行记录,说明定时事件已经创建了运行实例。接下来检查
status、conclusion、作业日志和if条件,确认运行是否排队、失败或被跳过。 - 如果请求成功但列表为空,只能说明本次查询没有返回定时运行记录。不能单凭这一结果确定配置错误,也不能排除历史记录已被清理。
- 如果返回权限错误或找不到资源,先核对仓库名称、文件名和访问权限。
配置正确后,还应检查哪些原因?
整点调度可能延迟或丢弃
GitHub 说明,定时事件可能在高负载期间延迟,整点是高负载时段之一;负载足够高时,部分排队作业还可能被丢弃。因此,没有在 22
准时启动,不足以说明配置失效。定时调度限制如果业务允许,可以将时间调整为非整点,例如:
on:
schedule:
- cron: '17 22 * * *'
workflow_dispatch:
这会将计划时间改为每天 KST 上午 7
,但不能保证解决所有调度问题。如果必须保持上午 7 点,就保留原表达式,并接受实际启动可能延迟的限制。公共仓库可能因长期无活动停用定时任务
公共仓库连续 60 天没有仓库活动时,定时工作流会自动停用。如果符合这一情况,应检查工作流是否需要重新启用。题目中查询到的 active 状态不支持直接将“工作流已停用”判定为当前根因。自动停用规则
关联 actor 账号可能失效
如果定时工作流关联的 actor 账号被暂停、删除或取消配置,也可能出现工作流仍启用、手动运行正常,但定时运行停止的情况。GitHub 的排障文档建议,确认属于这种情况后,由具有仓库 write 权限的用户提交一次 cron 配置变更,以恢复运行。关联账号排查说明
如果上述检查均无异常,且多个预期调度时间过去后仍无运行记录,应整理默认分支上的完整 YAML、相关提交时间、预期 UTC 触发时间和 API 查询结果,再向 GitHub 支持反馈。现有信息不足以认定是 GitHub 调度故障,也没有依据认为重新手动运行一次就能修复定时触发。
备注:内容仅供参考。
