Hugo 定时发布教程

Hugo 实战技巧:为什么设定了「未来日期」文章没显示?教你用 GitHub Actions 实现全自动定时发布

January 6, 2026

最近在撰写网站文章内容时,我遇到一个有趣的问题。

我在文章的 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 的构建。

  1. 登录 Cloudflare Dashboard。
  2. 进入 计算与AI -> Workers 和 Pages -> 选择你的项目。
  3. 点击 Settings (设置)
  4. 在构建里找到 Deploy hooks (部署挂钩)
  5. 点击右边的 + ,在 部署挂钩名称 里填写名称为 “Daily Build(定时部署)"。
  6. 如果你要多个分支,请选择你部署项目时的分支,点击下方的 完成
  7. 复制生成的那个 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 点自动运行这个脚本。

  1. 脚本发送信号给 Cloudflare。
  2. Cloudflare 重新拉取代码并运行 hugo
  3. Hugo 发现:“咦,今天是 1 月 4 号了,那篇设定为 4 号的文章不再是未来文章了!”
  4. Hugo 生成该文章的 HTML。
  5. 文章自动上线。

这就实现了真正的 “定时发布”(Scheduled Publishing)。现在,你可以一次性写好一周的文章,设定好不同的日期,然后放心地去度假了!🏖️

延伸阅读