【自动部署该怎么做?】

剖析AWS CodeDeploy

作者 刘涛 发布于 2015年5月13日 | 注意:GTLC全球技术领导力峰会,500+CTO技聚重新定义技术领导力!讨论

2014年底,AWS在“re:invent”大会上发布了三个新的部署、管理服务CodeDeploy ,CodeCommit和CodePipeline。此前AWS已经提供Beanstalk,Opsworks,CloudFormation等部署与管理服务,那为什么AWS仍然会继续在部署、管理服务上发力呢?用户有哪些问题还没有得到很好解决呢?本文将深度剖析这三个服务之一:CodeDedploy,剖析CodeDeploy解决的问题,以及阐述我们对其背后的原理和思想的理解。希望籍此能够吸收Amazon的经验并应用于改进和加速我们的开发交付过程。

1. CodeDeploy是什么?

CodeDeploy是AWS提供给其用户的自动化部署服务,能够让AWS用户方便快速地将应用自动部署到EC2实例上。通过部署流程的标准化和自动化,加快部署的速度,控制部署节奏,降低应用升级更新的复杂度,减少手工部署操作的错误和风险。最终使得用户能够在快速地发布新特性的同时保证部署的质量,避免部署过程中的服务中断。在支撑规模上,该服务能够处理成千上万节点规模的应用部署,能够满足绝大部分用户的部署规模要求。目前该服务仅在AWS美东Virginia和美西Oregon开放。

2. CodeDeploy的来源

2014年11月,Amazon CTO Werner Vogels在其博客中透露了CodeDeploy的来源及其背后的故事(The Story of Apollo - Amazon’s Deployment Engine)。

相关厂商内容

QCon全球软件开发大会上海站,10月20日-22日,上海·宝华万豪酒店!

APMCon中国应用性能管理大会,8月18日-19日,给你专业解答!

GTLC全球技术领导力峰会,8月29日-30日,高端技术领导人盛会!

CNUTCon全球容器技术大会,9月9日-10日,Docker应用实践!

活动大本营全新改版啦!

相关赞助商

更全的优惠信息,更多的免费活动,更丰富的线上课程,点击了解详情

多年前,Amazon为了加快研发交付的速度,从公司层面对系统架构和开发组织结构进行了调整。整个系统架构转向SOA,将大型系统都拆分成规模较小、独立运行的SOA服务。开发组织也调整为一个个小型自治团队,由每个团队全权负责管理其SOA服务的开发和运维,而不是将开发和运维分开由不同的团队负责。这个变化之后,他们很快发现部署过程又成为了新的瓶颈,于是很多团队通过将其部署过程自动化来解决这个瓶颈。最初在系统部署节点规模小和部署要求比较简单时都可以应付,但是随着系统部署节点规模的增大,跨数据中心部署以及对服务SLA更高的要求,部署问题及解决变得复杂起来。为了避免各个团队重复解决相同问题,Amazon构建了一个内部部署系统Apollo,让团队不再因为部署而降低发布新特性的速度。据悉,现在Amazon内部每天有数千工程师通过Apollo部署服务,2014年部署次数超过5000万次。

与此同时,Amazon外部的很多其客户也遇到同样的问题,他们希望Amazon能够分享相关实践经验。于是Amazon基于Apollo发布了其公开版本,即CodeDeploy。

说到这里,我们不禁要问,Amazon的Apolllo及其公开服务CodeDeploy究竟是怎么解决开发运维中的部署问题? AWS自身也是天天需要部署。这么复杂的一个系统,有着严格的SLA,都能做到无downtime升级,背后的原理是什么?是怎么设计的?下面我们先来看一下CodeDeploy解决的具体问题,然后再看CodeDeploy背后的设计和蕴含的思想。

3. CodeDeploy解决的问题

CodeDeploy解决的主要问题在于配合Amazon组织结构及系统架构设计调整,加速业务的交付,处理应用的部署交付,使该环节不再是影响交付速度的瓶颈。

