快速成长期应用架构实践 (17):持续集成

勿忘初心2018-11-15 13:26

欢迎访问网易云社区,了解更多网易技术产品运营经验。


4.6 DevOps


DevOps 理念是提倡开发、测试、IT 运维之间的高度协同,从而在完成高频率部署的 同时,提高生产环境的可靠性、稳定性、弹性和安全性。为什么是开发和 IT 运维?因为产 品价值流在业务(定义需求)和客户(交付价值)之间。
DevOps 本身并不能完全被工具或软件来简单地定义或量化。但工具或软件是实现 DevOps 的一个重要组成部分,现在流行的 Docker 就是实现 DevOps 最合适的工具之 一。Docker 的起源和产品功能,与 DevOps 的理念非常匹配。Docker 完全有能力来加 速、保障软件的生命周期。从这几年的行业发展来看,Docker 作为一款工具,的确在 帮助企业践行 DevOps 理念,同时也借助这款工具的流行,使 DevOps 在更大的群体中 获得推广。 


4.6.1 持续集成 


持续集成是一种软件项目管理方法,依据资产库(源码、类库等)的变更自动完成编 译、测试、部署和反馈。持续集成已广泛应用于现代软件开发流程中,它能够为软件开发 带来两大好处:快速发现错误和促进代码分支集成。


持续集成的背景 

在传统开发模式下,开发人员、测试人员、运维人员形成一种线性的软件开发、测试、 部署流程。其中任何一个过程出问题,可能最终导致无法交付产品。 


导致这种问题的原因还得从软件开发本身说起。软件开发最大的难度在于:如何确定 软件的需求?如何确定软件的剩余量?一方面由于软件的需求在传递、架构、开发过程中 可能造成信息不对称,导致软件开发结果与最初需求有偏差;另一方面用户不知道自己想 要什么,在协定的方案下实现产品,可能都不是用户最终想要的。开发软件无法像造汽车 一样,看到整个开发过程。一个长生命周期的产品一直会更新、迭代,项目管理根本无法 确定软件剩余量。


持续集成通过把一个产品细化为多个功能,逐步实现和完善产品功能,从而改善传统 软件流程。Martin Fowler 大师定义持续集成是一种软件开发实践,即团队开发成员经常集 成他们的工作,通常每个成员每天集成一次,也就意味着每天可能会发生多次集成。每次 集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成 错误。经过众多的团队实践,得出持续集成的开发方式能减少软件集成问题,让团队专注 软件本身逻辑。


持续集成的价值 

提高软件质量 

每天或每周进行多次的集成,并进行测试,有利于发现软件缺陷,最终提高软件 质量。


减少重复劳动 

持续集成通过自动化工具编译代码、打包程序、上传、部署、测试,无需太多人工干 预,让开发拥有更多精力和时间专注于软件逻辑实现。

增强项目的预见性 

持续集成过程中每次操作会记录详细输入输出结果,为后续分析产品缺陷是否收敛 提供数据支撑。通过这些数据的分析增加了项目的预见性,可根据实际情况调整项目决 策。


增强团队对产品的信心 

持续集成可以增强团队对开发产品的信心,因为他们清楚知道软件做了哪些改动、可 能会造成的影响,以及每一次构建的结果。
如何做到持续集成

1. 统一的代码库。

2. 自动构建工具。

3. 自动测试脚本。

4. 开发向代码库主干提交代码。

5. 自动触发构建工具。

6. 高速构建服务器,快速完成构建作业。

7. 上传软件到测试环境触发自动测试脚本。

8. 执行结果分析与展示。

9. 自动部署到演练环境。


持续集成管理工具 

常见的持续集成管理工具有 Apache Continuum(http://continuum.apache.org/)、 CruiseControl(http://cruisecontrol.sourceforge.net/)、Hudson(http://hudson-ci.org/)、Jenkins (http://jenkinsci.org/)、Luntbuild(http://luntbuild.sf.net)等。这些工具对比可以参考 https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software。
Jenkins 是被广泛应用的持续集成、自动化测试、持续部署的框架,甚至可以当作 流程管理的工具。当前 Jenkins 提供了 1000 多个插件用来支持编译、测试几乎所有的程序。但 Jenkins 对于所运行的任务无法做到环境隔离,有了容器后可以很好地解决这一 问题。


Jenkins 与 Kubernetes 结合实践 

基于 Kubernetes部署 Jenkins Master比较简单,只需要在 Jenkins Master安装 Kubernetes Plugin,并下载 Jenkins Slave 镜像。Jenkins 的任务通过 Kubernetes Plugin 转化为 Kubernetes Pod 模板,Kubernetes 根据 Pod 模板自动拉起 Slave 容器,Slave 容器会自动加入 Jenkins 集 群。Jenkins 执行任务时自动调度 Job 到某个 Slave 容器,任务执行结束后,Jenkins 自动删 除相关节点,并销毁对应容器,实现资源的释放。


Jenkins 与 Kubernetes 结合优点 

整个底层资源分配和资源释放过程对用户来说是透明的,用户只需要创建好 Jenkins 任务,不需要关心节点在哪里;对于 Jenkins Master 来说,Slave 节点(容器)是临时的, 任务一结束就会销毁。由于 Slave 运行在容器中,那么 Jenkins 调度的 Job 也会运行在容器 中,每个容器是隔离的,即每个 Job 也实现了隔离。如果需要数据持久化可以在容器中挂 载 NFS、GlusterFS、CephFS 等文件系统。
Jenkins 与 Kubernetes 方案解决了大型产品测试的效率和环境隔离问题,此方案在网易 云基础服务多个项目中得到应用。


网易云基础服务持续集成工作流 

网易云基础服务持续集成是按各个业务功能模块分别持续交付,最终达到整个平台的 持续集成。持续集成基本流程如图 4-43 所示。
1. 开发人员提交代码或脚本到源码仓库(SOURCE REPOSITORY)。
2. 编译服务器(CI SERVER)接收到源码编译任务,编译指定项目可执行文件(如 Go 语言项目同时编译和执行单元测试用例)。
3. 执行 Docker 命令打包可执行程序及相关环境变量、配置等为镜像。
4. 上传镜像到 DOCKER REGISTRY。
5. 拉取指定镜像版本执行全量单元测试用例。 
6. 测试结果自动反馈给开发和测试。
7. 测试人员拉取镜像执行黑盒测试、可靠性测试等用例。执行结果直接反馈给开发 和持续集成管理平台。持续交付是持续集成的下一步,做到持续集成后,很容易实现持 续交付。 

图 4-43 持续集成基本流程 


文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著 


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用