概念
假如把开发工作流程分为以下几个阶段:
编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署
正如你在上图中看到,「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」有着不同的软件自动化交付周期。
“持续集成”一词来源与极限编程(Extreme Programming), 作为它的12个实践原则之一出现。
ThoughtWorks首席科学家、软件开发领域大事Martin Fowler对持续集成是这样定义的:
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味置顶每天可能发生多次集成。每次集成都是通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大的减少集成的问题,让团队能够更快的开发内聚的软件。
从上面的定义可以看出,一个典型的持续集成周期包括以下几个步骤:
- 版本控制服务器上有最新的代码
- 持续集成服务器从版本控制服务器下载最新的代码
- 等代码完全更新以后,调用自动化编译脚本,进行代码编译
- 运行所有的自动化测试(单元测试、接口测试、系统级别的UI自动化测试等)
- 将结果写入报告文件中,反馈给团队成员
- 如果构建失败,必须尽快修改确保下次构建成功
- 产生可执行的软件版本,提供给测试人员进行测试
持续集成框架是由代码提交活定时来触发的(项目级别的持续集成可以由开发每次代码提交触发,而产品级别的持续集成可以由定时来触发),每次提交到版本控制服务器上的代码都要经过自动化构建,确保每次的代码变更都不会导致持续集成失败。
「持续集成(Continuous Integration)」
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
「持续交付(Continuous Delivery)」
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
「持续部署(Continuous Deployment)」
持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。
三者关系
持续交付、持续部署
将持续集成扩充到部署到生产环境就是持续交付和持续部署的概念,二者的区别
手动与自动的区别
CI步骤
CI的价值
开发人员对下面的软件开发场景很熟悉,比如:
场景一:开发了新功能,老功能产生新的 bug;
场景二:修好一个 bug,又产生其他 bug,甚至出现连环 bug;
场景三:出现的 bug 比较多,修改代码要很谨慎,不熟悉的模块一般不敢动,怕引起问题;
持续集成是如何缓解这个问题,Martin Fowler 大师曾经说过:
“Continuous Integration doesn’t get rid of bugs, but it does make them dramatically easier to find and remove.” — Martin Fowler
如上面所说,持续集成不能消除 bug ,但能更容易地发现 bug,更快速地修复,提升产品质量。那么,持续集成能给我们带来哪些价值?
引入了CI(Continuos Integration,即持续集成)以后,每个开发人员在提交代码的时候都会自动进行构建,包括代码审查、编译、单元测试、打包、功能测试等。这样保证了开发人员的每次提交都是安全的。打包生成的文件随时可以被测试人员拿去测试。如果需要给客户演示功能,也只需从CI服务器上直接获取指定的打包完成的文件即可。
CI的好处多多。
减少风险
缺陷的检测和修复变得更快,让寻找和修改bug的工作变简单(只修改系统一小部分,无需看太多代码。由于提交后就可以得到反馈,记忆很新鲜,可以进行差异调试。)同时过早的引入集成,使我们能更好的审视各个模块的接口是否满足要求,减少项目中的假定。
减少重复过程
由于CI将大量的工作给自动化了,那么可以让人们有时间做更多的需要动脑筋的、更高价值的工作。而且通过对重要过程自动化,克服了项目中某些成员对实现改进的抵制,有利于持续集成的推进。这样就形成了一个良性循环。
在任何时间、任何地点生成可部署的软件 对于客户来说,可以部署的软件是最实际的资产。而CI则可以轻松做到这一点。
增强项目的可见性
通过对CI服务器的监控,可以随时了解项目的趋势。CI上的红色或绿色表示了当前项目的健康程度。每一个功能的交付都经历了单元测试或集成测试的考验。
对开发团队的软件产品建立起更强大的产品信心 CI可以防止破窗综合症,让开发团队一点点积累起对产品的信息。