软件开发中有很多有趣的原则,比如亚马逊ceo jeff bezos提出的两个披萨团队(two-pizza teams)或者面向微服务的架构(microservices/service oriented architecture)。不过这篇文章中,我们主要讨论在云上现有能够实现ci/cd的架构。
持续集成和持续交付(ci/cd)
首先我们来看一下什么是持续集成和持续交付。持续集成(ci)是软件开发中的一种方式,开发人员定期将代码迁入中央代码库,然后进行自动的编译和测试。ci的关键是能够更快地找到bug,降低测试和软件更新的成本。持续交付(cd)则比ci更进了一步,他需要让代码的变更自动编译,测试和能随时交付。cd可以自动部署到测试环境或者生产环境。
这里要注意的是持续交付(continuous delivery)和持续部署(continuous deployment)的区别。持续交付不是说所有的代码变更都要上生产系统,而是说所有代码变更都可以随时准备好上生产系统,持续交付的好处主要是自动化了软件发布流程,提高了开发的生产效率,提高代码的质量以及更快地发布更新。
这里要多提一句的是devops。devops是提高一个组织高速交付应用和服务的一组理论,最佳实践以及工具,ci/cd其实也是devops的一部分。
实现持续集成和持续交付
首先我们来看一下标准的持续集成和交付的流程:
要实现上述的流程有巨大的工作量,也可以检验一个团队的成熟度。这也是一个通用的流程,当然企业或者团队也
代码
这里我们需要一个中央的代码库来管理所有的代码。在互联网上有大量工具可以用在代码管理上,例如git,tfs, svn或者cvs,不过当前git成为了主流。使用git作为代码库有很多优点,例如分布式,内容管理或者项目管理。企业可以自己部署一套git,也可以使用当前著名的代码管理saas提供上github。在云上主要选择如下:
无论哪种工具,都能够实现代码的保存和管理,此外也可以进行版本控制。我们推荐使用云上的服务,避免了大量的后台维护工作。当然如果团队对代码的安全性要求比较高,也可以自己维护git服务器。
编译和测试
在编译里,我们可以使用jenkins,gitlab,也可以使用aws codebuild和vsts实现全自动的编译和执行测试脚本的工作。
部署
管理工具
devops工具
在云上实现ci/cd的统一部署
在云上我们有大量现成的工具,可以实现完整的ci/cd以及流程管理,下面我们简要介绍一下如何在aws和azure上实现完整的ci/cd。
在aws上实现ci/cd
aws提供了完整的ci/cd产品,主要包括awscodestar, aws codecommit, aws codepipeline,aws codebuild以及awscodedeploy。在devops工具里,提供了aws opsworks。这些工具已经完整地为aws用户实现了ci/cd的各种需求,首先我们可以使用codecommit来存储代码,然后用codebuild编译,最后使用codedeploy进行部署,中间的工作流城通过codepipeline来管理,也可以用codestar一键生成所有需要的环境,在运维阶段用opsworks自动部署和扩展。
下图展现了aws代码服务中的各种产品。
而codestar更是在以上代码服务的基础上,增加了环境,jira,用户管理等支持,将软件开发过程中需要的各种服务集成在了一起。如果我们使用的已经是aws了,那么可以直接利用现有的产品,非常简单高效地完成ci/cd。
在microsoft azure上实现ci/cd
微软在传统软件开发领域有着大量的最佳实践,可以说是走在了整个软件开发流程的前列,下图是微软模式和实践中关于持续交付的流程图:
在azure上自动化这些流程是非常简单的,所有的工作都可以通过visual studio team services(vsts)来实现。azure不像aws有各种工具实现不同的功能,他现有的vsts服务就可以从头到底完整实现。例如同时支持git和tfvc集中式源代码管理,提供弹性的编译服务,持续自动交付到azure,自动启动压力和性能测试,并且还有协作,敏捷项目管理等传统的msf流程。
云计算给传统的软件开发模式带来的巨大的变革,能够快速应用现有的持续集成和持续交付工具的团队,就能够在云计算的时代快速实现高质量软件的开发和交付。我们建议新的项目都能够使用云平台上的各种代码管理和ci/cd产品,免去了自行运维的痛苦,也能够把主要精力放在业务逻辑上。