对于部署,很多人觉的很简单,没有太大用处,不值得在上面花费时间。但是实际上,可以说部署过程对整个开发交付运维过程,交付速度质量影响是非常大的,特别是对于分布式系统,系统比较复杂,组件比较多,部署节点规模很大,对系统有SLA要求时,其需求场景内涵和外延是很广的,处理场景包括不同应用类型和架构,不同的应用组件代码打包方式,不同的目标部署环境,不同部署过程要求,等等。 下面举一些部署要处理的场景。

1) 应用类型和架构不同

  • 规模不同(小型应用,大规模分布式应用等);
  • 架构不同(简单的,复杂的,各个业务领域的,Web应用,平台系统等)。

2) 应用组件代码打包不同

  • 应用系统代码打包范围不同(如所有组件都打在一起或分开打包);
  • 应用Build库不同(S3,Nexus,Git, SFTP等);
  • 应用代码结构不同 (Java,C++,Python,Ruby等)。

3) 目标部署环境不同

  • 部署的基础资源环境不同(AWS,Azure,物理机等);
  • 用途类型不同(开发,测试,试运行,产品,演示);
  • 节点规模不同(几个,几十,几百,几千);
  • 地域范围不同(单一地区,跨地区,跨国);
  • 操作系统及运行环境不同(Ubuntu,CentOS,库包等);
  • 遗留系统兼容要求不同(可以导入主机,需要新创建)。

4) 部署过程要求不同

  • 各组件部署的频率不同(不同组件同一个阶段中不同,一个组件不同阶段不同);
  • 部署工作流节奏不同(不同类型组件同时部署,按顺序,一个组件分批部署);
  • 服务允许中断时间SLA要求不同(可以中断几秒,几分钟,几小时,不能中断);
  • 部署花费时间要求不同(几秒,几分钟,几小时);
  • 能部署的人的范围不同(只有某些人有能力部署,所有人都能够部署);
  • 部署的权限要求(只有某些人有权限,不做限制);
  • 部署过程的可视化;
  • 部署后的验证。

对于CodeDeploy,除去其将环境绑定到AWS外,其设计思想还是很通用的,能够处理以上绝大多数的场景。那么为什么CodeDeploy能够解决这些问题,消除部署瓶颈,保持灵活通用? 我们来看看它的设计原理和思想。

4. CodeDeploy的设计原理和思想

核心设计1: 针对SOA设计,灵活通用,局部独立部署

传统方式采用的是整体部署的方式。在我们实际的开发和运维过程中,简单应用的组件通常比较少,部署场景也比较简单,适合整体部署。但是,对于组件比较多的大型应用,我们发现往往每次部署升级仅涉及其中几个组件,部署过程中往往最复杂的地方是各个组件之间的连接配置,升级顺序的控制和数据库表结构的升级。如果采用SOA的方式,把一个大型复杂的系统分解为一个个规模较小、独立自治的SOA服务,相当于简化问题。一方面分解出的每个系统复杂度会降低,另一方面组件之间的连接配置会大大简化,这样部署也就相应地简化,更易于处理和保证部署质量。

CodeDeploy着眼的就是将大系统分解为多个SOA服务,通过部署分解后的SOA服务来处理整个系统的部署。相当于把整个系统部署分成多个局部部署,分而治之,这就是微服务、SOA的理念在部署环节的体现。

核心设计2:应用代码与部署脚本是一体的

传统应用代码和部署脚本是分离的,基于很多不同的部署工具开发,如Chef,Puppet,Ansible,或者开发人员自己写的Shell,Python部署脚本。由于系统的开发和运维由一个自治团队全权负责,所以将代码与部署放在一起就非常自然。从这一点也可以看出DevOps的理念,即消除Dev和Ops之间的鸿沟,统一Dev和Ops的目标和部署。另外,将应用代码与部署脚本一体化,也简化了代码和部署脚本的管理,避免代码版本与部署脚本版本需要对应的问题。其实,这种设计也简化了用户的使用过程,不需要额外再做部署脚本版本的管理了。

核心设计3: 基于事件的部署流程

