术语定义:

  • 持续集成/构建:当触发自动构建的条件(如提交代码至主分支,定时构建),CI服务器 从版本控制系统中取出最新代码开始编译,对代码进行 静态检查构建部署测试 的自动化过程。

软件持续集成指南

构建自动化

持续集成过程,最基本内容是构建。构建自动化包含了编译自动化和代码静态检查自动化。

开源CI 服务器推荐

  • Jenkins

  • Travis CI

  • TeamCity

  • CruiseControl

  • Drone

CICD 执行流程

  • 代码拉取、编译

  • 单元测试

  • 安全扫描

  • 镜像制作,打标签,镜像入库

  • 可选流程

    • 自动部署

    • 自动化测试

    • 镜像入库

编译自动化

编译自动化是构建自动化的主要工作。编译自动化就是将编译过程通过一个自动化脚本或自动化工具实现编译的自动化。

编译自动化不是单纯靠一些编译命令就可以完成,还需要做相应的环境调整,这就需要脚本来实现各命令的功能连贯。自动化编译脚本必须符合下列要求:

  • 脚本必须是无交互式的。

  • 脚本必须存放在版本控制系统中,且同一个系列的软件的自动化编译脚本需要统一,包括脚本名称和参数定义(降低维护成本)。

  • 脚本中除环境变量声明外,不得引用绝对路径。

  • 编译脚本需要在相应的源码仓库中维护。在持续集成服务器执行构建时,会获取源码仓库的代码和脚本,运行脚本进行过程构建。

自动化静态代码检测

静态检测是为了及时发现代码中的问题,以提高代码质量,若追求构建速度,该过程可以独立/异步运行,主要关注:

  • 稳定性

  • 代码安全,依赖库安全

  • 兼容性

  • 效率

  • 易扩展

  • 可读(复杂度)

  • 规范、格式

自动化测试

在持续集成中,持续验证很重要,这就需要我们在构建中增加自动化测试。

软件测试共四阶段

  • 单元测试

    • 运行速度快,覆盖绝大部分的软件特性

  • 集成测试

    • 主要用于保证各个服务间的调用是正常运行

  • 系统测试

    • 需要将整个软件系统/平台运行起来,验证系统的正常运行

  • 验收测试

    • 系统开发生命周期方法论的一个阶段,这时相关的用户和/或独立测试人员根据测试计划和结果对系统进行测试和接收。它让系统用户决定是否接收系统。它是一项确定软件成果是否能够满足合同或用户所规定需求的测试。

构建策略

参照阿里云-云效 devOps,并简单调整

  • 周期性构建(普通构建,基本)

    • 代码定期构建,开发阶段推荐至少每天有一次构建,构建条件可以是由代码库变更执行,也可以每天定时执行,形式不限。 构建内容涵盖:代码获取、构建、静态检测。 CI服务器将自动化构建结果发给相关人员,开发者可以通过这些提醒及时处理静态代码缺陷,对失败的结果进行分析。

  • 预发布构建

    • 预发布构建 主要是协助开发者调试与系统集成情况,或是脚手架是否能够完成预期的功能。这一阶段还有一个关键点: 需要实现自动化测试 。可通过预发布构建可以得到最终成果物-内测版/公测版。

  • 发布构建

    • 每个软件系统必须建立独立的发布构建任务,发布成果物必须在 发布环境 中集成得到(发布环境与编译环境是相互独立的环境)。 发布构建除集成构建要求的外还要进行发布前的更新,如 README.MDCHANGELOG.MD 、 关闭相关里程碑的 issue 、宣布 新版本发布通知 等。

发布成果物必须存放在特定的 系统 (如nexus仓库)或 存放位置 (存储盘)进行管理,发布包要注明如下属性:

  • MD5校验值(java 中 maven 会自动附加)

  • 原文件名

  • 源代码

  • 语言属性

  • 版本

  • 该软件中的术语介绍

  • 适用环境与版本

  • 代码版本控制仓库地址

  • Dockfile

发布目录规范见: 发布软件目录结构

CI 服务器维护

  • 对接监控(网络、性能)

  • 实现灾备、快速重建

  • 定期维护、升级CI服务器时注意对当前的影响

  • 注意CI服务器和使用者权限

  • 数据统计 周期自动生成 持续集成分析报告 。主要包含:

    • 构建时间

    • 构建成功率

    • 构建活跃度

    • 测试覆盖率、测试通过率