Hugo 实战技巧:为什么设定了「未来日期」文章没显示?教你用 GitHub Actions 实现全自动定时发布
最近在撰写网站文章内容时,我遇到一个有趣的问题。
我在文章的 Front Matter(头部配置)中,将日期设定为了未来的一天:
date: 2026-01-04
我的本意是希望 到了 1 月 4 号那天,这篇文章自动出现在首页。结果日子到了,我刷新了无数次网站,文章却依然处于“隐身”状态。
这到底是为什么?难道 Hugo 坏了吗?
经过一番研究,我发现这其实是静态网站生成器 (Static Site Generator) 的核心特性决定的。今天就来分享一下原理,以及如何用 GitHub Actions 完美解决这个问题。
1. 原理揭秘:为什么它不会“自动”显示?
要理解这个问题,我们必须区分 “动态网站”(如 WordPress)和 “静态网站”(如 Hugo)。
- WordPress (动态): 当你访问网页时,服务器会实时查询数据库。如果它发现有一篇文章的发布时间是“现在”,它就会立刻从数据库里把它捞出来展示给你。
- Hugo (静态): Hugo 没有数据库。当你运行
hugo build命令时,它就像印刷报纸一样,把那一瞬间的内容“打印”成 HTML 文件。
关键点来了: 当 Hugo 进行构建(Build)时,它会检查每篇文章的日期。
- 如果
文章日期 > 当前构建日期,Hugo 会认为这是一篇“未来文章”,默认直接跳过,不生成它的 HTML 文件。
所以,即使时间到了 2026 年 1 月 4 日,服务器上存放的依然是 1 月 3 日那是构建的旧版 HTML。除非你重新运行构建命令,否则那篇文章永远不存在于服务器上。
2. 常见的(但不太完美)解决方案
方案 A:手动构建 (最原始)
等到日子到了,打开电脑,手动推送一次代码,或者去 Cloudflare 后台点一下“重新部署”。
- 缺点: 费人。万一你当时在睡觉、在旅游或者没网,文章就发不出来了。
方案 B:强制显示未来文章 (Build Future)
你可以在 hugo.yaml 中设置 buildFuture: true。
- 缺点: 这会让文章现在立刻显示出来,不管日期是不是未来。这适合预览草稿,但不适合“定时发布”。
3. 终极方案:GitHub Actions 定时自动构建 🤖
我们要实现的是:人可以睡觉,但代码必须自动干活。
我们可以利用 GitHub Actions 的定时任务 (Cron Job) 功能,每天早上自动“戳”一下 Cloudflare,告诉它:“嘿,重新构建一下网站,看看有没有新文章到了发布时间。”
第一步:获取 Cloudflare 的部署钩子 (Deploy Hook)
我们需要一个“按钮”,让 GitHub 能远程触发 Cloudflare 的构建。
- 登录 Cloudflare Dashboard。
- 进入 计算与AI -> Workers 和 Pages -> 选择你的项目。
- 点击 Settings (设置)。
- 在构建里找到 Deploy hooks (部署挂钩)。
- 点击右边的 + ,在 部署挂钩名称 里填写名称为 “Daily Build(定时部署)"。
- 如果你要多个分支,请选择你部署项目时的分支,点击下方的 完成。
- 复制生成的那个 URL(类似于
https://api.cloudflare.com/...)。只出现一次,记得复制后保存好。
第二步:编写 GitHub Action 脚本
在你的 Hugo 项目根目录下,创建文件夹和文件:
.github/workflows/schedule-build.yml
将以下代码复制进去:
name: Scheduled Build (定时构建)
on:
schedule:
# 这里的语法是 Cron 表达式
# '0 0 * * *' 代表每天 UTC 时间 00:00 (北京时间早上 8:00) 自动运行
- cron: '0 0 * * *'
# 同时也允许你在 GitHub 网页上手动点击按钮触发
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Trigger Cloudflare Pages Build
# 使用 curl 命令向 Cloudflare 发送请求
# 请将下面的 URL 换成你第一步里获取的真实 URL
run: curl -X POST "https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/YOUR_HOOK_ID_HERE"将最后一句链接,替换成你的链接。
⚠️ 注意: 为了安全起见,建议将那个长长的 URL 放入 GitHub 的 Secrets 中(在 Repo Settings -> Secrets and variables -> Actions),然后用 ${{ secrets.CLOUDFLARE_HOOK_URL }} 引用。
第三步:提交代码
将这个文件推送到 GitHub。
✅ 效果验收
从现在开始,GitHub 会在每天早上 8 点自动运行这个脚本。
- 脚本发送信号给 Cloudflare。
- Cloudflare 重新拉取代码并运行
hugo。 - Hugo 发现:“咦,今天是 1 月 4 号了,那篇设定为 4 号的文章不再是未来文章了!”
- Hugo 生成该文章的 HTML。
- 文章自动上线。
这就实现了真正的 “定时发布”(Scheduled Publishing)。现在,你可以一次性写好一周的文章,设定好不同的日期,然后放心地去度假了!🏖️