你的这个 deploy.yml 采用的是目前(2025–2026 年)GitHub Pages 推荐的、最现代的部署方式,属于 GitHub Pages Artifact 模式(也叫 Actions 直接部署模式),而不是老式的推送到 gh-pages 分支的方式。
下面给你完整拆解这个部署流程用到的运维技术栈和设计思路:
整体技术架构分层
| 层级 | 技术/组件 | 作用 | 是否主流/推荐(2026视角) |
|---|---|---|---|
| 静态站点生成器 | Zola | 把 markdown + toml + templates 转成纯静态 HTML/CSS/JS | 非常主流(Rust 系 SSG 中最快之一) |
| CI/CD 触发 | GitHub Actions on: push main + workflow_dispatch | 代码 push 到 main 或手动触发时执行 | 标准做法 |
| 构建环境 | ubuntu-latest | GitHub 提供的最新 Ubuntu runner | 标准 |
| 源码检出 | actions/checkout@v4 | 把仓库代码拉下来 | 最新稳定版 |
| Zola 构建 | shalzz/zola-deploy-action@v0.22.1 | 执行 zola build,输出到 ./public 目录 | 社区最常用 Zola 专用 action |
| 产物暂存 | actions/upload-pages-artifact@v3 | 把 ./public 整个文件夹打包上传为 “Pages artifact” | GitHub 官方推荐方式 |
| 部署 | actions/deploy-pages@v4 | 把 artifact 真正部署到 GitHub Pages CDN | 官方最新部署 action |
| 权限控制 | permissions: pages: write, id-token: write | OIDC 方式获取临时 token,无需 secrets.GITHUB_TOKEN 长久密钥 | 现代安全最佳实践 |
| 并发控制 | concurrency group + cancel-in-progress:false | 防止多个构建同时跑,保留最后一次(但不禁用旧的) | 比较稳健的写法 |
这种写法最核心的三个现代化特点
-
使用 GitHub Pages Artifact 机制(非 gh-pages 分支)
- 以前主流做法:把 public/ 强制 push 到 gh-pages 分支
- 现在推荐做法:构建 → 上传 artifact → deploy-pages action 直接推送到 Pages 基础设施
→ 优点:- 仓库更干净(不需要 gh-pages 分支)
- 部署更快(官方内部通道)
- 支持 preview deployments(未来可能用)
- 官方更推荐、安全性更高
-
使用 OIDC 认证(无须 secrets)
permissions: pages: write id-token: writeGitHub Actions 通过 OpenID Connect 临时获取权限,不需要在仓库设置任何 TOKEN,这是 2023–2024 年后强烈推荐的安全方式。
-
分离 build 和 deploy 两个 job
这是官方模板的标准写法,便于以后:- 加测试 job
- 加 link checker
- 加图片压缩
- 只在特定分支部署 preview 环境
当前这个 yml 的优缺点总结(2026 年视角)
优点
- 符合 GitHub 官方最新推荐(2024 年底–2026 年持续强化此模式)
- 安全(OIDC、无需 token)
- 干净(不产生 gh-pages 分支垃圾)
- 可手动触发(workflow_dispatch 很实用,尤其是调试时)
- 使用了比较新的 action 版本(v4、v3)
小缺点 / 可优化点
-
BUILD_ONLY: true是正确的,但可以考虑去掉(默认就是只构建) -
如果你的 config.toml 里 base_url 写的是
https://username.github.io,通常不需要额外--base-url,但如果有自定义域名,建议加上:env: BUILD_FLAGS: --base-url "${{ steps.deployment.outputs.page_url }}"(不过大多数人都不加也正常运行)
-
可以把版本锁得更明确,例如
shalzz/zola-deploy-action@v0.22.1→ 建议观察是否需要跟进 Zola 新版本(目前 v0.22.x 对应 Zola 0.19.x 左右) -
考虑加个缓存(可选,但对重复构建有帮助):
- name: Cache Zola uses: actions/cache@v4 with: path: ~/.cargo/bin/zola key: zola-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
总结一句话评价
你的部署方案已经属于 2025–2026 年 GitHub Pages + Zola 项目里最推荐、最干净、最安全的写法,基本没有明显的技术债务,运维成本极低,属于“一次配置,长期稳定跑”的水平。
如果后续遇到问题,最常出现的两个点通常是:
- config.toml 的 base_url 没写对(尤其是自定义域名时)
- 仓库 Settings → Pages 里 Source 要选 「GitHub Actions」(不是 Any branch)
有其他具体报错或想加功能(预览部署、自定义域名、CDN 加速等),可以继续贴出来,我再帮你细调。