CodeDeploy定义了一个基于事件部署流程接口,在接口定义中,定义多个部署文件拷贝源目标部署映射(files -> source-> destination),以及部署中各个步骤及步骤之间的执行顺序(ApplicationStop -> BeforeInstall -> Install -> AfterInstall -> ApplicationStart -> ValidateService),各个步骤要执行的脚本,执行超时时间和执行用户。如下图1所示,右边部分就是一个部署接口定义,在这个定义中,开发人员定义了停止应用步骤使用代码根目录下scripts目录下的stop_server.sh脚本,在部署应用代码前,即BeforeInstall时,BeforeInstall步骤执行scripts目录下的install_dependencies.sh脚本安装各种依赖,启动应用步骤使用start_server.sh脚本,最后验证部署时使用validate_service.sh脚本验证。

可以说,这个接口的设计非常灵活通用,适用于非常广泛的应用和部署场景,比如不管应用组件代码打包是在一起还是分开,不管应用架构是否是SOA,把适配各种场景的实现留给应用的开发人员,由开发人员针对不同的场景按需实现。而CodeDeploy处理应用版本信息的管理,部署组管理,部署过程各个步骤自动化协调控制, 执行指定的各个步骤的脚本和部署过程的可视化。

图1: 基于事件的部署接口定义

核心设计4: 对外开放API

由于CodeDeploy只处理对基础环境EC2实例的部署,且只针对一个应用(组件),而实际过程中,一个系统包含了多个组件,那么整个系统的生命周期管理的整个过程需要自动化,所以CodeDeploy也开放了相应API接口以及CLI,以便应用开发人员能够将CodeDeploy服务集成到自己的开发流程,实现持续交付。

5. CodeDeploy的适用范围及局限性

应用生命周期管理包括配置管理,资源管理,环境管理,部署交付管理,自动化测试,监控告警,备份恢复及容量伸缩等各个环节,我们看到CodeDeploy仅处理代码部署问题,并不处理应用配置管理,资源管理,环境管理以及之后的监控和恢复,伸缩等环节。 其中:

  • 配置管理中的代码版本管理在AWS服务中由CodeCommit或Github处理;
  • 应用Build存储由S3处理;
  • 环境管理,基础设施资源管理环节由AWS EC2,Cloudformation来处理。

所以,使用CodeDeploy完成应用的部署还需要集成使用AWS的EC2,IAM,S3等多种服务,才能完成静态代码到在线服务的整个流程。例如,使用CodeDeploy之前,需要先通过AWS EC2启动运行应用需要的实例,配置实例的部署组类型(例如,通过打Tag),给实例配置访问S3的权限,并授权CodeDeploy操作实例权限等。由此可见:

  • 用户要想实现系统的持续自动化部署,仍然需要自行集成开发, 比如需要自行实现应用新版本的打包和上传到S3,之后调用CodeDeploy Rest API升级新版本;
  • CodeDeploy只能管理AWS上的应用,而无法用于管理跑在其他IaaS基础设施中的应用,不支持应用的跨云迁移和管理。

6. 总结

“You build it,you run it.” 是Amazon CTO信奉的理念,这个工具再次体现了这点。当然,它也体现了DevOps的思想,体现了Amazon的SOA架构。虽然CodeDeploy只能用于管理AWS上的应用的部署,不能用于管理我们国内云上的应用,但是我们还是能够从中借鉴很多理念和设计,调整我们的系统架构和组织架构,统一Dev和Ops的目标及工具,以加快我们的交付速度,提升运维的效率质量。

作者简介

刘涛是AWS认证解决方案架构师,FIT2CLOUD联合创始人。FIT2CLOUD不仅提供一站式的应用交付及运维管理工具,同时还提供方法论来帮助企业打通从代码到服务的通道,实现云应用的持续交付和自动化运维。FIT2CLOUD的代码部署功能和AWS CodeDeploy相似,兼容AWS CodeDeploy的appspecs.yml接口规范,同时,FIT2CLOUD还支持用户导入外部主机进行统一的部署和管理。

参考资料:

FIT2CLOUD持续集成和部署流程概述:http://docs.fit2cloud.com/v1.1/cmguide/ci-overview.html#fit2cloud持续集成和部署流程概述

