c站重构:deno和全站自动化

1,338 阅读3分钟

halo大家好,我是132,很久没写c站的文章啦,因为c站……的旧版本app太好用,导致我们的接口为了旧版本,一直没做过大改动

但是拖着拖着,就重构了

移除 node,换用 deno

过去 node 在 c站 做的事情不多,主要是解析接口和第三方 sdk 的对接,很久以前还有 ssr 的部分,然后这些 deno 全部都可以做!

所以木杉小哥哥发起了这次的 deno 重构,使用了自研的框架 abc

从业务上来说,其实 deno 和 node 没什么差别,基本都一样的写法,所以重构很快就完成啦

github.com/cliclitv/de…

中间遇到的一些坑,主要是 deno 不够成熟(缺库)和一些包管理的问题

比如我们发现某个包的某个依赖坏掉了,由于 deno 没有 node_modules,download 下来的也都是 hash 文件名,导致我们很难找到这些错误

比如我们需要一个加密库,deno 的标准库中还没有对应实现,导致我们不得不调用 rust 的库

最后部署是个大坑……因为 deno 目前几乎所有的部署工作都是使用 docker,并没有类似 pm2 的工具,为此,我们决定踩自动化部署的坑

github action

由于 github action 实在太亲 github,c站又是一家全部开源的网站,所以比起 travis 和 circleCI ,github action 实在不要太方便

而且 github actions 还有一堆 action 脚本,太好用

在使用 CI 的过程中,我们可以配合 Secrets 来加密我们的数据库密码,ssh密码等

Docker

使用 docker 对镜像进行管理,好处是方便又干净,大致似乎就是,我们使用 github action 去发布镜像,然后再登陆 ssh 服务器,pull 镜像,部署

全程都可以在 ci 中完成,最终效果就是我们只需要 push 代码,线上就可以自动上线啦 在使用 docker 过程中,也可以通过 docker-compose 进行注入环境变量,这样我们开源的代码就不需要暴露密码信息了

cdn

除了使用 docker 部署服务端,我们的前端代码和 flutter 都需要在 ci 自己打包,然后将打包结果发布到 cdn

为此,我们需要写一个 action 插件去请求 cdn 的上传接口,但比较可惜,目前 action 只能用 node 来写,deno 暂时还不支持,好在这部分和网站关系不大

全站自动化

一开始,我们自动化部署了 deno 的部分,然后尝到了甜头,之后我们将 flutter 和 go 都进行了自动化

原来都差不多,都是 ci 完成所有工作,而我们只需要 push 代码

其中,deno 和 go 需要 docker 发布镜像,flutter 的话 ci 主要是做自动更新发版

从此,c站终于再也不用手动运维服务器啦::>_<::

p.s.

说实话,之前我一直对后端不是很擅长,一直想搞自动化这些,但是有心无力

感谢木杉的加入,我现在似乎已经懂一点这些了

然后关于 deno,大家肯定都会问 deno 对比 node 有什么优势

说实话,c站是一个实验田,比起业务上的优势,我们首先考虑的是技术试验,deno 的总体架构比 node 更现代,值得我们一起去研究

我最近也在研究 rust 绑定 v8 和 skia 相关的内容,所以此时 c站 上 deno 是最合适的

同时,引入了木杉的 abc 框架,帮忙收获一波 bug 哈哈哈

总结

c站是一家纯开源的弹幕视频网站,同时也是一个技术实验田,涵盖了 fre,abc(deno),flutter,go 等前沿技术栈

开源地址: github.com/cliclitv

欢迎小伙伴加入我们,现在真的很方便,所有仓库都是 pr 合并后自动上线,非常!爽!

啊对啦,c站地址: www.clicli.me

除了技术,c站的生态也是极好的,不用担心体量不够,技术成果无人受用哈