记录网站最近的一些优化内容。
主要调整内容
- 构建系统迁移,由 GitLab Runner 变更至 Drone CI
- 网站构建工具更新,将几年前的 Node 脚本由 Golang 1.16.0 重写
- Hugo 0.79 升级至 Hugo 0.82.0
- 网站前端优化
构建系统迁移
和我相熟的朋友应该了解我从差不多十年前刚刚开始工作就在使用 GitLab,在随后的职业生涯里也经历了多家公司迁移使用 GitLab ,甚至自己也影响了其中两家公司在 GitLab 以及 GitLab Runner 在生产环境中的落地使用。
之所以要进行迁移,有一些原因:
我们期望系统交互,尤其是仓库下载使用 SSH 协议而非 HTTP 协议,官方 Runner 默认不支持这种方式交互,为此我编译了一个简单的定制版本,支持这种方式进行交互。如果你对 Runner 编译感兴趣,两年前《源码编译 GitLab Runner》一文中,有提到如何编译。而 Drone 的代码拉取等步骤都在容器中执行,简单配置下 alpine/git
镜像即可解决这个事情。
如我在“第一个双月总结”中提到的,我们期望更高频度的 CI 交互,以及相对轻量的仓库及 CI 服务,能够让 CI 在更早的时候发生,进一步减少在线上部署集成时遇到问题的可能性,提升交付效率和交付能力。相比较 GitLab 动辄几个GB的内存占用,和待机大百分比的 CPU 消耗来看,Gitea + Drone 长期运行使用的内存资源几乎可以忽略,CPU 待机状态只消耗 1% 甚至更少,至于团队协作和 PR / MR Review ,我计划引入一个新的工具来解决问题,暂且不提。
以及我们对 GitLab 中国公司落地的一些隐忧,担心出现 EverNote、印象笔记“分家”,以及国内运营后类似的问题。
所以,我开始尝试使用 Gitea + Drone 替换之前个人使用已久的 GitLab,目前运行三周有余,状况良好,如果接下来稳定性 OK,我们将尝试进行线上服务替换。
网站构建工具更新
在关于网站中有记录,2017年6月,我将网站架构进行重写,当时使用 Node 写了绝大多数 CI 工具,在 2019年1月的时候,随着网站内容的增多,构建速度有所降低,所以我重构了构建工具,并添加了各种缓存以提升构建速度。
上面的方式虽然能够解决问题,但是也产生了两个潜在的问题:
- 工具的稳定性存在一定的风险。工具内的 NPM 依赖存在随着时间而被废弃维护,甚至和 Node 运行时不兼容的问题。解决方式要么得进行私有化仓库搭建,以及对应老版本软件包的持续缓存托管,要么得固定某一个 Node 运行时的版本,而无法享受版本升级带来的性能提升。最佳妥协方案是将一个可运行版本打包至容器镜像内,然后容忍上述问题,“安心使用”下去。
- 资源使用率不够高。面对每次 CI 过程中几千文件的密集读写,Node 执行性能虽然满足场景需求,但是对于资源使用效率并不是特别好,相对直观的感受是全量构建时,机器风扇会瞬间起飞一下。
恰好赶上切换构建系统,于是趁着机会用 Go 重写了之前的 Node 工具,目前镜像尺寸缩小了 100倍以上(由近1G的镜像缩小到了几MB),执行性能提升了90%以上,因为性能足够高,每个阶段完整构建都在1~2秒左右,所以我可以将之前的缓存设计直接干掉,进一步减少维护成本。
另外,因为执行效率足够高,风扇根本来不及起飞,依赖平时的转速散热就足够了。
Hugo 0.82.0
去年年底将 Hugo 升级到了 0.79.0 ,这次升级顺便将 Hugo 进一步进行了升级。带来比较直观的提升是生成 6000 个页面文件,只需要不到 3秒。
Start building sites …
| EN
-------------------+-------
Pages | 3597
Paginator pages | 732
Non-page files | 0
Static files | 158
Processed images | 0
Aliases | 1861
Sitemaps | 1
Cleaned | 0
Total in 2950 ms
网站前端优化
之前在页面构建过程中,会调用一个代码高亮接口,针对页面代码内容进行高亮着色。在思考再三,我决定使用 Hugo 内置代码高亮来进行功能替换。
目前 Hugo 已采用 Chroma 来进行代码高亮,后续如果有需要,可以将这部分功能迁移到网站构建工具中,进行更深入的定制。
在使用了新版本的代码高亮和构建工具后,网站首页 GZip 后的传输量降低了 20%。内容页面的传输量降低了 50%。
虽然页面性能总体分数没有变化,但是页面基础绘制性能相比较上次均提升了 0.1s,接下来试试挑战 0.3s 之内。
Golang 1.16.0
上次优化日志,还在等待 Node v16 正式版本的发布。没想到这篇记录中,等到的会是 Golang 的v1.16版本。
关于执行性能前文已经提过了,非常完美,应该是除了 C++、Rust 之外,兼顾开发效率和性能的最佳选择了。当然,异常处理这块真的是无力吐槽。
期望在接下来的使用中,可以积累一些长期有用的设计实践吧。
最后
这次先写到这里吧。
期待下一次的站点升级。
–EOF