剖析AWS CodeDeploy:http://www.infoq.com/cn/articles/analysis-of-aws-codedeploy

时间: 2024-10-07 07:45:08

【自动部署该怎么做?】的相关文章

Gitlab+Jenkins实现自动部署

系统环境: Gitlab主机 IP:192.168.1.2 Jenkins主机 IP:192.168.1.3 一.为何要做自动部署 #为什么要做自动部署,因为懒啊!!! 二.配置Gitlab #首先,你得有一个代码仓库,赶紧到gitlab上创建一个,然后创建个分支并创建一个文件. #其次,你得配置一个ssh公钥到gitlab上,这样才能模拟开发上传代码到gitlab. #至于ssh公钥私钥怎么生成,自己百度去. #克隆代码仓库,然后测试是否能够上传代码到gitlab git clone [ema

服务器做了格式化后(ip没变),jenkins自动部署报错

jenkins自动部署报错如下:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Some

使用gogs,drone搭建自动部署

使用gogs,drone搭建自动部署 使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台Docker是使用go开发的开源容器引擎Drone是一个基于容器技术的持续集成平台.每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离.drone易于安装和使用,其目标是替代jenkins 本文所实现的的功能为当你push代码到gogs时,自动更新您测试环境的二进制文件并重启,实现自动部署(以go开发a

[转]Eclipse中的Web项目自动部署到Tomcat

原文地址:http://www.cnblogs.com/ywl925/p/3815173.html 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写 博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误,解决后不再使用的话,很长时间重新使用,还是会犯同样的错误.(这是人,编程环境,思维方式 共同决定给的) 问题 这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Ecli

Eclipse中的Web项目自动部署到Tomcat

一.原因. 1.写java程序有一段时间了,但很久没用eclipse了,所以使用eclipse编写的web项目部署到tomcat 的方式也不是很清楚,下面记录一下将Eclipse 上的web项目自动部署到tomcat 上的方式: 二.部署问题 1.这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录下,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse中

在linux服务器上装svn版本管理,自动部署代码到项目

在linux服务器上装svn版本管理,自动部署代码到项目 http://bbs.aliyun.com/read/9715.html?spm=5176.7114037.1996646101.1.W3zw3X&pos=1 http://v5sheji.com/archives/setupsvnonlinux.html 1.安装svn服务器端  yum install subversion 从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 安装成功提示:.....complete! 依次

git管理和自动部署项目

当一个项目需要纳入到版本控制的时候,选择的工具还是比较多的,最常见的就是工具有CVS,SVN,GIT等.在平时的开发中视情况而定,从来就没有最好的版本控制工具,只有最适合的工具.在这里我习惯用git来管理自己的项目,当然之前使用svn管理的,但是当用了git工具就不愿意再用其它的工具来管理.这里除了习惯之外,git的很多功能是svn不具备的,最简单的就是离线提交,用git管理的项目你会发现整个项目的大小变化不大,不像svn那样每个目录又有一个.svn 的目录,而且会使项目的变得很大.关于git与

jenkins实现项目自动部署

背景 整体思路 实现方式 1 自动化部署脚本 2 远程执行 3 配置jenkins任务 背景 之前给公司搭建过一套gitlab+gerrit+jenkins的持续集成环境,由于操作起来有点繁琐,自己也没太搞清楚该怎么用,所以一直就只用了gitlab来做代码管理.最近要做一个项目自动部署的功能,使用过jenkins一定知道他的自动化功能.所以就从jenkins创建自动部署任务的方式来入手. 整体思路 jenkins可以配置触发器,当有新的提交时,触发执行相应的任务.由于jenkins和项目部署不在

Shell脚本自动部署(编译)LAMP平台

Shell脚本自动部署(编译)LAMP平台 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装LAMP有以下几个优点 根据生产环境灵活定制程序 优化编译参数,提高性能 解决不必要的软件依赖 友情提示:对编译安装有疑问的朋友, 查看我以前写的博客:教你使用rpm.yum.编译等方式安装软件 点击此处获得更好的阅读体验 为什么要用脚本进行部署? 在很多情况下部署LAMP平台并不止一