第一次运营开源项目的感想——写在 Cardinal 60stars 之际

第一次运营开源项目的感想——写在 Cardinal 60stars 之际

编程那点事 随便写写 CTF Go 3171 字 / 7 分钟

头图中的 Vidar 娘,作者 @b0lv42

我记得是在大一下学期时,@Li4n0 提到了协会下半学期办比赛的事,也就是后来的 D^3CTF,并且希望能写一个线下 AWD 平台,留着今后一直传承使用下去。之前 @Li4n0 学长负责了 2018 年的 HCTF 线下 AWD 平台的全栈开发,当时他使用的是 Python Django + RabbitMQ,据说当时是勉强撑了下来。因此我们决定使用 Golang 来编写 D^3CTF 的平台,希望 Golang 天生的并发优势能撑住 AWD 赛场上的选手流量。 后来,@Li4n0 还提出能不能像那些大型比赛一样,整一个 3D 的实时大屏,选手是一个个飞船,互相之间发射炮弹代表一次成功的攻击。这样可以大大提高比赛的观赏性。

因此去年我负责的是 D^3CTF 平台的前端开发 + Unity 3D 大屏的编写。由于当时我们没有花足够的时间进行后端的测试,导致平台后端出了一些状况;等到了赛场上投入使用时才暴露出了问题,这时才开始着手修复解决。这段经历是真的让人记忆犹新,犹如在给高速公路上飞驰的汽车换轮胎。当时我陪着审代码 debug 连着熬了两个通宵,最后实在撑不住了,到场地边上的沙发上倒头就睡到了下午。不过庆幸的是,我们在之后修好了这些 bug。 真的是很对不起当时参加比赛的各位师傅们,十分抱歉给你们带来了不好的使用体验。 在这之后,我们也总结这次教训,归纳了一些线下比赛经常可能出现的状况。比赛结束后,我信誓旦旦地说要写个稳定可靠的 AWD 线下赛平台并开源出去。当时也只是纯属口嗨,比赛结束后人挺累的也没啥动力。但这次长达四个月的“寒假”,却给我创造了机会。我有足够的时间去慢慢构思编写整个平台,于是 Cardinal 就诞生了。

开源后,变化在哪?

其实从一开始,我就有将 Cardinal 开源的想法,因此很多地方都在力求做到标准、正式。比如 commit message 格式,issue 模板,projects 看板等。因为是个 Golang 项目,便加入了 go report 的评分。后来为了可靠性编写了单元测试并接入了 Travis CI 以及 Codecov。为了方便发版,接入了 GitHub Actions。为了给开发者引流,加入了 all-contributor。为了方便用户快速上手,上线了 Vuepress 生成的文档站。

以上每一点的背后都有很多有意思的尝试,我挑几个在这里分享一下。

issue template

最初是看到 CTFd 的 issue 模板,因此我也模仿着 CTFd 模板的格式整了一个。要求用户在提 issue 时附带提供自己的操作系统、软件报错、期望结果等信息,从而方便我们更快速的定位 bug。 虽然设想很美好,但就目前收到的 issue 来看,没有一个人是按照 issue 模板填写的…… 一上来就是大白话描述问题,不过好在多次交谈中也算是定位并解决了问题。

Projects

