如何理解docker 持续集成部署,持续交付,持续部署

从自动化测试到持续部署,你需要了解这些【自动化测试 持续集成】_词汇网
从自动化测试到持续部署,你需要了解这些
关键词:&&&& 发表时间: 18:20:30
持续部署 自动化测试 持续集成 在互联网的产品开发时代,产品迭代越来越频繁,“从功能开发完成直到成功部署”这一阶段被称为软件开发“最后一公里”。很多开发团队也越来越认识到,自动化测试和持续部署可帮助开发团队提高迭代效率和质量。那么,如何更好地解决“最后一公里”这一问题呢?>一切从自动化测试开始,让自动化测试贯穿在整个项目开发-集成-部署-交付的-开发流程中。如果你的团队还没有开始自动化测试,推荐从经典的测试金字塔开始。## 自动化测试 ![](1.z0./image/4/2b/fbf1c16fd15c5dcfe.png)在这个分层自动化测试金字塔中,Unit 代表单元测试,Service 代表服务集成测试,UI 代表页面级的功能测试。不同的产品层次都需要自动化测试,投入的精力和工作量会有所不同。下面我们仔细看下每个层次的测试:### 1.1 Unit 单元测试> “凡是不能量化的工作都是不可考量的”目前很多公司已经意识到了单元测试的重要性,但国内坚持写单元测试的团队并不多,其中一个难点在于没有考量,没有很好地执行单元测试覆盖率检测。想想,如果没有单元测试覆盖率检测,单纯的只写单元测试,时间长了也许开发人员会产生惰性,比如:今天任务太紧了,就不写单元测试了,以后再补,反正写不写也没有人知道。引入单元测试覆盖率检测之后,开发人员会更主动地写单元测试,就算补写单元测试也更有成就感。单元测试覆盖率检测有现成的第三方工具,比如 code climate 、 Coveralls 等等,针对不同的语言也有还有一些定制化的检测工具, 比如前端常用的 Eslint , Python 常用的PEP8 等等。整个项目的单元测试覆盖情况百分比,看上去一目了然。相比其他层级的测试,单元测试发现并解决问题付出的成本相对来说最低,而投入产出比最高。单元测试的责任主体一般来说是开发人员,写单元测试也是开发人员对自己的代码进行检查的过程。### 1.2 Service 集成测试> “多数应用和产品都需要与外部资源交互,有时候多数 Bug 并不来源于程序本身,而是由从外部输入的数据所引起的。”这时候,就更需要集成测试。集成测试是在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。这个集成测试阶段主要解决的是检查各个软件组成单元代码是否符合开发规范、接口是否存在问题、整体功能有无错误、界面是否符合设计规范、性能是否满足用户需求等等。 集成测试与单元测试最大的区别在于,它需要尽可能地测试整个功能及相关环境。如果不经过单元测试,那么集成测试的效果将会受到很大影响,大幅增加单元代码纠错的代价。这一层的被测对象是抽离了展现层的代码(前端以及部分后端展现层逻辑),主要是由测试人员进行,是测试人员大展身手的地方。### 1.3 UI 系统测试> “一份永远都运行成功的自动化测试用例是没有价值的。一切都在变化中。”在做好上面两层的测试覆盖之后,最顶端的是 UI 层的自动化测试。目前,UI 层的自动化覆盖正在逐渐转变为页面展示逻辑及界面前端与服务展现层交互的集成验证。UI层自动化做的方式很多,根据不同的系统,不同的架构可能会用到不同的框架或者工具,比较主流的有QTP,Robot Framework、watir、selenium 等。怎么选择合适的工具?每个测试工具都有它的优缺点,每个被测试的项目也有自己本身的特点。比如,项目是用什么语言编写的,C, C++, Java, PHP , Python or C#? 项目是什么类型,Desktop , Web or Mobile Application? 很难说一种工具就可以搞定所有或者大部分的项目,也很难说一个项目就能单纯的靠一种工具来搞定。UI 层是直接面向用户的,需要测试人员放入更多的时间和精力。如今的互联网公司大多需求变化大而快,迭代频繁,所以很多团队做 UI 自动化测试投入较大精力,却迟迟见不到效果,自动化测试人员每天奔命于维护脚本,追赶进度。有 2 点 UI层自动化覆盖的原则非常有必要提下:- 能在底层做自动化覆盖,就尽量不在UI层做自动化覆盖;- 只做最核心功能的自动化覆盖,脚本可维护性尽可能提高。综上所述,分层自动化测试侧重不同,效果不尽然完美的,而最快速高效发现 bug 的方法是将自动化测试包含到构建过程中。谨慎周全的自动化测试可以进一步保证持续部署的稳定与安全,提高持续部署的成功率。## 持续部署![](1.z0./image/2/ad/3c5b0f661de.jpg)对于持续部署,[@湾区日报](/wanquribao?refer_flag=_&is_hot=1) 这样评论:>一个团队工程技术水平高低,直接反映在部署代码上。我碰到其他公司的人,都喜欢问你们怎么部署代码的,非常大开眼界。你很难相信,很多(有一定规模的)公司仍然是人肉 SSH 到十几、二十台机器上 git pull、手动重启服务器,部署一次代码几个小时 -- 这么原始,活该加班:)持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率,让 engineering productivity 最大化。### 2.1 持续部署的步骤“持续部署”的痛苦源于部署时的各方面,比如需要部署到哪些环境,测试环境?灰度发布?正式环境?还有其依赖包的版本,环境配置管理等等,都需要考虑在其中。对于一个标准的部署――安装软件包并启动环境,可能的步骤将会是:![](1.z0./image/3/8e/57f1a35d1e8d78b87.png)### 2.2 CI 工具的选择与使用imothy写过[一篇文章](//continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/)介绍了 [IMVU](/about/) 是如何进行持续部署。IMVU 的做法是,在**持续集成**构建过程中进行大量的、覆盖范围广的、非常可靠的自动化测试,保证在 10 分钟内跑完整个测试套件。所有测试通过后,部署便开始了。在这个过程中,持续集成工具的选择和系统的搭建显得尤为重要。面对众多的 CI 工具,我们将其分为 Hosted CI 和 Self Hosted CI:- Self HostedCI 指的是将软件部署在公司的机房或内网中,需要提供多台服务器来完成 CI 系统的运转,同时需要对不同机器之间进行环境配置。主流工具有Jenkins,其他受欢迎的工具比如 Baboom 及 TeamCity 等。- Hosted CI 指的是由 SaaS 型的 CI 服务,全程在线进行构建配置,不需要考虑装机器,装软件,环境搭建等成本。常见的有 CircleCI,Codeship 和 TravisCI 等。我们对比一下这两种 CI 服务:- Self Hosted CI 对构建环境有完全的控制权,能够实现完全定制。但需要搭建环境和配置、维护成本高,需要买专门的机器,花费人力物力且更新迁移风险高;- Hosted CI 无需额外机器,几分钟就可以用起来。可以根据你的需要动态调度资源。省时,省心,省力。我们做了一款 Hosted CI 产品―― [flow.ci](http://flow.ci/?utm_source=oschina&utm_medium=passage&utm_content=testing_CD) ,它是融入了 workflow 机制的持续集成(CI)服务,也可以理解为自动化流程平台,除了集成代码、编译、测试之外,还可以集成常用的工具、灵活自定义流程。1 分钟即可完成开发测试环境搭建,开启第一个Build。![](1.z0./image/6/f1/dd45a99a4cf9187efc0f.png)[flow.ci](http://flow.ci/?utm_source=oschina&utm_medium=passage&utm_content=testing_CD) 更侧重于工作流的设置,默认的工作流可以自动编译测试代码,进行单元测试覆盖率,代码质量检测等工具以插件的形式进行集成;并加入了 Webhook 功能。从自动化测试到持续部署,一切简单灵活。### 2.3 让持续部署成功的要点一个持续集成 & 持续部署的自动化系统并不是那么简单的事,如果不选用其他 CI 服务,其开发工作量和一个标准的大型互联网业务系统没什么两样。如果没有持续部署的经验,要想成功地进行持续部署要注意这些:- 充分而广泛的自动化测试覆盖;- 尽可能短的测试反馈时间;- 部署过程自动化;- 部署过程要保证数据安全;- 在稳定的前提下,尽早部署;- 完善的风险缓解措施;- 将同样的产物部署到不同的环境中### 2.4 持续部署习惯的养成持续部署真正困难的不是技术的实现,也不是工具的选择和使用,最难的是培养团队持续部署的习惯以及工程文化。可以参考下[Instagram 的持续部署工程文化](/posts/0335/continuous-deployment-at-instagram/)。## 总结不论是自动化测试,还是持续部署,都只是一种实现手段;他们真正存在的价值在于提高代码质量和提高产品的持续交付能力。关于如何进行更好地进行自动化测试和持续部署,可以多参考下其他公司的持续部署实践案例与经验。如果你有更加深刻的见解,欢迎留言交流!【参考链接】- [持续部署,并不简单!](/22377/)- [有赞分层自动化测试实践](/layers_test_automation_practice/)- [Beyond Continuous Integration: Continuous Deployment](q.com/news/2009/03/Continuous-Deployment)(该文章来自精英博客其个人观点,不代表本站的观点或立场,如有异议请来信告知)
上一集:没有了 下一集:
相关文章:&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索【译】持续交付--自动化发布流程 - 简书
【译】持续交付--自动化发布流程
标签(空格分隔): 翻译
原文地址:
对于很多开发者来说,发布版本的那天都会陷入巨大的压力。发布过程中总是有些风险,比如出现某些莫名其妙的问题,或者是产品里又被发现了某个bug。在我上一家公司,我们采取的是手动发布版本,过程基本都是人工去做的,因此,特别容易出现问题。在发布当天,DevOps(译者:看百度百科是怎么描述的职责)部门会加载二进制的运行文件,然后做用户验收测试。如果所有的测试都成功,软件就会复制到服务器上,进行冒烟测,一般来说,还会进行一次前一版本的用户验收测试。下面列举出通常都会遇到的问题:
当我们因为一个问题回退发布的情况里,有2/3都是由于演示环境和生产环境配置有不同导致的;
发布的过程非常的缓慢,一个新功能要发布到用户手里总是需要非常长的时候。发布过程总是需要好几天甚至好几周。
漫长的发布流程以及跑完用户验收测试,还有另一个副作用:就是开发者总是不能及时的拿到用户反馈。当反馈到达的时候,他们可能正在开发另一个功能。这样一来,就可能会导致额外的问题,因为他们可能已经记不住那些代码怎么写的了,再改的时候就很容易出错,由于合并不同的分支,往往还会引入新的问题
简单的说,手动和没有固定的发布流程绝不是好的选择,发布那天总会承受很大的压力。在我们的案子里,如果发布不是很频繁,团队也还不够成熟时,这样的方式是可以接受的。为了改进和自动化发布流程,有一种软件工程的方法叫持续交付。
持续交付使得发布新的功能更快更稳定。同时可以让开发者更及时的收到反馈。我们开发一套软件,可以在任何时候自动安全的部署到产品上。这就确保了发布里的每一次改动,都会发布到类似真实产品环境上,并且可以运行大量的自动化测试。按照的理论,如果你做到以下的了,那么就称得上是持续交付:
业务的负责人随时都可以要求发布当前的开发版本部署到生产环境上。所有的人甚至都不需要眨下眼,一点不会感到惊慌。
持续交付,是持续集成(CI)的一个重要的先决条件。持续集成要求任何新的改动都可以快速的集成到主分支上,整个项目一直都处于开发状态中。通常来说,它是这么工作的:一旦有改动发布到github上,就会重新编译部署。整个应用都会按照所要求的配置去编译,一系列单元以及集成测试都会重新运行。如果测试失败,团队会停止工作直到修复了问题。没有了持续集成,集成很容易就变成梦魇。当我启动一个新的项目的时候,如何持续集成会是我考虑的首要事情。我看到过很多的案例,整个团队都不想关注那些出了问题的编译。这通常都发生在持续集成过程已经变成了巨大多毛的怪兽的时候。这也有违持续集成的首要目标:出了问题的版本决不能被忽视,团队的首要任务就应该是去修它们。为了确保这件事,持续集成的过程应该尽可能的短,好使,简单。如果测试的运行会占用过多的时间,不可靠也不能帮助定位问题,那么团队就会不去尝试修改问题版本,甚至互相推诿责任,说是别的团队弄坏了版本。持续集成主要是在关注开发团队。持续集成里也可能会有手动去发布版本的过程。在我们做过的案例里,也有手动的拷贝二进制文件和对应的配置文件到演示和生产环境里的。与之相反的是,持续交付会将整个发布流程自动化。为了达到这一目标,我们使用了一条流水线,这条流水线有非常清晰的阶段和对应的过程。
一条持续交付的流水线是让你的新版本发布出去的流程的集中体现。按照 Martin Fowler的理论:
在自动化你的编译和测试环境过程里一个很大的挑战是,你想要编译的更快,以便你可以快速的得到用户的反馈,但是综合测试需要运转很长的时间。部署流程会想办法把发布分解成很多个阶段。早期阶段会找出绝大多数能找出那些很快就可以被发现的问题,较晚的阶段则专注于找到会慢一些的问题。部署流水线是持续交付的核心部分。
一个典型的持续交付过程如下:
持续交付流程图
决定这条持续交付流水线成功与否的部分就是验收测试,验收测试位于这条流水线的较靠后的阶段,也就是“更多靠摸索”的阶段。他们确定软件能满足用户的需求和指标。验收测试不应暴露内部系统的细节,应该就像对待黑盒一样对待。我们的验收测试会由模拟一个真正的用户会输入的内容,接受并验证系统的输出并验证这些输出是否符合预期。
在持续交付的流水线上,从一个阶段转到下一个阶段可以使手动,也可以是自动的。手动并不意味着把内容拷贝复制到下一个流程中。它只是意味着,操作人员需要标记一下,表示现在的阶段已经完成,可以转交到下一个阶段了,而这个过程通常会需要手动的按一下按钮。
持续交付的流水线能在确定了交付流程之后被定型下来。没有所谓的标准答案:一个流程总会和另一个看上不太一样。举个例子,在一个有很多独立组件的SOA项目里,我们觉得一个为所有的组件制定一个流程是最好的方案。而另一个项目要求给每一个组件都制定独立的流程,而整合到一起之后的流程,可以参考下图。
集成后的流程
实现一个好的持续交付流程是一个让人沮丧的任务,但是一旦完成好了,会产生巨大的好处。在我看来,最好的方式就是仔细研究你的部署过程,理解所有的依赖关系,从一些比较小而且简单的地方开始入手。
持续交付VS持续部署
持续交付中,总需要有人最终去确定把产品部署到生产环境中。一个典型就是,发布的软件发生了一些变动之后或者是在固定的日子。
而持续部署比持续交付则更进一步:每一次改变,只要通过了自动化测试就会自动的部署到生产环境。持续部署可能不适用于所有的项目,即使理论上听上去很棒,但是我可以肯定,我目前还没有在商业项目里尝试过这种方式。Yassal Sundman的博客上有一副图,是比较持续交付和持续部署的过程:
持续交付VS持续部署
对于持续交付的工具我没有特别的个人偏好。最近我开始在使用AWS的CodePipeline(和AWS的CodeDeply类似)去自动化AWS云上的交付流程,我对此这个工具非常满意。持续集成是什么? - 阮一峰的网络日志
持续集成是什么?
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。
本文简要介绍持续集成的概念和做法。
持续集成指的是,频繁地(一天多次)将代码集成到主干。
它的好处主要有两个。
(1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
(2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
Martin Fowler说过,"持续集成并不能消除Bug,而是让它们非常容易发现和改正。"
与持续集成相关的,还有两个概念,分别是持续交付和持续部署。
二、持续交付
持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
三、持续部署
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。它与持续交付的区别,可以参考下图。
根据持续集成的设计,代码从提交到生产,整个过程有以下几步。
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
4.2 测试(第一轮)
代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试有好几种。
单元测试:针对函数或模块的测试
集成测试:针对整体产品的某个功能的测试,又称功能测试
端对端测试:从用户界面直达数据库的全链路测试
第一轮至少要跑单元测试。
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下。
Jenkins和Strider是开源软件,Travis和Codeship对于开源项目可以免费使用。它们都会将构建和测试,在一次运行中执行完成。
4.4 测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有,,等。
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。
五、参考链接
Gergely Nemeth,
全球最大的 IT 咨询公司高德纳(Gartner),有一个"技术热门度曲线"模型(Gartner Hype Cycle)。
你可能听说过函数式编程(Functional programming),甚至已经使用了一段时间。
上周,《中文技术文档写作规范》加入了文件的命名规则。
很多人说,不知道怎么写文档,都是凭着感觉写。软件开发持续集成持续交付软件发布持续部署服务提供商
软件开发持续集成持续交付软件发布持续部署服务提供商能够帮助企业提高创新性、灵活性和弹性,节省资金和有效降低成本;提供针对存储、计算、联网、数据库和其他种类的基于Web的云服务,完成对用户数据、软件和计算的委托远程服务;确保企业和开发人员能够使用亚马逊云服务AWS构建出成熟可靠的有弹性可扩展的网络应用。亚马逊云服务AWS同时提供RESTful和SOAP两种接口,所以几乎所有的程序语言都可以和Amazon Cloud Services沟通完成数据的交换。
o S3 - Simple Storage Service
面向Web的独立存储服务,通过http或者https进行访问,随时可以从Web存储和检索任意的数据,并且可靠、快速和持久。
o EBS - Elastic Block Store
面向文件系统的存储服务,需要挂载到EC2上来发挥它的作用;可以在任何时刻做快照(snapshot),当需要恢复数据时,直接使用那个时间点的快照即可复原。
o EC2 - Elastic Computing Cloud
所有操作都是通过网络,用自动化的工具,实现自动根据系统的负担去增减机器。费用方面,真正达到“用多少,付多少”。
o RDS - Relational Database
不需要依赖于其他服务,通过网络服务访问,使用RDS可以减少大量的管理、备份和维护的工作。
友情链接:每天三分钟,知晓天下事,视频、语音、文字综合版任您挑!微信搜索fgzadmin关注或点击标题下方可以快速关注。
原创不易,认可价值,动手指点并转发,就是最好的支持与肯定。淘宝特约店址:http://goldengame.
深夜十点,陪你读书。
慢工出细活
由于中、美、俄三国自2008年后基本上长期上演“三国杀”(昨天文章《原创丨中美俄世纪三国杀,谁是百年长跑冠军
其实这是个有奖活动贴。n其实这是个有奖活动贴。n其实这是个有奖活动贴。
思考者正在阅读原创丨三次世界大战亚洲开打,美国推演靠谱吗?原创丨央行连出两大招,有何深意?微历史丨张学良为啥
美国总统奥巴马日在接受媒体采访时表示,2011年对利比亚局势的干涉,是其总统生涯中做出的最
我们都知道,美国软实力很厉害,在过去很多年都一直掌控者国际话语权,他们可以提着民主、自由、人权的大棒满世界乱
思考者正在阅读原创丨重大变革,我们的世界都将逃不过被TA重塑!原创丨中美黄岩岛较量,谁是最后赢家?原创丨你射

我要回帖

更多关于 持续集成 持续交付 的文章

 

随机推荐