前言
在搭建个人博客时,自动化部署可以大大简化发布流程。本文将详细介绍如何使用 Gitea Actions 自动构建 Hexo 博客并部署到 Cloudflare Pages,实现推送代码即可自动更新网站。
为什么选择 Cloudflare Pages?
Cloudflare Pages 是一个优秀的静态网站托管平台,具有以下优势:
- 全球 CDN 加速:网站内容分发到全球 200+ 节点
- 自动 HTTPS:免费 SSL 证书,自动配置
- 快速部署:支持多种构建工具,部署速度快
- 自定义域名:支持绑定多个域名
- 免费额度充足:对于个人博客完全够用
- CNAME 拉平:根域名可以使用 CNAME,解决与 MX 记录冲突问题
整体流程
整个自动化部署流程如下:
1 | 本地编写文章 → git push 到 Gitea → Gitea Actions 触发 → |
准备工作
1. 创建 Hexo 博客项目
首先初始化一个 Hexo 博客:
1 | # 安装 Hexo CLI |
2. 配置博客基本信息
编辑 _config.yml:
1 | # Site |
3. 创建 Gitea 仓库
在自建的 Gitea 服务器上创建仓库,例如:
1 | # 初始化本地仓库 |
配置 Gitea Actions
创建 Workflow 文件
在项目根目录创建 .gitea/workflows/deploy.yml:
1 | name: Deploy Blog to Cloudflare Pages |
Workflow 步骤详解
触发条件:
1 | on: |
push:推送代码到main分支时自动触发workflow_dispatch:支持在 Gitea Actions 页面手动触发
Checkout 步骤:
1 | - name: Checkout |
使用官方 checkout action 拉取仓库代码。
安装 Node.js:
1 | - name: Setup Node.js |
安装 Node.js 20 版本,Hexo 需要 Node 环境。
安装依赖:
1 | - name: Install Dependencies |
全局安装 Hexo CLI,然后安装项目依赖(package.json 中定义的)。
生成静态文件:
1 | - name: Generate Blog |
hexo clean 清理旧的构建文件,hexo generate 生成静态文件到 public 目录。
安装 Wrangler:
1 | - name: Install wrangler |
Wrangler 是 Cloudflare 的官方 CLI 工具,用于部署到 Cloudflare Pages。
创建 Pages 项目:
1 | - name: Create Cloudflare Pages project |
创建名为 blog 的 Pages 项目。|| true 表示如果项目已存在则忽略错误继续执行。
部署到 Cloudflare:
1 | - name: Deploy to Cloudflare Pages |
将 public 目录部署到 blog 项目。--commit-dirty=true 参数很重要,因为:
- Actions checkout 后仓库是干净状态
hexo generate生成的public目录是新文件,不在 git 中- wrangler 默认要求部署内容在 git 中,需要这个参数来处理未追踪文件
配置 Secrets
在 Gitea 仓库中添加 Secrets:
- 进入仓库 Settings → Secrets 页面
- 添加两个 secrets:
CLOUDFLARE_API_TOKEN
获取方式:
- 登录 Cloudflare Dashboard
- 进入 My Profile → API Tokens
- 点击 “Create Token”
- 选择 “Edit Cloudflare Pages” 模板,或自定义权限:
- Account → Cloudflare Pages → Edit
- 复制生成的 token
CLOUDFLARE_ACCOUNT_ID
在 Cloudflare Dashboard 右侧边栏可以看到 Account ID,是一串 32 位字符。
绑定自定义域名
部署成功后,博客会发布到 Cloudflare Pages 提供的默认域名,类似:
1 | https://blog-xxx.pages.dev |
添加自定义域名
在 Cloudflare Dashboard 中操作:
- 登录 https://dash.cloudflare.com
- 进入 Pages → 选择 blog 项目
- 点击 “Custom domains” 标签页
- 点击 “Set up a custom domain”
- 输入域名,例如:
blog.example.com - 保存
DNS 配置
如果域名已在 Cloudflare,DNS 会自动配置:
- 记录类型:CNAME
- 名称:blog
- 目标:blog-xxx.pages.dev
- 代理状态:已代理(橙色云朵图标)
Cloudflare 会启用 CNAME 拉平(CNAME Flattening):
- DNS 查询返回的是真实 IP(A 记录),而不是 CNAME
- 解决根域名 CNAME 与 MX 记录冲突的问题
- 目标 IP 变化时,Cloudflare 自动更新
如果域名不在 Cloudflare,需要在域名服务商处添加 CNAME 记录指向 Pages 的域名。
优化构建速度
添加依赖缓存
1 | - name: Cache node modules |
缓存 node_modules 可以显著加快后续构建速度,从几分钟缩短到几秒。
并行处理
如果博客文章很多,可以考虑:
1 | - name: Generate Blog |
--bail 参数在遇到错误时立即停止,方便排查问题。
常见问题
Q: Actions 执行失败,提示找不到 secrets
原因:Secrets 没有正确配置。
解决:
- 检查 Gitea 仓库的 Settings → Secrets
- 确保
CLOUDFLARE_API_TOKEN和CLOUDFLARE_ACCOUNT_ID都已添加 - Secrets 的名称必须与 workflow 中的引用一致
Q: hexo generate 报错
原因:可能是主题配置问题或文章格式错误。
解决:
- 查看 Actions 日志中的错误信息
- 本地执行
hexo generate测试 - 检查主题配置文件
_config.theme.yml - 检查文章的 front-matter 格式是否正确
Q: 部署成功但网站空白
原因:public 目录没有正确生成。
解决:
- 检查 Actions 日志,确认
hexo generate成功 - 确认
public目录中有index.html - 检查主题是否正确安装
Q: wrangler 报错 “ENOENT: no such file or directory”
原因:部署目录不存在或路径错误。
解决:
- 确保
hexo generate已执行 - 检查
public目录是否存在 - 使用正确的路径参数:
wrangler pages deploy public
Q: 如何手动触发部署?
在 Gitea 仓库中:
- 进入 Actions 页面
- 选择 “Deploy Blog to Cloudflare Pages” workflow
- 点击 “Run workflow” 按钮
- 选择分支(默认 main)后确认
高级配置
多环境部署
可以配置开发环境和生产环境:
1 | jobs: |
这样推送到不同分支会部署到不同的 Pages 项目。
部署通知
添加部署成功/失败的通知:
1 | - name: Notify on Success |
自动创建文章
可以在 workflow 中添加自动创建文章的步骤(适合定时发布):
1 | - name: Create scheduled post |
最佳实践
1. 使用主题配置文件
不要直接修改 themes/theme-name/_config.yml,而是在根目录创建 _config.theme-name.yml:
1 | cp themes/starter/_config.yml _config.starter.yml |
这样:
- 主题可以作为 submodule 或直接克隆
- 配置不会因为主题更新而丢失
- 更符合 Hexo 的最佳实践
2. 管理主题为 submodule
1 | # 删除直接克隆的主题 |
好处:
- 主题更新时只需更新 submodule
- 主题版本可控
- 不会意外修改主题文件
3. 忽略不必要的文件
编辑 .gitignore:
1 | # 构建输出 |
4. 定期更新依赖
1 | - name: Check for updates |
总结
通过 Gitea Actions 自动部署 Hexo 博客到 Cloudflare Pages,实现了:
- 自动化:推送代码即可部署,无需手动操作
- 高效:全球 CDN 加速,访问速度快
- 可靠:每次部署都有日志,易于排查问题
- 灵活:支持自定义域名、多环境部署
整个配置过程主要包括:
- 初始化 Hexo 博客项目
- 创建 Gitea 仓库并推送代码
- 编写 Gitea Actions workflow
- 配置 Cloudflare API Token
- 在 Cloudflare Dashboard 绑定域名
这套方案适用于任何自建 Gitea 服务器,结合 Cloudflare Pages 的强大功能,可以轻松搭建高性能的个人博客。
参考资源
- Hexo 官方文档
- Cloudflare Pages 文档
- Wrangler CLI 文档
- Gitea Actions 文档
- GitHub Actions 文档(Gitea Actions 基本兼容 GitHub Actions)