GitHub Repo 自带的 Projects 看板是个好东西。以前杭电助手看板是用的 Trello,现在也迁到了 Projects。 之前洗澡的时候~~(为什么是洗澡?~~,我脑中经常会蹦出关于 Cardinal 的新点子,便都记在了看板上。 现在的看板分为五个部分:

  • To do 我突然想到的奇怪的点子或新功能。
  • In progress 目前正在开发的,可以在dev分支上看到开发的进度。
  • Done 已经完成但还未在 Release 中发布的。
  • Release 已经完成且在最新的 Release 已经发布了的。
  • 🕊🕊🕊 咕咕咕,被鸽掉的需求。(很庆幸现在还一个都没有)

Done列表这里,我可以很快知道当前正在开发的版本主要改了些什么,比去翻 commit 回忆快很多。

all-contributor

我承认,加入这个只是为了满足自己的虚荣心。 在这之前,我参考过不少项目 README 中的 Contributors 栏目。比较出名的大项目是直接接入 Open Collective,这样就可以获得一个包含 Contributors 全员头像的图片。但对于个人项目来说,Open Collective 提现过程较为复杂,不推荐开通。如果真有恰饭的需求,还是推荐上爱发电

之后我又看到 Egg.js 项目 README 中的 Contributors 图片。他们是编写了一个通过 GitHub API 获取 Repo Contributors 信息并生成图片的服务 https://github.com/ergatejs/badges ,以云函数的形式部署在 Zeit 上。我也模仿着用 Go 写了一个 https://github.com/wuhan005/badges ,用了一段时间后感觉还是 all-contributor 这种直接生成表格的好看。

去年六月份的时候我去上海参加了 Vueconf 2019,开发者真山现场演示并发布了新版本的 Vuepress。当天晚上回到学校后我便尝试使用了一下,体验十分不错。因此这次 Cardinal 的静态文档站我选择了使用 Vuepress 而非 GitBook。网站托管在 Zeit 上,Zeit 他们的免费套餐即包含 Google 的 CDN,比 GitHub Page 不知道高的哪里去了。 唯一美中不足的是,Zeit 对于 Vuepress 的支持不到位,Build Command 不会自动识别并填充,而需要手动修改为vuepress build docs,不过瑕不掩瑜就是了。Zeit 依然是一款十分用心的产品。

Cardinal 文档上详细介绍了安装方法、各个模块的功能,并且对二次开发给予了指导。同时也描述了一些设计上的细节,总结了常见的问题。如果你有意使用 Cardinal,推荐先阅读文档。

心态上的转变

项目既然有了开源的想法,那必然是想求得大家的关注。然而尴尬的是 Stars 数却总是不涨,人的心态也开始变得功利起来。但这也不全是一件坏事。四月份的时候,我两个星期连着收到了三个 issues,这真的是给了我巨大的动力,让我感觉自己做得东西是真正有人在用的,是真真切切地帮助到了别人的。为了予以回报,我十分客气地回复了 issue,并认真听取对方提出的 bug 和建议。那段时间真的是爆肝!但我却一直是乐在其中。 又回到那个问题:有小伙伴跟我说自己没有动力写东西,我感觉这其中就是缺少了来自外界的反馈。你在创作自己喜欢的东西时,你的走一步都能收到反馈,这将是一个很好的良心循环,你会感觉自己的所作所为是“有意义”的,是被人需要的。

在项目初期 issue 数很少的情况下,即使是那种啥都不懂的伸手党,我可能都会有耐心去帮助他。但当项目的知名度起来后,我想人的心态也应该就会随之改变了,会去追求更高一层的东西,那具体是什么,我目前就不得而知了。

一个不算太艰难的决定

去年 D^3CTF 线下的第二天,当平台的后端没有什么问题后,我便把 3D 大屏给开了起来。原以为当时选手们都忙着打比赛,没多少人会记得这花里胡哨的东西,但前阵子收到了一个 issue,询问我 3D 大屏的事,令我十分开心。 我最初的设想是 3D 大屏不开源,当做 Cardinal 的一个增值服务拿出来售卖。(估计不会有人买的QAQ) 毕竟物以稀为贵嘛,目前没有在网上看到有人讨论或者开源相关项目的,便觉得可以恰点烂钱啥的。但看到上文提到的那个 issue,我觉得既然有人还记得她,并且也有这个需求,那我不如就免费开源放出来好了,毕竟也不是什么技术含量很高的东西。

因此,我在 5 月 23 日开源了实时 3D 攻击大屏——Asteroid。希望大家能喜欢。

其实这也不算是什么艰难的决定哈哈。不过如果可以的话,还是希望各位老板们能在我的爱发电请我喝瓶柠檬茶。【谨防新型网络诈骗】

关于 Asteroid

正好趁着这篇文章,简单的聊聊 Asteroid 的架构。更详细的内容我之后应该会写在 Cardinal 的文档上。

最初这个 3D 大屏在协会内部的代号为 biubiubiu,就是炮弹发射的音效。刚开始地时候我尝试了很多的方法,最初打算全部在前端解决,2D 的方案使用 svg.js ,3D 的使用了 three.js,但因为开发难度太大,都被抛弃了。因此最后还是选择了 Unity 3D。我记得上次写 Unity 还是在初三,上次写 C# 还是在高二哈哈哈。

Asteroid 使用 WebSocket 与后端程序进行通信,后端程序的 URL 目前是硬编码进 Unity 里的,后期打算做成从配置文件中读取。因为对于 Unity 3D 不是太熟,所以关于数据的检查,全部都在后端完成,后端确认无误后发给 Unity,Unity 只需要负责播放动画即可。后面打算将后端与 Cardinal 对接,写一个接收 Cardinal 的 WebHook。 Unity 中的模型是在淘宝上面零零碎碎花几块钱买的,因为我并不会建模嘻嘻。同时还加入了陨石撞击的彩蛋,访问/easterEgg即可触发,这也是赛场上为了整活而做出来的。

以上

不知不觉 Cardinal 已经 60 stars,真的很开心,我也深知这项目受众十分少,并且国内 AWD Web 现在基本也就是开局一个弱智后门抢先拿 Shell,用骚套路做好权限维持就基本结束了。大家基本也都玩腻了,所以也有不少人有希望 AWD 彻底终结的观点。因此 Vidar-Team 也在探索新的比赛模式,怎样去弥补传统 AWD 的弱势,又能让大家玩得开心。到时候 Cardinal 应该也会有一波重大的升级更新吧哈哈。

再次感谢这段时间以来给我鼓励和信心以及反馈的人们。