- 浏览: 1016412 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
在前文《分支策略(续)》 中,我们讨论了多组件应用程序的持续集成策略,即:为相对独立的组件创建自己专属的代码库,然后通过现代持续集成工具进行组件间的持续集成。Joe的团队在首次发布之后,开始使用这种方式。然而,没有多久,他们就遇到了一个问题:一次提交构建所花费的时间太长。
一天,Joe就早早地来到了办公室。因为他前一天下班前,他开发的用户故事还有一小点就完事儿了。他想利用早上这点儿时间把它搞完,交给测试人 员进行测试。他修改了某个模块的一段代码,在本地构建测试通过以后,就提交了, 然后起身去楼下买些早点。十五分钟后,他回到了电脑前,令他沮丧的是,这次构建还在进行最后的阶段,即所有模块集成测试和系统级测试。他只好又起身去冲了 杯咖啡。然后,一边看着屏幕上的构建进度条,一边喝着咖啡。七分钟后,构建终于成功结束了。虽然这是一次成功的构建,但总是觉得不爽,花了二十多分钟才做 完提交构建。于是,他开始仔细地查看起构建脚本和构建日志。
一、一次生成,多次复用
中午吃过午饭,他把Bob和Alice叫到一起,开始讨论早上他遇到的问题。
“的确是非常烦人,现在构建时间太长了。”Alice说道。
“我今天早上查看了一下我们的构建日志,发现构建时间长的原因之一是:每种测试开始之前都要更新代码,再重新编译一次。”Joe说道。
Bob提出了一个解决方案,并画在了白板上。“我们是否可以建立统一的产物库,每次构建的产物都以一定的规则放在其中?这样,后续的测试需要使用这些二进制产物的话,直接从产物库中获取即可。”(如图1所示)
“听上去不错。然而,我们是否需要把每次构建中产生的内容都放入产物库,这会非常快地吃掉我们的磁盘空间。”Alice不无担心的说。
“目前构建完成以后,所有的产物都放在那台构建机器上。我们也遇到过因构建机器硬件问题或误操作将所有重要历史信息都丢失的事情。所以,我们至 少需要备份。”Bob回答道,“另外,将每次构建的产物放在统一产物库中,我们就可以解决Joe刚才提出的重复编译问题。当然,我们需要有选择地将重要的 构建产物放到统一产物库中,而不是所有内容。通过在每次构建后增加一个上传任务,让各小组将其认为有用的信息上传到产物库,比如构建日志、测试报告、构建 后的二进制文件等。但一些临时文件就没有必要了。当然,这只能缓解产物库膨胀的速度。尽管持续构建的次数非常多,但我们并不是需要一直保持所有构建的产 物,所以,可以定期删除那么没有保留价值的构建产物,比如对那些重要构建的产物进行标记,其它的就可以删除了。”
Alice和Joe都点了点头,表示同意。但Joe的眉头马上又皱了起来。“嗯,好象这里还有点儿问题。”
“什么问题?”Alice和Bob同时问道。
Joe说道:“对于我们平台中的一些小游戏组件来说,这没有什么问题。因为它们的构建产物都不太大,网络传输带宽和速度都不是问题。但是,对于那些很大的二进制文件或测试数据来说,这么做的话,可能就有问题了。”大家都点了点头,并开始思考这个问题。
忽然,Joe叫道:“不好意思,其实这不是个真正的问题。首先,我们的测试数据变化就不频繁,原来也没有放在产物库中,而是放在了一个共享目录 中进行版本管理。所以,这部分在构建中的做法与之前没有什么不同。其次,对于较大的二进制文件,只要在需要它的构建机器上把它缓存起来。那么在下一次构建 时,构建脚本可以对这个本地版本进行验证,如果版本正确且没有被破坏(比如通过MD5验证)就可以继续使用。否则,就再从统一产品库取出正确的文件将其覆 盖就行了。”
“这么做还有一个好处,而且是非常重要的好处。”Alice补充道,“我们的手工测试版本也可以从统一的产物库中拿到,这就保证了自动化测试所 有的二进制文件与部署到手工测试环境中的二进制文件是同一个文件了,也就不会出现因重新编译时的环境不同而导致的不一致问题了。而当我们做上线部署时,也 从这个统一产品库中获取,从而做到自编译开始直到上线部署的二进制包的一致性啦。”
于是,Joe与团队一起对其持续集成平台和所有构建进行了改造,将其打造成了一个具有组织级产物库的持续集成和发布管理平台。他们不但有效地缩短了每次构建的时间,还可以轻松地通过产物库追踪到每个上线版本在代码版本控制库中的对应代码,让问题追查变得更容易了。
二、依赖管理
一个月后,根据市场的需求反馈,他们开发的一个游戏升级了,反应速度非常快,效果非常好。但引申出来的一个问题是:游戏和平台的升级频率不一 致,持续集成应该怎么做。对于Joe的团队来说,是一个非常大的问题,因为他们的开发流程严重地依赖于持续集成平台。于是,Joe和团队的核心成员打算讨 论一下,如何应对目前这种情况。
在会议室的白板前,Joe画出了当前所用的持续集成策略(如前图所示)。
Bob说道:“到目前为止,我们已经发布了几次,而且最近一次只发布了一个游戏应用。我们如何管理我们的发布流程呢?在我之前工作过的公司中, 产品会有几个版本,包括稳定版本、已对外发布或即将发布的版本、最新版本:用于公司内部测试。每当将要发布新版本时,就拉出一个分支,进行内部测试,并修 复严重的缺陷。当没有严重缺陷时,才能作为稳定版本公开发布。”
Alice答道:“对于单个的软件交付产品来说,通常可以通过“按发布拉分支” 的方式进行开发,正如我们最开始所使用的持续集成策略。但是,现在我们的游戏平台与单个交付产品不同。我们有自己的服务器集群,只要测试覆盖率及测试质量 足够好,测试速度足够快,我们就可以通过小流量试验部署后再大规模上线的方式进行发布。现在,我们的问题是由于各个游戏组件的发布频率各不相同,组件存在 依赖关系,导致很难决定在持续集成过程中,到底应该使用哪个依赖版本。尤其是我们现在还有一个公共库,被多个组件使用。”
Joe说道:“我们先梳理一下整个平台上的依赖关系吧。通常来说,软件中的依赖关系通常包括编译时依赖、测试时依赖和运行时依赖。而从依赖形式 上可以分为库依赖和组件依赖。所谓库依赖,是指依赖于那些不受控的库文件,比如我们使用了一些开源或者付费的的类库文件或工具,这些库文件的特点是更新较 慢,甚至基本不需要更新。而组件依赖是指依赖于那些由自己团队或公司内的其它团队开发的组件,这类依赖的特点是更新频率相对高,有些甚至非常频繁。对于库 文件依赖,我们可以在代码库中建立一个目录,叫做lib,并在其下建立build、test、run三个子目录,把我们所依赖的库文件放到相应的子目录 中。同时,每个库文件的文件名中最好包含它的版本号,如nunit-2.6.0.11089.bin。这样,就很容易看出依赖了哪些库文件。”
Bob接道:“可惜我们不是用Java平台,否则我们可以用象Maven 或Ivy 这样的工具来管理这些外部库依赖了。而且,同时可以在公司内部利用Artifactory或Nexus这样的开源工具建立一个内部统一服务器,专门管理公司内部所用的这些库依赖。”
Alice说道:“我们也可以自己做一个简单的依赖管理系统。比如使用Key-value的格式用文本文件来描述所用到的库文件名及版本号及存放位置,然后再写个通用脚本读取信息下载到本地使用。”
Bob接着问道:“对于这种库文件的依赖管理相对容易一些。而我们面临的重要问题好象是组件依赖管理。有什么好办法吗?”
Joe想了想,说道:“方法倒是有几个,各有优缺点。一种方法是将组件依赖转成库依赖。其适用的场景是该组件经过一段时间的开发的维护后已趋于稳定,变化 不太多。此时就可以将这个组件打包后与其它外部依赖库放在一起,并加入正确的描述,以便依赖于它的所有组件都可以正确地拿到正确的版本。还有一种方法是我 们目前所用的方法。即每个组件各自进行持续构建,然后再做集成构建。其中存在的问题是我们如何管理各组件不同版本之间的组合关系。我们一直使用的策略是无 论哪次提交,都会触发整个构建。目前要做的有两件事:一是将公共库独立出来,进行单独构建,并且一旦构建成功,自动触发那些依赖于它的其它组件构建,最后 进行集成构建。只要我们记录每次构建后的版本及源代码的 revision就行,以便可以追踪。二是将游戏平台的持续构建触发其它游戏组件的持续集成。所以,触发关系应该是这样的。”Joe拿起笔,在白板上重新 画了一下触发关系图(图2)。
Bob摇了摇头,说道:“这样还是解决不了我们之前说过的问题,即我们的发布频率不一致,如何来管理这些发布之间的关系。”
“噢,这个问题是这样的。”Joe回答道:“我认为,我们之前单独发布一个游戏组件是不对的。我们因市场压力而将该游戏组件直接部署到生产环境中,尽管在 发布前的评估认为,该游戏所依赖的平台接口没有发生变化。正确的做法有两种:(方案A)将平台作为一个整体一同发布,因为我们对平台也做了修改,当时,所 有的持续集成测试都是基于主干的最新版本所做的。(方案B)让所有游戏组件依赖于游戏平台的最新发布的稳定版本进行开发。由于平台的新功能开发较慢,所以 只要平台接口不发生变更,各游戏应用都可以基于平台的稳定发布版本进行快速更新。但只要某个游戏需要修改平台的接口,就必须与平台的最新代码进行持续集 成,并一同发布。”
Alice皱了皱眉,说道:“这么看来,对于整个软件来说,能够保持主干随时可以发布才更容易管理组件依赖。因为每当需要发布时,直接做主干发布就行了。实在不行的话,只要将所有组件在同一时间点拉出一个发布分支,然后统一上线就行了。”
Bob说道:“这样也有问题。我们的部署会很麻烦,时间可能会很长。”
Joe笑着说:“部署麻烦,我们可以通过一系统列的自动化操作来解决。部署时间长的话,我们使用的是集群部署,因此可以采用分批替换的方式来部署。但这种发布方式给我们带来的益处是可以很快的响应市场需求。”
Joe拿起杯子喝了口咖啡,接着说道:“当然,这对我们的开发工作也提出了挑战。我们必须使用多种手段才能做到主干持续可发布状态。比如(1)将新功能隐 蔽起来,直到它完成为止;(2)把所有的变更都变成一次次非常小的增量式修改,每个修改都做到可发布;(3)通过抽象达到分支的目的(Branch by Abstraction )。另外,我们的自动化测试也需要保持在较高的覆盖率,并丰富其它类型的自动化测试,比如性能测试,压力测试等。如果遇到特殊情况,我们再坐下来商量对策。”
Bob仍旧有点迟疑,“这样可能会增加我们的开发成本。不过,可以试一下,看看效果如何。”
于是,整个团队开始行动起来了。他们在这条道路上还会遇到什么情况呢?让时间来回答这个问题吧。
持续集成理论和实践的新进展
持续集成之“分支策略”(续)
持续集成之“分支策略”
发表评论
-
eclipse使用SVN创建,合并分支[转]
2011-11-11 17:11 911之前一直使用"小乌龟"进行分支建立与 ... -
持续集成理论和实践的新进展
2011-08-04 18:10 988作者: 肖鹏 来源: InfoQ 发布时间 ... -
Maven原理和Maven2新特性
2011-06-30 16:02 1044Maven的基本原理和Maven2的新特性 用Maven做项 ... -
结合Maven2进行J2EE项目构建
2011-06-29 21:13 1202一.背景 Maven2 的基本 ... -
用Maven做项目管理
2011-06-29 21:10 1034用 Maven 做项目管理 在 Java世界中我们 ... -
天生一对"Maven2+Jetty" -- Maven2创建并管理WebApp
2011-06-29 19:21 1296Maven2代比1代改进很多,其中主要强调的是--它不仅仅是个 ... -
Maven实战(四)——基于Maven的持续集成实践
2011-06-28 13:16 962Martin的《持续集成》 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-06-28 13:07 1020hudson 是一个可扩展的持续集成引擎,Hudson非常 ... -
敏捷开发、极限编程
2011-06-27 00:35 878什么是敏捷开发?一种以人为核心、迭代、循序渐进的开发方法。在敏 ... -
敏捷开发简介
2011-06-27 00:34 1193在软件工业界,敏捷开发已成为众多高效开发团队的制胜之道。它不仅 ... -
用SecureCRT连接VMware中的Linux系统
2011-06-16 22:03 1601一、预备知识: Secure: SecureCRT将S ... -
持续集成之路——Maven
2011-06-15 15:04 732写在前面 ... -
持续集成之路——Maven(续)
2011-06-15 15:02 861接上篇)在新创建了项目之后,可以看到目录结构: ... -
持续集成之路——搭建Maven私服
2011-06-15 15:01 1077在开发过程中,有时候会使用到公司内部的一些开发包,显然把这些包 ... -
Maven仓库管理-Nexus(转帖后加强版)
2011-06-15 15:00 2038前面我讲到为什么要使用Maven, Maven的安装,以及如何 ... -
maven下nexus的搭建,jar包上傳等注意事項
2011-06-15 14:58 2489nexus是用來搭建本地jar ... -
解决nexus下载maven索引的问题
2011-06-14 23:23 3171在上个周五在公司的一 ... -
Maven仓库管理-Nexus(转帖后加强版)
2011-06-14 00:50 1108前面我讲到为什么要使用Maven, Maven的安装,以及如何 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-06-08 01:04 851hudson 是一个可扩展的持 ... -
海量小文件存储
2011-06-04 16:41 2392Web2.0网站,数据内容以几何级数增长,尤其是那些小文件 ...
相关推荐
首先,搭建持续集成环境依赖于多个工具的集合,包括版本控制工具、测试驱动工具、打包工具等。在版本控制方面,Subversion是常用的版本控制工具,与传统的VSS相比,Subversion允许多人同时编辑同一文件而不会导致...
- `composer.json`:这是PHP项目依赖管理工具Composer的配置文件,用于定义项目依赖和其他元数据,如作者信息、版本等。通过Composer,开发者可以轻松安装和管理项目所需的库和框架。 - `LICENSE`:通常包含项目的...
通过阅读《敏捷实践之持续集成》的相关资料,如“持续集成.mm”、“敏捷实践之持续集成(V1.0).ppt”以及“持续集成测试.txt”,我们可以获取更多关于如何在实际项目中实施和优化持续集成策略的深入见解和案例研究...
持续集成管理平台的组成 持续集成管理平台是 software development 的一系列工具的组合,旨在提高软件开发的效率和质量。下面我们将详细介绍持续集成管理平台的组成。 源码版本管理 源码版本管理是软件开发中最...
随着软件开发流程的不断演化,持续集成(CI)已成为提高软件质量和开发效率的重要手段之一。本文将详细介绍如何利用Jenkins、Maven以及Sonar等工具搭建一套完整的持续集成框架,帮助读者理解CI的核心理念并掌握实际...
持续集成是现代软件开发中不可或缺的实践之一。通过自动化测试和快速构建,团队可以大大减少错误、加快开发速度并提高软件质量。掌握持续集成技术,对于软件开发者来说,是一项非常重要的技能。随着技术的发展和需求...
1. **持续集成**:在开发阶段,开发者频繁地将自己的代码合并到主分支,每次合并后都会自动执行编译、单元测试和代码质量检查,确保代码的正确性和健康状况。 2. **单元测试**:单元测试是持续集成的基础,它验证...
在当今的软件开发流程中,接口自动化测试和持续集成(CI)是保证产品质量和提升开发效率的重要实践。文档《接口自动化-jenkins+maven+jmeter持续集成.pdf》详细介绍了如何利用Jenkins、Maven和JMeter这三个强大的...
在实施持续集成时,需要考虑如何配置源码管理库(如Git、SVN等),使用何种持续集成工具(如Jenkins、Travis CI、GitLab CI等),以及如何执行基本构建验证测试(BVT)。BVT是指在持续集成过程中,为了验证最基本的...
构建工具如Maven自动编译、打包和依赖管理,而测试工具确保代码质量。例如,JUnit用于编写和执行Java单元测试,NUnit对应于C#。持续集成工具如Jenkins会定期触发构建和测试流程,并提供可视化的构建状态和测试报告。...
综合来看,Jenkins持续集成部署文档为软件开发团队提供了一种高效的集成和部署流程,通过其强大的自动化和可配置功能,使得软件开发周期大幅缩短,提高了开发效率和软件质量,是现代软件开发中不可或缺的工具之一。
在持续集成架构中,Maven负责项目的构建、依赖管理以及生命周期管理,使得整个构建过程更加标准化和自动化。 #### 1.3 Nexus Nexus是一款流行的仓库管理系统,可以作为Maven的私服,即内部私有仓库。在持续集成...
【持续集成与自动化测试】 持续集成(Continuous Integration, CI)是一种软件开发实践,它强调开发人员频繁地将他们的代码更改合并到主分支,通常每天至少一次。这一过程伴随着自动化构建和测试,以尽早发现和修复...
持续集成(Continuous Integration,简称CI)是一种软件开发实践,其核心思想是频繁地(一天多次)将代码集成到主干。这种做法可以尽早发现集成错误,降低集成问题带来的风险,同时缩短软件发布周期,提高软件质量。...
2. **Apache Maven 3.3.0**:构建工具,用于项目构建和依赖管理。 3. **Nexus 3.3.2-02**:私有Maven仓库,用于管理项目依赖。 4. **Jenkins**:持续集成服务器,负责构建和测试项目。 5. **VisualSVN Server 3.6.1-...
同时,持续集成和持续测试是相互依赖的,每次代码变更都应伴随着相应的测试,以确保任何改动都不会破坏系统的稳定性。 软件测试在CI/CD中扮演着至关重要的角色。无论是单元测试、集成测试还是系统测试,都是确保...
文档将Jenkins与ClearCase结合,表明了持续集成系统除了代码版本管理工具外,还需其他工具以支持不同的开发环境。 文档中提到了Jenkins的安装方式,即通过java命令运行jenkins.war文件来启动Jenkins服务。在Jenkins...