文章目录
  1. 1. 问题
  2. 2. 排查过程
    1. 2.1. 1. 淘宝镜像证书过期,npm 装不上
    2. 2.2. 2. hexo clean 报错卡住
    3. 2.3. 3. lftp 装不上
    4. 2.4. 4. FTP 上传超时
    5. 2.5. 5. 顺手清掉一个 Node 20 弃用警告
  3. 3. 总结

这个博客的部署一直靠 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)

♦ 本文总阅读量次

软 游