指南 / Cloudflare

Cloudflare Pages + GitHub:一套不折腾的发布流程

从仓库、生产分支、构建产物到回滚,把“代码错、部署错、域名错”拆成三条线。

发布 · 更新 · 10 MIN

Cloudflare Pages + GitHub 最省心的时候,体验大概是:改代码、推送、等几十秒、网站更新。

最折腾的时候则是:构建失败后去改 DNS,域名打不开后又重装依赖,最后三个问题叠在一起,谁也说不清网站为什么突然好了。

先把四个东西认清

它们彼此有关,但不是同一个东西。仓库推送成功不等于构建成功;构建成功不等于自定义域名一定配置正确;DNS 正常也救不了一份根本没生成的 index.html。

小站最重要的是隔离

一个独立站点尽量使用独立仓库或至少独立、明确的目录,并对应唯一的 Pages 项目。不要为了省一个名字,把文章站的构建产物上传到游戏站项目,更不要顺手复用别人的 Worker、KV 或数据库绑定。

部署命令里最值得多看一眼的,不是动画效果,而是项目名、分支和输出目录。目标写错一次,回滚成本可能比改十处 CSS 都高。

Git 集成和工作流部署怎么选

Cloudflare Pages 可以直接连接 GitHub:推送生产分支后自动构建,其他分支通常产生预览部署。这适合结构简单、密钥少的小站。

也可以由 GitHub Actions 构建,再使用 Wrangler 把确定的输出目录部署到指定 Pages 项目。这样更容易加入目标保护、内容指纹和部署后验证,但工作流本身也需要维护。

两种方式没有谁天生更高级。重点是选定一条生产路径并写清楚,不要一会儿让 Pages 自己构建,一会儿又从本地直接上传,最后线上版本和仓库对不上。

部署前先制造一个能回去的点

低风险改动也应该知道当前正常版本的提交 SHA。可以创建回滚分支或标签,至少保证“出问题时回到哪里”不是靠记忆。

提交信息别全写 update。像“扩充 EXIF 指南并增加 404”这种描述,半年后还能看懂;连续十二个“fix”只会让提交历史像事故现场。

构建命令和输出目录必须成对

假设构建命令是 npm run build,项目生成文件到 dist,那么 Pages 或部署命令就必须上传 dist。构建日志说成功,但部署的是另一个空目录,正式站照样什么都没有。

静态站至少应在部署前检查:

  1. 根目录是否有可访问的首页。
  2. 站内链接指向的文件是否存在。
  3. sitemap、robots.txt 和 404 是否生成。
  4. 资源路径在自定义域名下是否正确。
  5. 构建产物中有没有误带密钥、源映射或本地配置。

失败时按阶段看,不要跨层乱修

依赖安装失败

看 Node 版本、锁文件和包源。不要先碰 DNS。

构建失败

看第一条编译错误、缺失文件和环境变量。旧版本通常仍在线,先别为了“抢救”把生产域名删掉。

上传失败

检查 API Token 权限、账户 ID、项目名和输出目录。权限不足与网页代码无关。

部署成功但自定义域名异常

先访问本次部署生成的 pages.dev 地址。如果它正常,再检查自定义域名、证书和 DNS;如果它也不正常,问题还在构建产物或项目配置。

DNS 记录的含义不熟时,先看DNS 查询到底在查什么,别把 CNAME 当 301 跳转。

回滚不是重新上传一份“差不多的旧代码”

Cloudflare Pages 的成功生产部署可以作为回滚目标。真正的回滚应该指向一个已知正常的部署或 Git 提交,而不是从电脑某个“最终版2真的最终.zip”里凭感觉找。

回滚完成后还要验证正式域名,而不只是后台出现绿色状态。检查首页、至少一个深层链接、静态资源、404 和关键功能,再决定是否继续修新版本。

缓存会制造“我明明改了”的错觉

HTML 通常不适合长期 immutable 缓存;带内容哈希或明确版本号的 CSS、JS 才适合长缓存。修改资源却沿用旧 URL 时,浏览器和边缘缓存都可能继续给你旧文件。

解决办法是合理设置缓存头、让构建产生带哈希文件名,或在确实需要时更新资源版本参数。不要每次都全站清缓存,那会掩盖真正的缓存策略问题。

一套安静但可靠的发布顺序

确认目标 → 建回滚点 → 本地构建和检查 → 推送生产分支 → 确认部署成功 → 检查正式域名。

这套流程看起来没有“直接上线”刺激,但网站运维最理想的状态,本来就应该有点无聊。

官方说明:Pages Git 集成 · Pages 生产回滚