Hexo 静态博客方案 | GitHub Actions 自动化部署
[!abstract] 适用环境与目标
- 适用环境:macOS / Windows / Linux + Node.js 16.0+ + Git
- 目标:在 GitHub Pages 上搭建 Hexo 静态博客,实现「写文章 → 推送源码 → 自动构建并部署」的全自动化工作流
概述
静态博客方案结合了 Markdown 的写作体验和 GitHub Pages 的免费托管能力,是个人技术博客和知识库的首选方案之一。Hexo 作为最流行的静态博客框架,生态成熟、主题丰富、部署方式灵活,社区中积累了大量开箱即用的主题和插件。
本文以一个真实的生产环境博客(伞间岁月)为案例,详细讲解:
- Hexo 项目的初始化和核心配置
- 主题选择与定制要点
- GitHub Actions 自动化部署流水线的完整搭建
- 自定义域名与 CDN 加速
- 日常写作工作流和问题排查
一、整体架构
静态博客方案的核心思想是 源码与静态文件分离:源码仓库存放 Hexo 源文件(Markdown 文章、主题、配置),GitHub Pages 仓库只存放构建后的 HTML/CSS/JS。两者通过 GitHub Actions 自动同步。
|
这种架构的优势:
- 职责清晰:源文件和构建产物互不干扰
- 安全可控:源码仓库可设为 Private,Pages 仓库保持 Public
- 零成本运维:GitHub Pages + Actions 的免费额度对个人博客绰绰有余
- 全自动化:一次配置,永久生效,只管写作和推送
二、前置准备
2.1 安装 Node.js
Hexo 基于 Node.js,首先确保系统已安装 Node.js 16.0+:
|
2.2 安装 Git 并配置 SSH
|
将输出的公钥添加到 GitHub → Settings → SSH and GPG keys → New SSH key。
[!tip] SSH 配置参考
SSH 的详细配置(包括多账号、权限问题排查)可参考同系列的 《微信小程序 Git 远程仓库设置》。
2.3 创建两个 GitHub 仓库
需要准备两个仓库:
| 仓库 | 作用 | 建议可见性 |
|---|---|---|
blog-source |
存放 Hexo 源码(包括文章、主题、配置) | Private(可选) |
你的用户名.github.io 或 blog |
存放构建后的静态文件 | Public(必须) |
[!info] 命名说明
如果你的站点是用户级 Pages(https://你的用户名.github.io),Pages 仓库必须命名为你的用户名.github.io。如果是项目级 Pages(https://你的用户名.github.io/仓库名/),仓库名可以任意。
三、初始化 Hexo 项目
3.1 安装 Hexo CLI
|
3.2 创建项目
|
hexo init 生成的目录结构:
|
3.3 安装常用插件
|
各插件作用:
| 插件 | 作用 |
|---|---|
hexo-abbrlink |
为每篇文章生成唯一数字短链接(如 /posts/3789650242/),避免中文标题 URL 编码问题 |
hexo-generator-feed |
生成 RSS/Atom 订阅源,方便读者订阅更新 |
hexo-deployer-git |
本地 hexo deploy 命令的支持(可选,使用 GitHub Actions 时可省略) |
四、站点配置
4.1 编辑 _config.yml
项目根目录的 _config.yml 是 Hexo 的核心配置文件。以下是关键配置项:
|
4.2 初始化 Git 并推送到远程
|
五、主题配置
5.1 选择主题
Hexo 拥有丰富的主题生态,可通过 Hexo Themes 官方列表 浏览。以下是社区中活跃度较高的主题:
| 主题 | GitHub Stars | 特点 |
|---|---|---|
| Butterfly | 7k+ | 功能全面,文档完善,支持卡片布局和图片画廊 |
| Keep | 1k+ | 简洁现代,性能优化好,支持 PJAX 无刷新跳转 |
| NexT | 10k+ | 经典主题,生态丰富,插件体系完善 |
| Fluid | 2k+ | Material Design 风格,适配移动端优秀 |
5.2 安装主题
以 Keep 主题为例:
|
在 _config.yml 中启用:
|
5.3 主题配置方式(重要)
每个主题都有自己的配置项,有两种配置方式:
方式一(推荐):在项目根目录创建 _config.{主题名}.yml,Hexo 会自动合并此文件的内容到主题默认配置之上。这样做的好处是避免直接修改 themes/ 目录下的文件,方便以后升级主题。
|
方式二:直接编辑 themes/keep/_config.yml(不推荐,升级主题时会覆盖)。
[!note] 主题渲染器依赖
部分主题需要额外的渲染器。Keep 主题需要hexo-renderer-ejs和hexo-renderer-stylus,Butterfly 需要hexo-renderer-pug。安装主题时请阅读其文档确认。
六、GitHub Actions 自动化部署
这是本方案的核心环节。配置完成后,你只需要 git push 源码,博客便会自动构建并部署。
6.1 部署流程概览
|
6.2 创建 GitHub Personal Access Token
GitHub Actions 需要权限将构建产物推送到 Pages 仓库:
- 打开 GitHub → 右上角头像 → Settings → Developer settings → Personal access tokens → Tokens (classic)
- 点击 Generate new token (classic)
- Note:填写
HEXO_DEPLOY(方便识别) - Expiration:选择
No expiration(永不过期),或选择 90 天并在过期前刷新 - Scopes:勾选
repo(Full control of private repositories)——这包含了将文件推送到仓库所需的所有权限 - 点击底部的 Generate token
- 立即复制并保存生成的 Token(关闭页面后将无法再次查看)
6.3 将 Token 添加到源码仓库 Secrets
- 打开你的源码仓库 → Settings → Secrets and variables → Actions
- 点击 New repository secret
- Name:
HEXO_DEPLOY(必须与 workflow 文件中引用的名称一致) - Secret:粘贴上一步保存的 Token
- 点击 Add secret
6.4 创建 Workflow 文件
在项目根目录创建 .github/workflows/hexo-deploy.yml:
|
关键配置项说明:
| 参数 | 含义 | 示例 |
|---|---|---|
PERSONAL_TOKEN |
GitHub Token(通过 Secrets 引用) | ${{ secrets.HEXO_DEPLOY }} |
PUBLISH_REPOSITORY |
Pages 仓库位置 | realzhengxi/zhengxi_blog |
BRANCH |
部署分支,固定为 gh-pages |
gh-pages |
PUBLISH_DIR |
Hexo 构建产物目录 | ./public |
这个 Action 会自动完成以下步骤:
- 拉取源码仓库的最新代码
- 安装 Node.js(内置使用 Node 18)
- 执行
npm ci安装依赖(比npm install更快,且保证依赖版本锁定) - 执行
npx hexo generate构建静态文件 - 将
public/目录下的所有文件推送到 Pages 仓库的gh-pages分支 gh-pages分支的历史会被覆盖(保持只存最新版本)
6.5 提交并推送
|
推送后,打开源码仓库的 Actions 标签页,可以看到工作流正在执行。等待黄色的运行中图标变为绿色勾号,说明部署成功。
七、配置 GitHub Pages
7.1 启用 Pages 服务
- 打开 Pages 仓库 → Settings → Pages
- Source 选择 Deploy from a branch
- Branch 选择
gh-pages,目录选/ (root) - 点击 Save
配置完成后,博客即可通过 https://你的用户名.github.io/你的Pages仓库名/ 访问。
7.2 配置自定义域名
绑定自己的域名可以让博客更专业。以下以 blog.example.com 为例:
第一步:在域名 DNS 管理后台添加解析记录
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| CNAME | blog |
你的用户名.github.io |
第二步:在 Pages 仓库设置域名
在 Pages 仓库的 Settings → Pages → Custom domain 中输入 blog.example.com,点击 Save。GitHub 会自动签发 SSL/TLS 证书。
第三步:在源码仓库添加 CNAME 文件
在 source/ 目录下创建 CNAME 文件(无扩展名),内容为你的域名:
|
[!info] 为什么 CNAME 文件要放在
source/目录?
因为hexo generate时,source/下的所有文件(不含_posts/中的文章)会原样复制到public/,确保每次构建后 CNAME 文件都在部署目录中。
八、日常写作工作流
所有配置完成后,日常使用就变得非常简单:
|
推送后等待 1-2 分钟,GitHub Actions 构建部署完成,博客即自动更新。
九、最佳实践与注意事项
9.1 .gitignore 配置
|
确保 node_modules/ 和 public/ 不提交到 Git 仓库。
9.2 借助 CDN 加速静态资源
国内访问 GitHub Pages 速度较慢,可以使用 jsDelivr CDN 对主题的静态资源进行加速。
以本博客的配置为例,在 _config.yml 中添加 CDN 配置:
|
jsDelivr 的 GitHub 加速格式:https://cdn.jsdelivr.net/gh/{用户名}/{仓库}@{分支}/{文件路径},完全免费,无需注册。
9.3 为文章添加封面图
在文章 YAML 头部添加 cover 字段可以设置封面图,在首页和文章列表中以卡片形式展示。推荐使用图床存储图片,避免图片文件占用源码仓库空间。
|
9.4 插件推荐
| 插件 | 作用 |
|---|---|
hexo-abbrlink |
生成短链接,避免中文 URL |
hexo-generator-feed |
RSS 订阅 |
hexo-generator-searchdb |
本地搜索索引 |
hexo-wordcount |
文章字数统计 |
hexo-filter-titlebased-link |
Obsidian 风格的双链支持 |
9.5 常见问题排查
Q1:GitHub Actions 构建失败
[!faq]- 查看常见原因
HEXO_DEPLOYSecret 未配置或 Token 已过期 → 检查 Secrets 设置PUBLISH_REPOSITORY格式错误 → 必须为用户名/仓库名- Token 缺少
repo权限 → 重新生成 Token 时确认勾选repo
Q2:博客更新但页面未变化
[!faq]- 排查步骤
- GitHub Pages 部署通常有 1-2 分钟延迟
- 尝试强制刷新浏览器(
Cmd+Shift+R/Ctrl+F5)- 确认 GitHub Actions 工作流运行成功(绿色勾号)
Q3:自定义域名 SSL 证书未生效
[!faq]- 原因与解决
- GitHub Pages 的 SSL 证书通过 Let's Encrypt 自动签发,首次配置可能需要等待 5-15 分钟
- 确认 DNS 的 CNAME 记录已正确指向
你的用户名.github.io- 可以在 Pages 设置页面取消绑定再重新绑定,触发证书重新签发
Q4:图片加载失败
[!faq]- 排查方案
- 确认图片 URL 可公开访问
- 使用图床(如 SM.MS、Cloudflare R2、阿里云 OSS)存储图片
- 或使用 jsDelivr 加速 GitHub 仓库中的图片:
https://cdn.jsdelivr.net/gh/用户名/仓库@分支/图片路径