在软件开发过程中,我们会涉及到配置管理、源码控制、发布计划、审计、符合性和集成,以及构建测试和部署流程、验收测试、依赖管理和生产环境的创建与管理,很多人认为这些与确定需求、实现需求、写代码相比,这些活动并不那么重要,它只为是软件开发过程很小的一部分并且不需求多大的技术投入。其实不然,恰恰相反它们会消耗大量的时间和精力,而且是成功交付软件的关键因素。假如没有关注这一方面带来的潜在风险,可能耗费大量不必要的资金,甚至导致整个项目严重延期。
如果没有持续集成,我们可能会遇到下列问题:
1、如何将一个想法以快的速度交付给用户。
2、如何协调开发人员、测试人员,以及构建和运维人员在一起高效地工作。
3、在发布当天是否遇到很多的问题,发布过程时候需要很长的时间。
4、是否在开发完成之后才发布软件,失败后长期的加班。
5、如何快速的获取用户的反馈,并让团队人员及时的改正。
6、生产环境是否还是采用的手工部署,还在为不同环境之间的部署烦恼。
7、在开发过程中,应用程序在相当长的一段时间内无法运行,无法验证每次修改的正确性。
一行代码的改动需要花多长时间才能部署上线,处理方式是否可重复且可靠呢?从决定做某种修改到该修改结果正式上线的这段时间称为周期时间。对任何项目而言,它都是一个极为重要的度量标准。
软件开发的首要任务是尽早交付有价值的软件并让客户满意,速度是至关重要的,因为未交付的软件意味着成本。如果不能按时按量的交付,会产生不必要的成本浪费。而为了更好的协调组内人员高效的工作,在整个交付过程中,团队中的每一个成员都必须对每一个交付特性负责,无论什么样的修改都应该触发反馈流程,反馈应该尽快发出,团队必须接受反馈,并依据它作出相应的行动。快速的交付使你能够验证那些新开发的特性或者修复的缺陷是否真的有用。
为了达到短周期、高质量的交付目标,发布软件必须自动且频繁化。
自动化:构建、部署、测试、发布
频繁化:频繁发布,每个发布版本之间的差异会很小,大大减少与发布相关的风险,且容易回滚,频繁发布也会加快反馈速度。每当有人提交代码,对整个应用进行构建,执行全面的自动化测试,以验证其正确性。更重要的是,如果构建或测试失败了,开发团队要停下手头的工作,立即修复它,时时刻刻都要让正在开发的软件一直处于可工作的状态。
实现持续集成,你需要的:
1、版本控制,所有涉及产品的都要加入到版本控制中,包括构建与部署脚本。
2、自动化构建,自动化的构建整个过程,缩短周期时间(Cycle time)。
3、持续集成系统,Jenkins, ThoughtWorks公司的Go,JeBrains的TeamCity等。
提交代码必须遵守以下原则:
1、查看构建是否成功,如果失败,停下手头的工作和团队中的其他人一起修复。
2、如果构建且测试全部通过,从版本控制库中的代码更新到自己的开发环境上。
3、在自己的修改上重新构建,运行所有的测试,确保在自己机器上的代码都是正确的且工作正常。
4、如果本地构建成功, 再从版本构建库中更新代码到本地, 再做一次构建,如果成功的话,提交本地的修改到版本库中。
5、在远程持续集成服务器上再次构建包含你的这次提交的构建结果(通常是自动的)。
6、如果构建失败,停下手中的事,在自己的开发机上修复这个问题后,再重新回到步骤3.。
7、构建成功,小庆祝一下,并开始下一项任务。
持续集成缩短从想法到商业价值实现的时间,减少时间和降低风险,增加反馈,改进负责交付的开发、测试和运维人员之间的协作关系。