背景:在上篇文章里,完成了一个简陋的spring cloud + k8s的应用系统,那么如果手工部署的话,那得分别打包5个服务,打5个镜像,然后安装5个服务。凡是麻烦的工作,都要去让工具来干。
然后我就做了一个简陋的可视化部署工具,输入仓库git地址,由golang来负责clone repository -> build docker images -> helm install
代码仓:chintensakai/learn-spring-cloud (gitee.com)
1. 思路
- 为什么用golang?因为我后期会加入k8s相关资源的展示看板,以及各节点的docker资源看板,而golang拥有k8s和docker官方提供的client sdk,肥肠方便。
- 流程分三步:
- 输入git仓库日志,步骤条按钮展示clone,点击调用/git/clone接口,后台gin收到请求,使用go-git库去clone本项目,clone结束之后,遍历项目目录,寻找包含package目录的项目,这些项目就是一会helm需要安装的项目;同时寻找dependencies聚合项目,mvn clean package来打包。
- 1步结束之后,按钮变为build,点击调用/docker/build接口,前台把1步骤返回的需要安装的项目列表携带到后端,后端使用docker sdk到对应目录里面,根据Dockerfile构建镜像,并推送到本地registry。这一步最为耗时,经过了一些已知办法的优化,
后面打算用goroutine重写build和push的过程,理论上可以再节省4/5的时间已经用goroutine重写,但是效果没有想象中那么好,build镜像阶段确实并发了,但是push阶段似乎还是老样子,可能跟registry的机制有关系吧。但是有个意外收获,这里设计成主线程没有等待goroutine结束就返回了,因为下一个步骤是helm install,并不会受goroutine的影响,他会不断等待镜像,所以主线程直接返回就好了,留下goroutine自己在后台build & push images就行了。 - 2步结束之后,按钮变为helm install,点击之后调用/helm/install接口,helm的go sdk有点复杂,而且这一步的工作很简单,所以直接调用系统command更方便。
2. 最终结果:
2.1 /git/clone 接口:
2.2 /docker/build 接口:
2.3 /helm/install 接口:
2.4 安装完成:
3. 一些优化的点:
之前的基础镜像太大,push和pull的过程无法忍受,单个镜像的build和push就需要11分钟
使用alpine + springboot 分层构建 + 本地镜像仓库,5个镜像build&push只需要一两分钟,越往后越快,因为有的镜像层可以复用。而且真正使用的话肯定是自己的私有仓库,所以这一步都是一些已知办法,不是我自己发明的。