目录html
因为懒得写,因此本段摘自阮一峰老师的博客。数据库
http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html服务器
互联网软件的开发和发布,已经造成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。ide
持续集成指的是,频繁地(一天屡次)将代码集成到主干。函数
它的好处主要有两个。工具
持续集成的目的,就是让产品能够快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干以前,必须经过自动化测试。只要有一个测试用例失败,就不能集成。单元测试
Martin Fowler说过,"持续集成并不能消除Bug,而是让它们很是容易发现和改正。"测试
与持续集成相关的,还有两个概念,分别是持续交付和持续部署。ui
持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。若是评审经过,代码就进入生产阶段。设计
持续交付能够看做持续集成的下一步。它强调的是,无论怎么更新,软件是随时随地能够交付的。
持续部署(continuous deployment)是持续交付的下一步,指的是代码经过评审之后,自动部署到生产环境。
持续部署的目标是,代码在任什么时候刻都是可部署的,能够进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。它与持续交付的区别,能够参考下图。
(图片来源)
根据持续集成的设计,代码从提交到生产,整个过程有如下几步。
提交
提交是流程的第一步,是开发者向代码仓库提交代码。全部后面的步骤都始于本地代码的一次提交(commit)。
测试(第一轮)
代码仓库对commit操做配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。测试有好几种。
第一轮至少要跑单元测试。
构建
经过第一轮测试,代码就能够合并进主干,就算能够交付了。交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为能够运行的实际代码,好比安装依赖,配置各类资源(样式表、JS脚本、图片)等等。经常使用的构建工具以下。
Jenkins和Strider是开源软件,Travis和Codeship对于开源项目能够无偿使用。它们都会将构建和测试,在一次运行中执行完成。
测试(第二轮)
构建完成,就要进行第二轮测试。若是第一轮已经涵盖了全部测试内容,第二轮能够省略,固然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要作端对端测试。全部测试以自动化为主,少数没法自动化的测试用例,就要人工跑。
须要强调的是,新版本的每个更新点都必须测试到。若是测试的覆盖率不高,进入后面的部署阶段后,极可能会出现严重的问题。
部署
经过了第二轮测试,当前代码就是一个能够直接部署的版本(artifact)。将这个版本的全部文件打包( tar filename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号连接(symlink)指向这个目录,而后从新启动应用。这方面的部署工具备Ansible,Chef,Puppet等。
回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的作法就是修改一下符号连接,指向上一个版本的目录。
如今,当咱们在本地(开发环境)开发好一个项目(一般也是这么干的!),而后手动打包,再手动部署到远程(线上环境)的服务器(云服务或者自建的服务器)。
当发生一些错误信息的时候,咱们再手动的恢复项目,查看错误日志等.......
当项目愈来愈大,协做者愈来愈多......你们的代码合并到一块儿,其中会发生不少意想不到的事情.......
这些重复且凌乱的事情,时刻困扰着咱们。
如今,有了Jenkins,一切就变得不同了!
Jenkins['dʒeŋkinz'
]是一个开源项目,是基于Java开发的集成工具。Jenkins是一款开源CI&CD软件,用于自动化各类任务,包括构建、测试和部署软件.
Jenkins支持各类运行方式,可经过系统包,Docker或者经过一个独立的Java程序。
see also:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html