要理解持续集成,首先我们需要了解持续集成的整个生态系统。包括敏捷开发、持续集成、DevOps等相关概念。
一、敏捷开发
(一)敏捷的定义:敏捷是一个术语,用于描述强调增量交付,团队协作,持续计划和持续学习的软件开发方法。 “敏捷”一词是2001年在《敏捷宣言》中提出的。 该宣言着手建立原则,以指导更好的软件开发方法。《敏捷宣言》的四个核心价值观:
(1)个人与互动超越流程和工具
(2)工作良好的软件超越文档
(3)客户合作超越合同谈判
(4)响应变更超越计划
(二)敏捷方法与实践:在长期的敏捷实践中,形成了两种常用的敏捷方法:
(1)Scrum: Scrum是团队用来管理工作的框架。Scrum方法就是通过每天会议和阶段冲刺来实践敏捷的方法。在Scrum方法实践中,包含如下的管理内容:
①scrum生命周期 (scrum lifecycle)
②scrum角色(scrum role)
③积压的产品功能、任务(Product Backlog)
④冲刺计划和积压的功能、任务(Sprint Planning and Sprint Backlog)
⑤冲刺执行和每日Scrum
⑥冲刺审查和冲刺回顾
⑦增量
⑧重复、学习、 提高
(2)Kanban: 中文“看板”。看板日语的意思是招牌或广告牌。 一位名叫大野泰一的工业工程师在丰田汽车公司开发了看板,以提高制造效率。看板方法就是通过在公司内容的广告栏上贴出团队需要完成的任务或达到的目标来实践敏捷的方法。
在Kanban方法实践中,需要注意以下几点:
①Pull-model(拉模型):主动领取任务。
②Visualize work(可视化工作):任务和目标、当前完成状态等团队均可见。
③Limit work in progress(限制正在处理的工作量):避免任务过多,上下文切换浪费过多时间。
④Continuous improvement(持续提升):看板提供了工作流中工作状态的动态视图。可以周期性第总结和改进方法及流程。
(三)软件的敏捷开发:敏捷开发是用于描述迭代软件开发的术语。 迭代软件开发缩短了软件开发生命周期。 敏捷开发团队以较小的增量(通常称为sprint)执行整个软件开发生命周期。 短跑通常为1-4周。 敏捷开发通常与传统开发或瀑布式开发形成对比,在传统开发中,大型项目是预先计划并根据该计划执行的。敏捷开发团队的一些关键成功因素:
(1)努力积压(backlog)细化工作
(2)尽早整合
(3)减少技术债务
二、持续集成
(一)持续集成(Continuous Integration):持续集成(CI)是团队成员每次对版本控制进行更改时自动进行代码构建和测试的过程。在代码交付时使用手动方式确认(人工确认是否可以交付)。
(二)持续交付(Continuous delivery):持续交付是指频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。持续交付要求持续集成平台有完善的自动化测试(包括功能测试、性能测试、安全测试)。只要有手工测试就不能算持续交付。
(三)持续部署(continuous deployment):持续部署是指代码通过评审以后,自动部署到生产环境。是持续交付的下一步。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。要实现持续部署,必须在持续交付的基础上在实现自动评审机制。
三、DevOps
(一)定义:DevOps即Development和Operations的组合词,是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。简而言之,DevOps是一种协作过程、协作文化和协作思想的统称。同时DevOps也是是人员、流程和工具的策略。
(二)如何实现:DevOps的目标是缩短周期时间。 围绕这一目标,通过一系列方法和工具来实现DevOps:
①持续集成、部署
②版本控制
③敏捷规划和精益项目管理
④监控和记录
⑤公共云和混合云
⑥基础架构即代码
⑦微服务化
⑧容器化
(三)思想原则:在实践中DevOps形态各异,一般都会遵循以下原则:
①以客户为中心的行动:DevOps团队必须采取以客户为中心的行动,因为他们不断投资于产品和服务。
②端到端的责任:DevOps团队必须提供持续不断的技术支持,直到产品生命周期终止。
③持续改进:DevOps文化专注于持续改进,以尽量减少浪费。
④自动化一切:自动化是DevOps流程的重要原则。这不仅适用于软件开发,也适用于整个基础架构环境。
⑤作为一个团队工作:在DevOps文化角色中,产品设计人员,开发人员和测试人员已经定义。他们所需要做的就是作为一个团队完成合作。
⑥监控和测试所有内容: DevOps团队拥有强大的监控和测试程序非常重要。
四、持续集成流程
持续集成在实践中形式多样,一般包含以下步骤:
(1)开发人员提交代码到代码仓库
(2)代码仓库中设置的hook(钩子)自动触发Jenkins服务器执行任务。
(3)首先执行的任务是代码质量静态检查,然后是代码编译,单元测试,集成测试。根据项目的不同会有所调整。如果任何一个任务失败,终止执行后续任务。开发人员对失败原因进行分析。
(4)部署软件到测试环境,并执行系统测试。如果任何一个任务失败,终止执行后续任务。测试人员对失败原因进行分析。
(5)发布软件到软件库,并标注软件版本。
(6)部署软件到预生产环境,并再次执行系统测试。
(7)部署软件到生产环境。
如下图所示:
五、持续集成相关工具
在持续集成系统中,我们需要借助第三方工具来简化我们的自动化工作和提升我们的执行效益。
(一)持续集成平台软件
持续集成软件是整个持续集成的核心软件,通过各种插件或执行脚本来与其它系统进行交互。
(1)Jenkins:是目前最流行的持续集成平台软件。提到 Jenkins 就不得不提另一个持续集成工具——Hudson , Hudson 由 Sun 公司开发,2015 年 Sun 公司被 Oracle 公司收购, oracle 公司声称对 hudson 拥有商标所有权。 Jenkins是从 Hudson 中分离出来的一个版本,并将继续走 Open Source 的道路。二者现在由不同的团队在维护。Jenkins只是一个平台,真正工作的是各种插件。Jenkins之所以流行,原因就是其提供的插件和课找到的地方方插件非常丰富,几乎涵盖了目前需要进行持续集成的所有工具的插件。Jenkins官方网站:https://jenkins.io/zh/ Jenkins国内镜像下载:Index of /jenkins/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
(2)Hudson:Jenkins的前身。其界面、工作原理、插件支持方式都与Jenkins相似,但插件不如Jenkins丰富。在此不多做介绍。官方网站: http://hudson-ci.org
(3)TeamCity:TeamCity由商业公司JetBrains开发和提供支持的持续集成平台软件。JetBrains出品,必属精品。
TeamCity提供一系列特性可以让团队快速实现持续集成:IDE工具集成、各种消息通知、各种报表、项目的管理、分布式的编译等等,所有的这些,都是让你的团队快速享有持续集成带来的效率提升、高质量的软件保障。官方网站: TeamCity: the Hassle-Free CI and CD Server by JetBrains
(二)源码管理工具及平台介绍
(1)代码仓库管理:在软件生命周期中,软件的管理很大一部分工作是源代码的管理。要管理好源代码,需要借助外部工具或软件,提高管理效益,以下为常用的源代码管理平台:
①Gitlab: 私有仓库管理软件,搭建在公司的内部网络上,用来管理公司的内部代码。除提供核心的代码版本控制和仓库功能外,还有提供以下主要功能:
代码Review(代码审查):组员进行代码审查。
持续集成功能(CI/CD):作为持续集成平台使用。
Wiki功能:项目需要的共享文档、资料和说明。
issue管理及看板功能:基本的bug管理及任务管理
Gitlab的官方网站: Iterate faster, innovate together|GitLab
②GitHub: 开源项目托管的利器。GitHub的官方网站: https://github.com
(2)项目构建及打包工具:在项目开发的过程中,我们会用到各种外部库文件,各个库之间有依赖关系,所以需要对外部依赖库进行管理。同时,一个项目中还会包含多个模块,各个模块之间有依赖关系。如果进行手工构建(编译打包)会带来各种问题,如依赖包版本不一致、每个人使用的编译参数不同等。为了对各依赖库进行管理和达到统一编译的目的,在项目构建中需要引入第三方构建工具来提高我们的效益。
①Gradle:目前使用最广泛的自动化构建工具。Gradle是专注于灵活性和性能的开源构建自动化工具。 Gradle构建脚本是使用Groovy或Kotlin DSL编写的。Gradle作为自动化项目构建工具,具有以下特点:
高度可定制:Gradle以最基本的方式、可定制和可扩展的方式创建构建模型。
快速:Gradle通过重新使用以前执行的输出,仅处理已更改的输入以及并行执行任务来快速完成任务。
强大:Gradle是Android的官方构建工具,并支持许多流行的语言和技术。对Java、Groovy、Kotlin和Scala语言支持最好,同时支持C/C++等语言,对各种单元测试工具的支持。
Gradle的官方网站:Gradle Build Tool
②Maven:Apache基金会旗下的自动化构建工具。Gradle出现之前使用Java领域使用最广泛的自动化构建工具。Maven使用对象模型(POM),可以通过一小段描述信息来管理项目的构建;即通过XML文件来描述和管理项目的构建。Maven的官方网站:Maven – Welcome to Apache Maven
③Webpack:最流行的前端(Web端)构建工具。其核心功能主要有:依赖管理、模块管理、混码。
(三)代码质量静态检查与统计工具介绍
(1)代码静态质量检查工具:为了尽早发现代码问题,统一项目代码规范等目的,我们通常需要在进行动态测试前对代码进行静态检查,代码静态检查工具繁多,以下为部分工具介绍:
①Java语言的CheckStyle、Findbugs、PMD
②Python语言的pylint
③C/C++语言的PClint
④JavaScript语言的jsLint
一般静态代码检查工具的主要功能包括:
①代码规范检查
②潜在的缺陷检查
③代码复杂度检查
④重复代码检查
(2)代码质量管理平台SonarQube介绍:SonarQube 是开源的代码质量管理平台,以 web 页面形式(即Sonar Dashboard)可视化形式检查代码质量;SonarLint 是 SonarQube 提供的插件,可以安装在各个 IDE 工具。SonarQube是一个集大成者,允许配置安装插件,比如Findbugs, PMD 和 CheckStyle,基于这些插件的代码质量检查规则多达上千条,已经可以覆盖代码质量的绝大多数方面。SonarQube的官方网站:Code Quality and Code Security | SonarQube