技术分享 | 2022-12-20
团队开发利器——持续集成


一、持续集成简介


大型复杂软件工程通常意味着超多行数的软件代码,越来越复杂的代码库架构,和不断扩容的开发工作团队。在大型软件开发过程中,摆在每个项目管理人员眼前迫在眉睫的事情,无非是如何把生产资料和人力资源管理组织起来并进行高效协作,以降低团队之间的沟通成本和内部损耗以加快整体的开发进度。

何况,一个成熟的技术团队,不但需要开发人员,还需要测试人员来负责编写接口测试用例、运行自动化测试代码、手动执行集成测试、监控测试的执行情况等;也需要质量管理人员介入以随时监控项目状态、查看代码静态扫描结果,可能还包括完成监控单元测试的通过率与代码覆盖率、检验代码打包情况等相关工作。在这些工作进行的同时,开发团队也在不停的提交新代码。如果开发、测试、QA之间不能很好的协作,不仅会大大影响整体的开发效率,还可能严重影响软件稳定性,降低整体的交付质量。


图1:典型的开发团队协作场景


一个中、大型软件项目,通常被按逻辑划分为多个模块,每个模块甚至还会细划分多个子模块,交由不同的团队开发人员负责。这样多人员同时贡献代码到多个模块的格局,必定需要一种机制对大家的工作进行同步,避免在集成(指大家把各自负责的模块合并到一起构建出完整的软件产品)的时候出现问题。

持续集成(即:Continuous Integration, CI)是一种软件开发实践方法论,即团队开发成员“持续地”集成他们的工作。所谓“集成”,是指各个子模块功能通过共同构建编译形成完整的软件产品的过程。为了保证持续集成中通常每天一次甚至多次的集成,光靠开发人员手动编译显然是不现实的。一般是通过工具实现自动化的构建,包括编译、自动化单元测试、打包发布等流程,以增强项目的可见性。通俗而言,就是所有人都能清晰知道自己的工作成果,以及对整个项目造成了什么样的影响,尽早发现集成中出现的错误并及时修正,使得在任何时间、任何地点均可生成可部署测试的完整产品,方便与测试团队协作,增强整个项目组的协作效率和信心。



二、合迅智灵的持续集成


国产C++软件开发平台——合迅智灵项目同样配备了完整的持续集成流水线。

截至目前,合迅智灵主要采用一个主代码库+多个子代码库的项目架构。每个子库存放一个独立的子项目的代码,可以分别单独构建生成子软件包。主代码库的持续集成流程通过拉取各个子软件包,再打包到一起形成最终的LarkStudio5 总软件包。


图2:合迅智灵代码库架构


每个子项目都拥有自己独立的持续集成流程,管理自己的构建项目,可以独立进行配置。例如国产化基础开发套件,除了生成开发库文件,包括:动态库、静态库、头文件、资源文件等,还配备了单元测试和自动化 API 文档生成。

持续集成流水线一般会划分为分为多个阶段逐个进行,同一个阶段中的任务可以并行进行,阶段之间具备一定的关系。包括:

  • 环境验证阶段:检查当前流水线环境是否正确;

  • 构建阶段:既源码生成构建目标对象的过程。构建目标不仅指二进制库或可执行文件,还可能指文档、资源文件、安装脚本文件等;

  • 打包阶段:将构建生成的对象,打包上传到某个管理系统,如简单的文件服务器、软件包托管服务器等。打好的包可以直接被下载或调用,通常测试人员会从管理系统中获取持续构建的包;

  • 单元测试阶段:构建和运行单元测试用例。单元测试的执行结果可以反映代码质量和功能可用性,输出的覆盖率数据还可反映单元测试本身的质量。在持续集成中引入单元测试,可以在较细的时间粒度上对项目的质量进行持续监控;

  • 静态分析阶段:与单元测试不同的是,静态分析通常不需要对代码进行编译运行,而是直接对源代码进行扫描分析,评估可能欠缺的编码漏洞、代码风格等。和单元测试一样,持续进行静态分析可以从另一个维度监控项目的整体质量。


图3:LarkSDK 的持续集成流水线


流水线中的任务可以根据需要进行灵活控制,例如合迅智灵有支持多种操作系统和CPU 架构的需求,在打包阶段就可以配置多个并行的任务,对每个任务拉取不同操作系统的 Docker 镜像运行在不同 CPU 架构的实体机之上,即使使用统一的构建脚本。在这种模式下,无论开发团队如何提交新的功能,都可以立刻在所有目标平台上高频率的实现自动化测试,大大节约了开发与测试的人力和工时投入。

打包的结果会根据版本号、操作系统、编译器版本等配置上传到包管理服务器上。这样在服务器上,同名的包就会包含,例如:支持x86 架构和 ARM 架构的两个子版本。用户或后续流程(例如总包构建流程)从包管理服务器上拉取该包的时候,就可以根据当前的构建环境拉取到正确的的子版本。

按照上述方法,各个子项目的构建流程就可以独立定义,分别管理。子项目构建的成果输出到统一的包管理服务器上,项目打总包的时候只需要访问包管理服务器,获取各个指定版本的子包即可。这样的设计可以大大降低项目模块之间的耦合度。


图4:LarkStudio5 主库的持续集成流水线


整个流程结束后,不同子版本的包也将被提交到服务器上。接下来,测试团队可以自由选择拉取日常包进行随测、也可以拉取稳定包开展集成测试。问题反馈给开发团队后,开发团队便可以立即开展修复工作,而新的工作则会立即体现在第二天的日常包中。QA团队同样也可以从服务器上读取到单元测试和静态扫描阶段所收集到的各项和质量管理相关的数据,从而进入完美的团队协作闭环。

而这所有的一切轻松与便捷,无疑都建立在合理配置的持续集成流程之上。



三、小结


大型软件项目是非常难以管理的,随着项目规模的不断扩大,在团队协作开发中,引入高效的软件项目管理的方法论,建立合适的自动化流程变得非常必要。

合迅智灵的诞生,致力于弥补国产软件开发平台的空白。基础软件的国产化,道阻且长。而基础开发工具的定位,也注定了它必须对各种复杂的国产化软硬件环境作适配,既要提供各种方便好用的基础库,还要保证自身的稳定性、易用性和安全性。团队协作开发的难度也将随着版本迭代呈几何级上涨。而持续集成正是解决团队开发中遇到的种种问题的一把利器,助我们在这条崎岖的国产化道路上继续坚实迈进。

推荐新闻
返回列表
试用申请
立即申请
试用申请