选题契机
在企业中,软件系统开发主要包括项目管理,需求分析、设计、编码、测试、部署、运维、监控、优化、迭代、升级、维护几大阶段。 在项目管理阶段,开发人员需要完成需求分析与设计,以确定开发需求与功能。同时对模块进行划分与设计,并分配开发任务 在需求分析阶段结束后,开发人员需要按照软件设计详情进行开发,对于软件工程师来说,工作内容应该主要集中在核心业务开发过程中。 而在我日常开发与实习过程中,我发现有很多时间都浪费在了非核心业务中,以后端工程师为例,我们的主要精力应该在编码阶段。 但是我们实际开发过程中却将大量的时间浪费在了测试、部署、运维等阶段。在一些中小型公司中,专职运维工程师和测试工程师相对较少, 无法及时对接开发人员的工作,导致开发人员不得不身兼数职,在增加工作量的同时,降低了工作效率,还导致项目的开发周期变长,致使项目整体整体质量下降。
为了解决这个问题,我浏览了大量相关项目与框架,并尝试搭建一个符合自己需求与场景的DevOps平台。 但是在实际实施过程中,我认为现在的一体化DevOps开发平台问题主要分为两类, 一类是侧重点相对集中,另一类则是过于庞大。 第一类以Focalboard,Gitness为代表,这一类开发平台侧重于某一个开发节点,他们在所在节点效果良好,很好的完成了业务功能, 但是如果要完成一个完整的开发工作流程,就不得不部署多个服务,造成了服务难以统一管理与配置。 如Focalboard重点在于任务记录,而Gitness侧重于CI/CD。 第二类则是侧重点分散,各个开发流程均有覆盖,但是由于架构过于庞大,导致部署成本较高。 这一类以JetBrains TeamCity为例,我的服务器采用2Core 4G配置,在如此环境下仍然无法完整的容器化部署。 因此,本系统将尝试将这些开发平台进行整合,以实现一个符合自己需求的DevOps平台。
本系统主要是辅助开发工程师,遵循DevOps开发流程,尽可能将非编码任务交给自动化任务完成。 同时集成项目管理模块,尽可能在一个平台上完成软件开发周期。 而庞大的架构必然会带来额外的性能开销,在这个基础上,我选择采用云原生架构容器化部署项目,尽可能体现出不同语言之间的优势, 将性能敏感型交给Go服务执行,而将基本的项目管理交由Kotlin完成。 在提高工作效率的同时,减少了测试和运维工作成本,增加整体产出。
启发
本项目的开发与理念受益于多个开源项目以及DevOps与CloudNative开发哲学,其中影响最深的项目包括Gitness、Jetbrains TeamCity与JetBrains YouTrack。 DevOps与CloudNative开发哲学相比传统开发模式,除了容器化开发与部署之外,还将开发与运维结合起来,使项目上线阻力更小, 结合我在日常开发中对于这几款项目的使用以及DevOps的实践,加上开发需求的推动,才有了本项目。 在此,对Gitness项目组与Jetbrains公司以及其他一线开源工作者致以最崇高的敬意。 no Gitness and Jetbrains,no StellarCloud
核心功能
1. 轻量化开发与团队管理
本系统主要面向对象是小中型企业或者开发团队,这个群体有一个相对显著的特点: 相较于大型组织,他们更多的重点是在于业务的迅速上线以及短周期开发,主要是针对于某个业务场景而单独开发的一套系统。 因此本系统在一定程度上减少开发流程的冗余,尽可能减少开发人员负担。采用敏捷开发模式,结合自动化任务的优势,将一些相对耗时、重复性任务交给自动化任务完成。 在程序的健壮性和开发周期上做一定取舍,以提升整体开发效益。
2. 自动化测试
本系统通过集成TestContainers
与容器化部署,实现自动化跨语言测试并给出测试报告。
3. 容器化CI/CD
本系统为常用服务部署提供了基础模板,用户可以直接使用模板进行CI/CD管理,同时允许用户自定义CI/CD流程,以实现更复杂的CI/CD需求。
4. 基于容器化架构的应用监控与管理
本系统通过集成Prometheus
与Grafana
,实现服务的可视化监控。
5. 远程执行
本系统同通过集成libp2p
,除了支持本地工作流执行,还支持远程工作流执行。更加符合分布式架构的设计。
技术选型
以前过于追求性能,导致丢失了一些开发框架最基本的东西。有句话说的好,不要重复造轮子。除非底层架构有本质上的迭代,不然一点点的小修小补并不能带来本质上的收益。 生态好,用着顺手才是优秀的技术。出了问题,你能找到解决办法,用着舒服,开发效率高,这才是最重要的。 大部分框架所谓的性能提升都是针对于http请求进行优化,而在业务流程中,http请求时间固然重要,但不是全部。 真正的“高并发”应该是对于系统资源的合理调度,而不是简单的的“http请求数量”。
- 编程语言:
- Kotlin:语言层级的协程支持,针对异步任务场景可以比传统的多线程模型更加高效,加上函数式开发范式与现代化语法特性,使项目开发效率更高,代码可重用性更强。 且跟Java无缝集成,可以共享Java庞大的生态。在本项目中,主要负责Web层业务开发,如基础REST开发,包括项目管理、成员管理、任务分配等。
- Golang:天然面向高并发,加之可以编译为本机可执行程序与低内存占用,使得Golang项目天生适用于云原生场景。 由于Golang协程不依靠虚拟机,更低的协程创建开销,对高并发任务有更好的性能表现。低内存占用与极高的启动速度也成为容器化程序的理想选择。
- JavaScript:前端开发语言,拥有丰富的生态。
- 框架:
- 后端框架:
- Springboot:作为主要的常驻服务,主要负责业务基础设施开发,如基本的数据管理、缓存、事务等。
- Fiber:作为上层应用服务开发,如容器化的代码测试与流水线、应用伴生监控、资源调度等。
- 前端框架:
- React:作为主要前端开发框架。
- Material-UI:作为主要前端UI组件库。
- 后端框架:
- 中间件:
- Nats是一个基于Golang的消息系统,不同于传统的MQ与RPC,Nats同时支持发布/订阅模式与请求/相应模式,可以同时实现同步和异步消息传递。
- Socket.IO:基于WebSocket的实时通讯框架,可以支持多端多平台的实时通讯。
- Resty:基于Golang的HTTP客户端,可以支持各种HTTP请求,如GET、POST、PUT、DELETE,做自动化脚本处理。
- 组网:
- Nebula: 实现P2P网络,用于分布式架构下容器间的通信。
- frp:实现内网穿透,用于实现内网与公网之间的连接,将服务暴露至公网,同时可以基于XTcp进行P2P通信。
- 核心库
- go-git:Git操作库,用于实现Git仓库的克隆与操作。
- go-task:Task自动化任务库,用于实现自动化任务,如CI/CD流水线、代码测试等。
- docker-client:Docker客户端,用于实现Docker容器的创建与管理。
- libp2p:实现P2P网络,用于实现容器间的通信。
- 数据库:
- PostgreSQL:作为主要数据库,支持关系型数据库与非关系型数据库。
- Redis:作为缓存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。
- Prometheus:用于实现服务的监控与可视化。
- SQlite:作为执行单元数据库,存储单元临时数据
- 构建工具:
- Gradle:Gradle作为构建工具,支持更丰富的自动化构建脚本与插件,提供更好的拓展性。
项目结构
- StellarCloud(后端协作面板业务部分)
- stellar-admin:后台管理与启动入口
- stellar-common:基础公共模块
- stellar-system:系统基础模块
- stellar-bridge:与
Golang
服务的通信集成
- StellarCloud-Core(后端容器化业务)
- StellarCloud-Agent(后端可执行单元业务)
- StellarCloud-UI(前端可视化部分)
项目原型
英文字母对应权限分配
- StellarCloud
- 前台用户端(项目负责人A,开发工程师B,测试工程师C,运维工程师D)
- 开发工作区
- 仪表盘
- 项目任务列表
- 团队日志列表
- 项目时间表
- 开发面板
- 步骤列表
- 已提交步骤
- 进行中步骤
- 已完结步骤
- 报告
- 团队报告管理
- 报告可视化
- 报告处理
- 步骤列表
- 仪表盘
- 项目集
- 项目列表
- 项目管理
- DevOps
- 版本控制集成
- 自动化测试
- 流水线集成
- 制品运维
- 文档
- 团队
- 开发工作区
- 后台管理端(超级管理员X,管理员Y,项目负责人Z)
- 系统管理
- 菜单管理
- 定时任务
- 组织管理
- 用户管理
- 角色管理
- 团队管理
- 日志管理
- 登录日志
- 操作日志
- 系统日志
- 监控管理
- 在线用户
- 服务监控
- 自动化
- 触发器
- 定时器
- 容器化
- 资源分配
- 容器管理
- 系统管理
- 前台用户端(项目负责人A,开发工程师B,测试工程师C,运维工程师D)
表设计
分级为层-> 模块 -> 类 -> 部分,在分级合理的情况下省略部分分级
用户层
- 单位管模块
- 用户表
- 角色/职位表
- 用户角色关联表
- 集合管理模块
- 结构类
- 项目表
- 团队表
- 项目团队关联表
- 团队成员关联表
- 分配类
- 项目任务表
- 团队任务表
- 个人任务表
- 结构类
- 反馈模块
- 单位管模块
业务层
- 权限控制模块
- 密钥管理表
- 执行单元模块
- 映射管理类
- frp管理表
- 代理管理类
- 本地代理表
- 远程代理表
- 映射管理类
- 开发模块
- 集成开发环境类
- 集成开发环境表
- 版本控制类
- git仓库表
- 触发器表
- 制品类
- 制品表
- 持续集成类
- 构建配置表
- 构建队列表
- 测试配置表
- 测试对列表
- 集成开发环境类
- 测试模块
- 运维模块
- 持续交付类
- 权限控制模块
系统层
- 操作模块
- 菜单表
- 自动任务表
- 非操作模块
- 登录日志表
- 操作日志表
- 系统日志表
- 操作模块