选题契机

在企业中,软件系统开发主要包括项目管理,需求分析、设计、编码、测试、部署、运维、监控、优化、迭代、升级、维护几大阶段。 在项目管理阶段,开发人员需要完成需求分析与设计,以确定开发需求与功能。同时对模块进行划分与设计,并分配开发任务 在需求分析阶段结束后,开发人员需要按照软件设计详情进行开发,对于软件工程师来说,工作内容应该主要集中在核心业务开发过程中。 而在我日常开发与实习过程中,我发现有很多时间都浪费在了非核心业务中,以后端工程师为例,我们的主要精力应该在编码阶段。 但是我们实际开发过程中却将大量的时间浪费在了测试、部署、运维等阶段。在一些中小型公司中,专职运维工程师和测试工程师相对较少, 无法及时对接开发人员的工作,导致开发人员不得不身兼数职,在增加工作量的同时,降低了工作效率,还导致项目的开发周期变长,致使项目整体整体质量下降。

为了解决这个问题,我浏览了大量相关项目与框架,并尝试搭建一个符合自己需求与场景的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. 基于容器化架构的应用监控与管理

本系统通过集成PrometheusGrafana,实现服务的可视化监控。

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)
      • 系统管理
        • 菜单管理
        • 定时任务
      • 组织管理
        • 用户管理
        • 角色管理
        • 团队管理
      • 日志管理
        • 登录日志
        • 操作日志
        • 系统日志
      • 监控管理
        • 在线用户
        • 服务监控
      • 自动化
        • 触发器
        • 定时器
      • 容器化
        • 资源分配
        • 容器管理

表设计

分级为层-> 模块 -> 类 -> 部分,在分级合理的情况下省略部分分级

  • 用户层

    • 单位管模块
      • 用户表
      • 角色/职位表
      • 用户角色关联表
    • 集合管理模块
      • 结构类
        • 项目表
        • 团队表
        • 项目团队关联表
        • 团队成员关联表
      • 分配类
        • 项目任务表
        • 团队任务表
        • 个人任务表
    • 反馈模块
  • 业务层

    • 权限控制模块
      • 密钥管理表
    • 执行单元模块
      • 映射管理类
        • frp管理表
      • 代理管理类
        • 本地代理表
        • 远程代理表
    • 开发模块
      • 集成开发环境类
        • 集成开发环境表
      • 版本控制类
        • git仓库表
        • 触发器表
      • 制品类
        • 制品表
      • 持续集成类
        • 构建配置表
        • 构建队列表
        • 测试配置表
        • 测试对列表
    • 测试模块
    • 运维模块
      • 持续交付类
  • 系统层

    • 操作模块
      • 菜单表
      • 自动任务表
    • 非操作模块
      • 登录日志表
      • 操作日志表
      • 系统日志表