Hexo 博客 CI 部署修复记录
字数 1.1k 字 阅读时长 ≈ 4 分钟

这个博客的部署一直靠 GitHub Actions 自动跑,hexo generate 自动生成,然后用 lftp 把 public/ 传到 FTP。
其实 GitHub Actions 飘红了好一阵了,但是因为事情多,人又懒,甚至直接放弃更新 😂。
昨天在AI的协助下我好好分析了一晚上,终于跑通了。
把整个排查过程记下来,以防万一。
问题
目前是 Hexo 6.3.0 跑在 Node 20 上,GitHub Actions 的 job 依次做 npm ci、hexo clean、hexo generate,再用 lftp 把构建产物全量同步到 FTP 。
其实从 GitLab 搬过来以后,一直是这个流程没改过。但是突然有一次就开始持续失败了,修了几次,每次都出新问题,一气之下就撂挑子不干了。
当时猜测的是各种组件和依赖的更新造成的兼容性问题,要么就是 GitHub Actions 的 runner 环境更新了,导致某些命令不可用。
排查过程
1. 淘宝镜像证书过期,npm 装不上
最先遇到的是依赖装不上。日志里 CERT_HAS_EXPIRED,npm 还补了一句 Exit handler never called!。
但是让人比较懵的是,它退出码是 0。看起来像是成功了,却实际什么都没装上。
原因是 package-lock.json 里面有 428 个包的下载地址(resolved)指向了淘宝镜像 registry.npm.taobao.org / registry.nlark.com,这些镜像的证书过期了,npm 一访问就报证书错误。
全部指向官方 registry.npmjs.org 就ok了。
2. hexo clean 报错卡住

这个问题真是折腾了我好久。hexo clean 日志全跑完了,但进程挂在那里,就是不退出。
一开始我以为卡在哪一行,看日志最后一行也看不出问题,让AI分析半天也是猜来猜去没有找到根本原因。后来去查进程的事件循环,发现是hexo-migrator-rss 这个插件依赖 camaro,而 camaro 的 LeanPool 在构造时就直接 new Worker()(worker_threads),那个 MessagePort 一直让事件循环保持活跃。事件循环没清干净,进程退不了,就这么卡在那里 😑。
直接把这个插件干掉,清掉lock 里 90 个含 camaro 的包,hexo clean 就能正常退出了。
3. lftp 装不上

前面都通了以后,感觉上应该是万事大吉了。结果还能继续出问题。日志是 E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied),然后 lftp: command not found,最后整个步骤退出 127。
一开始感觉可能又是网络或源的问题。结果不然,居然是因为 GitHub Hosted Runner 上的 runner 用户不是 root,对 /var/lib/apt/lists/ 没有写权限,apt-get 根本装不了东西(这一块是AI帮我改的时候改到的 😮💨)。改成 sudo apt-get(Hosted Runner 配好 passwordless sudo)就好了。
4. FTP 上传超时

这是今天才发现的问题了。因为盯着构建全过了,而且开始正常部署,就放心的睡觉去了。
起来一看,居然还是报错。日志末尾是 ##[error]The operation was canceled.。
这个 job 的 timeout-minutes 是 30,以前是完全够用的。但是看这次的日志,光 npm ci + hexo clean + hexo generate(1599 个文件)就占了 17 分钟,剩下给 FTP 全量传输(19MB、1599 个文件、--transfer-all)的时间根本不够,传到一半被超时取消了。
试着把 timeout-minutes 从 30 提到 60,总算全部通过了
5. 顺手清掉一个 Node 20 弃用警告

大问题都搞定了,要不就把剩下的警告也修复了吧……不然每次跑还挂着一个警告:Node.js 20 is deprecated... actions/upload-artifact@v5。
这个就简单了,原因是 upload-artifact 这个 action 的 v5 版本声明的是 runs.using: node20。GitHub 从 2025 年 9 月弃用 Node 20,把这类 action 强制迁到 Node 24 上跑,于是开始刷警告。
直接升级到 v6 就解决了。至于没升到最新的 v7,是因为 v6 就是第一个声明 node24 的版本,是消除这个警告的最小改动。这个 workflow 本来就只用了 name 和 path 两个参数,做多错多,就不要冒险了。
总结
Hexo 作为静态博客还是陈总最早推给我的。只是没想到到现在已经只剩我一个人在写了。
现在已经开始养成习惯,把所有遇到的问题都喂给项目AI,记录下来,以便后面遇到类似问题可以快速排查。
♦ 本文固定连接:https://www.gsgundam.com/2026/2026-11-02-z01-hexo-ci-deploy-fix/
♦ 转载请注明:GSGundam 2026年11月02日发布于 GSGUNDAM砍柴工
♦ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
♦ 原创不易,如果页面上有适合你的广告,不妨点击一下看看,支持作者。(广告来源:Google Adsense)
♦ 本文总阅读量次
