独立产品WishTools - 一个工具盒子的开发心路历程

头像
Jazer
53阅读0评论

WishTools工具演示

WishTools - 一个工具盒子的开发心路历程
WishTools - 一个工具盒子的开发心路历程
WishTools - 一个工具盒子的开发心路历程
WishTools - 一个工具盒子的开发心路历程

从什么时候有自己开发工具盒子的这种想法?

差不多在17年的时候,好像是第一次小公司突然跳槽到一家比较大的外资企业,接触他们的项目和代码管理,突然感觉像打开了新世界,作为管线开发者本身应该是最具有规范和流程的
当时使用一个内部的工具命令,通过参数的方式加载各种不同的环境进入环境调整或者直接执行的方式,也一直很喜欢这种方式,当时公司代码是在一个nfs服务器上每个员工都需要IT挂载服务器,nfs服务实际上在北京那边,所以调用解析的过程有时候过于缓慢,一直觉得需要优化和改进,后面发现是架构的问题了,改动牵扯太大方面,即使大家都知道需要改进,但是也无法去改变它,疫情爆发之后,维护的人也越来越少,后面我们哪个技术的老大离职,我也感觉没什么意思就跳槽到另外一家离家近的一点的公司。

在那家公司有个老外部署了rez的开源工具,但是不太成功,我过去的时候它,从那个时候我就尝试接手维护它的一些东西, 实际上我在12年的开始接触linux, 一开始也喜欢各种发行版尝试(最后在archlinux稳定了),也接触了各种各样的包管理器, 也接触和使用过一些docker部署的架设,以及python本身的包管理器pip, 就是觉得这些方式都不能很好的满足的我的需求, 比如docker 倾向与部署服务,无法部署软件制作环境什么,rez本身也是基于文件系统的,也存在我上家公司同样的问题, pip和一些包管理器实际上都没有做到部署和执行一体化,更别说开发环境的管理了。

于是那时候萌生了一个想法,我想集合他们的一些功能优化开发一个类似的工具, 最开始也只是满足我个人的需求,因为长期使用linux开发,本身也习惯使用命令行,所以就用python写了一个简单的命令行工具wish, 通过wish xxx yyy - cmd 这种形式调用环境和执行命令,最开始的想法很简单, 就是有路径指向通过@查找固定位置的配置,有版本匹配通过=1.0 查找本地的文件匹配筛选,(没错,我最初原型也只是做了基于文件系统的),这个简单工具其实开发很快,差不多也就三天后第一次跑通了,实际上这次的开发只是确定我想要的语法格式什么,因为到后面就会不断的重写,因为它本身就不是我的目标也无法完全满足我的需求,接下来就开始漫长的改进过程了。

首先我需要开始真正解决之前遇到的问题,不从文件系统调用,因为那样遍历最后会很慢,而且依赖挂载的文件系统, 这时候开始想到数据库 ,一开始其实想用mongodb来做元数据存储,后来我问了一下以前那个技术老大,他建议我考虑下图数据库,因为当时遇到的问题之一就是,上游的改动无法精准的通知下游开发者,比如A调用请求了B开发的基础包, 同时接受B的更新,在当时架构下B更新了代码也确实整个工具链都会更新,但是A不知道,虽有约定大小版本的特性存在,但是B更新了某部分内容可能会导致A的工具无法时候或者出Bug,只能A回溯查询到问题然后B在修复代码, 这应该是大部分开发公司都能遇到问题了吧, 为了解决这个问题就通过图数据库把包的元数据链接起来了,有个这个链接关系存在,不仅能够查询A的包依赖了上游哪些包,也可以反向查询到B的基础包的特定版本被哪些包依赖了,如果B在预发布之前,可以通过自动创建子管线通知下游接受或者修改调整。下游test完成后B合并,嗯,但是想这确实是一个不错的想法, 数据最终就确定使用图数据库,关于存储更好解决了,文件系统的存储肯定不会做主要使用,因为需要客户端约束和限制,最后采用通用对象存储模式存储压缩的代码和工具。

至此,后端的架构算是基本确定下来了, 通过客户端查询调用数据库取信息,对象存在下载解压数据,然后再次执行本地缓存进行使用, 对的,它依然会使用本地文件系统,而是作为一个缓存的模式,确保了离线使用,在线更新的使用的方法,对于本地缓存最开始时候深度递归优先做全量求解,但是发现缓存数量上去容易出现解爆炸的情况,然后采用了SAT求解器优先使用新版本求解,不做全量求解了,只考虑优先最新版本的解,这时候突然发现,它越来越越像一个包管理器了,后面就索性把数据接口封装了一程restful服务,因为我主要使用python,手动打包感觉过于繁琐,又做了git的自动化和pypi的自动化打包,同时尽量改进手动打包的参数简化,即使用户手动打包也不应该过于麻烦。当然自动发布也是通过gitlab的cicd自动进行,甚至添加了缓存自动清理的功能以及服务端自动清理长时间未使用的包的标准,至此它算是基本上满足了我的需求了,也就是一条命令 请求什么 执行什么, 同时请求的缓存可以共享使用, 缓存会周期性检查清理。

前面其实都是满足我个人的需求而已,后面跳槽到另外一家公司,那边根本就没有这些管理什么, 我也给其他的同事来使用和测试, 但是光有命令行包管理器实际上使用起来并不方便,因为后面公司很多同事都不会代码,不开玩笑,就是那种你告诉他们命令行输入xx命令都能搞错的那种,另外我也觉得,一个包管理器也无法满足了各种项目各种不同的配置启动,
所以就自己开发一个启动器界面的工具,界面就容许管理员和经理权限的的角色创建和管理项目和启动器, 对的,我又写了一个简单用户管理系统 项目管理系统 合并到restful服务上了... 这样,管理和经理创建项目和的对应的任务,技术人员创建启动器配置图标版本什么的,用户选择项目任务启动器其他对应项目的任务下的工具,就会获取对应项目任务的软件插件流程的使用环境进行制作了,后台依然是只调用wish初始化环境和执行命令即可,对于集群计算部署这里的反而更方便只需要调用命令执行即可,至此也差不多实现了自己多年前的想法了。

前面提到一直以来使用linux,也一直热爱开源方式,因为我觉得,知识来源与分享,我本身也使用很多人家的开源服务,比如对象存储服务就是minio, 图数据就是neo4j以及gitlab社区版本,所以一开始就有了开源的想法,也希望能够找到有兴趣的小伙伴共同开发和维护。

GitHub源码链接

顶 1
收藏
举报
加载中…
精选评论
empty
暂无数据
版块详情

独立产品

1k 帖子
3k 评论
530 关注
请真诚分享你的个人作品的创作灵感、开发经验、运营过程等;不得只罗列产品功能来借机营销
版主
远程老司机/游牧旅居中/电鸭社区站长
远程全职推荐

扫码下载应用

下载APP以便及时收到回复或进展