- 浏览: 851765 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zjhzwx1212:
为什么用threadLocal后,输出值是从20开始的,而定义 ...
j2ee的线程安全--threadlocal -
aeoluspu:
不错 mysql 测试部分感觉不详细
用sysbench(或者super-smack)测试mysql性能 -
nanPrivate:
有没有例子,只理论,实践起来还是不会啊
JMS可靠消息传送 -
lwclover:
一个网络工程师 装什么b
postfix 如何删除队列中的邮件 -
maimode:
我也欠缺不少啊
理想的计算机科学知识体系
http://www.iteye.com/topic/499333
在我的一篇帖子《持续集成工具的选择》中,有很多跟贴讨论持续集成是否真得那么有用或者在什么情况下有用的问题。有感与此,便又有了这篇文章。
持
续集成在目前大多数的公司里都会有这样或者那样的使用。有的会选择一些Open
Source的工具,如CruiseControl,Hudson,LuntBuild等等等等,有的会购买有更好服务,更强功能的商业产品,如
TeamCity,QuickBuild等等等等,而有的会选择自己实现,如Cron+Ant/Maven/Make等等。那么使用下来效果如何呢?真得
达到了预期的效果吗?我想来恐怕未必吧,否则也就不会有这么多的讨论了。
持续集成与敏捷编程
在敏捷领域中,测试驱动和持续集成被称为敏捷编程的两大基石,于是乎,很多人的概念里就是持续集成是为了实现敏捷编程的。这是一个错误的认识。实际 上,早于敏捷编程概念的提出,持续集成作为一个best practice就已经被很多公司采用了,只不过作为一个概念,则是由Martin大叔为了推进敏捷所倡导并由此风靡起来。持续集成本身只是一种 practice,并不被什么开发模型所限制,在任何一种开发模型中都可以采用,也可以运行得非常理想。
持续集成还是阶段集成
有很多人说,我不做持续集成,照样工作的很好。因为我们一个(小)阶段出一个版本,照样控制得非常好。我得恭喜你,首先持续集成也好,阶段集成也罢,你做了,做了就好,比没有做要好很多,也使你的项目管理上了轨道了。这两者之间的区别仅是频率而已。
那么究竟那种方式更加理想,更加符合项目的开发和管理呢?其实这个问题Steve McConnell在他那本获得Jolt大奖的书《Code Complete》(代码大全)里有过回答了。他说:对于一个微型
程
序来说,阶段式的集成或许是最佳方法。何谓微型程序,他说就是那种两三个类的程序,而你又很走运的话,那么阶段式集成就可以是你的最佳方法了。当然,这位
老兄是个老美,我们也都知道老外嘛,都比较笨一点,不会转弯一点,所以呢,他说微型程序,对于我们拥有5000年文明的中国人说,可以再扩大点吧,对于一
个小型项目,就是那种二三十个类的项目,也许使用阶段集成也不会出啥子问题吧。不过,你要真的是懒到连个阶段集成都不愿意做的话,那么你至少也该到庙里点
支香,求求佛祖保佑你的项目一切顺利。
为什么要做持续集成
很多人肯定非常不苟同我的看法,他们认为即使没有做持续集成,甚至没有做阶段集成,但是项目一样按时的完成,甚至提前完成,而且照样完成的非常理
想,老板满意,客户满意,夫复何求?而做持续集成,无非就是动不动收到一封邮件,说这个build成功了,那个build失败了,不过就是一持续编译罢
了,我自己打个命令编译一下,不就知道了吗?要做个daily build,我还要颠颠的去set
up,还要花力气去配置,效果也不见得好到什么地方去。
对于这样一些问题,我想首先我们还得搞清楚,究竟为什么我们要去做持续集成,持续
集成究竟可以给我们带来什么好处。同样在《Code Complete》里提到了,对于持续集成(在书中,Steve
McConnell使用Incremental Integration的术语)有以下几点好处:
易于定位错误。
也就是当你的持续集成失败了,说明你新加的代码或者修改的代码引起了错误,这样你很容易的就可以知道到底是谁犯了错误,可以找谁来讨论。
及早在项目里取得系统级的成果。
因为代码已经被集成起来了,所以即使整个系统还不是那么可用,但至少你和你的团队都已经可以看到它已经在那了。
改善对进度的控制。
这点非常明显,如果每天都在集成,当然每天都可以看到哪些功能可以使用,哪些功能还没有实现。如果你是程序员,你不用在汇报任务的时候说我完成了多少百分比而烦恼,而如果你是项目经理的话,那么你也不再烦恼程序员说完成了编码的50%到底是个什么概念。
改善客户关系。
理由同上。
更加充分地测试系统中的各个单元。
这也是我们常讲的Daily Build与Smoke Test相结合带来的绝大好处。
能在更短的时间里建造整个系统。
这点恐怕要你实施以后才能得出结论。就我们而言,持续集成并没有为每个项目都缩短时间,但却比没有实施时,项目更加可控,也更加有保证。
随着时间的推移,持续集成带来的更多好处,也逐渐被认识到了,比如说:
有助于项目的开发数据的收集
。比如说,项目代码量的变化,经常出错的Tests,经常出错的source code,等等。
与其它工具结合的持续代码质量改进
。如与CheckStyle, PMD, FindBugs, Fxcop等等等等的结合。
与测试工具或者框架结合的持续测试
。如与xUnit,SilkTest, LoadRunner等等的结合。
便于Code Review
。在每个build里,我们都可以知道与前一个build之间有什么改动,然后针对这些改动,我们就可以实施Code Review了。
便于开发流程的管理
。比如说,要把一个开发的build提交给测试组作测试,测完满意了,再提交到发布组去发布。
还有很多很多的其它的好处,也许你可以告诉我吧。
怎么做持续集成
持续集成有很多很多的好处。可是持续集成要做好的话,本身就有很多的讲究。从持续集成工具的选择到持续集成具体实施,每一点都可能影响到你使用持续集成的效果。持续集成不是持续编译,也不是仅仅用来发发邮件的工具而已。
工欲善其事,必先利其器。首先选择一个好的工具很重要,在我另一篇帖子《持续集成工具的选择》中,我已提到过了,这里不再多说。用下来,我觉得QuickBuild真得很不错。
工具选好了,具体怎么做呢?这个没有什么标准可以遵循,每个项目都是不一样的,我谈谈我们这里的具体过程吧。
首先,我们对编码有一些规范需要遵从,所以我们制定了一系列的FindBugs和PMD的规则用于检查代码。
其次,我们使用Cobertura作为我们的代码覆盖(code coverage)工具。
再次,我们使用JUnit作为我们的unit test工具
基于上述几点,我们编写了我们的Ant脚本,这个脚本有一系列的task,基本上就是:
compile, source code analytics, unit test, generate reports, generate javadoc, package artifacts
这个,也是Java领域中经常使用的一个完整的过程。
有
了这样一个脚本以后,我们开始配置我们的项目到QuickBuild中去,在QuickBuild中,我们配置一个configuration,然后设定
我们的SCM repository,对应于我们的ant
task,我们配置了一系列的step,用于完成整个过程。由于我们的测试需要跨平台,所以对应与同一个unit
test的task,我们使用QuickBuild的分布式的step功能,使之在不同平台上可以进行测试,这一点也是使用CI
Server的一个好处吧。
对应于这个configuration,我们配置了四个子configuration,分布是
Development Configuration, QA Configuration,Integration
Configuration和Release
Configuration。这几个configuration分别对应于我们开发过程的四个阶段,我们的每日构建都是在Development
configuration上的,所以我们配置为每日一次,而对于其它三个则不做自动的构建。因为我们是通过Promote来做的。对于
Development
Configuration,我们没有对SCM自动打Label,而对于其它的,我们则对每一个Build自动对SCM进行打Label。
有
了这些以后,开发工作开始了,我们每天的代码在下班前都提交到subversion里去,第二天,Development
Configuration就自动的编译完成了,并且发送通知给我们。我们通常会会开一个Morning
Meeting,首先我们会到在QuickBuild的页面上,看到昨天有哪些个改动,测试的状况,比如说哪些测试修正了,哪些测试还没有被修正,哪些
source code没有通过代码检查。然后我们会点到具体的报告中去分析,这些报告都可以很容易的打开source
code,我们可以直接在上面对各个改动做code review。通常这个工程耗时约30分钟结束。
经过这样开发之后一段时间,我们的功能很多
已经就绪,就可以提交给QA作test了,由于当日的构建可能失败,或者不是我们特别想给QA的,那么我们会选择之前几日的一个好的build做
Promote,这个promote就会自动触发QA Configuration去做build,QA
Configuration的build做完以后,就会发送一个邮件通知QA Lead,这封邮件里QuickBuild会把所有与上一个QA
build的changes都列出来,这样他就知道我们这个版本里增加了什么功能,修正了什么bug。
再如此经过几个迭代后,我们开发组和QA组
一致认为功能基本实现了,bug也不多了,于是就由QA的Lead做一个Promote,触发Integration
Configuration不build一个大版本交给客户,做VOC (Voice of
Customer),听却客户的意见,如果客户没有什么易见的话,那么就会在Integration
Configuration上做一个Promote到Release Configuration上去。
通过这样做,我们基本上可以很容
易的知道每一个版本之间有什么变化,甚至我们可以很容易的重新build出任何一个时间点上的版本。而且,我们基本上无需操心什么时候给SCM打什么样的
Label,因为对于我们而言,我们需要看到的只是每一个版本的build。而如果用subversion来管理的话,也许你也可以通过命令来列出在
SCM中各个版本的变化,但是如果有一天,你头昏忘记打label的话,或者打错label的话,也许要找到这个问题就不是那么容易了。又也许,你可以通
过一系列的命令来完成这里提到的所有功能,但是我是懒惰的,而且很容易做错事情,所以我觉得如果机器可以完成的话,就让机器去做吧。
这些都只是我们在持续集成上的一点实践,也许你有更好的方式,也许你有更多别的点子,那么也请告诉我吧。
还有很多很多关于持续集成的事情可以说,多到可以写一本书了,如果你有兴趣的话,我觉得那本《Continuous Integration: Improving Software Quality and Reducing Risk》的书可以好好看看,非常详细。
发表评论
-
Improving performance and scalability with DDD
2010-09-19 14:57 1075http://gojko.net/2009/06/23/imp ... -
Java EE meets Web 2.0
2010-09-19 14:56 2512http://www.ibm.com/developerwor ... -
最全面的Hibernate 性能优化技巧
2010-08-19 16:28 1189http://www.duka ... -
必备的 Java 参考资源列表
2010-03-16 11:42 1429Java™ 平台不久将迎来 ... -
CWE/SANS发布2010年25个最危险的编程错误
2010-02-26 09:05 1249http://www.infoq.com/cn/news/20 ... -
一个程序员的多年珍藏(Java&Linux)
2010-01-15 17:25 5449http://jythoner.iteye.com/blog/ ... -
Java 推荐读物与源代码阅读
2010-01-15 17:24 1140http://jythoner.iteye.com/blog/ ... -
A Spring Security ACL tutorial for PostgreSQL
2010-01-01 22:48 1542http://server.denksoft.com/word ... -
ddd using jpa
2009-12-28 10:00 1086http://www.iteye.com/topic/6540 ... -
java的ddd框架
2009-12-28 09:43 2719SpringXT是Spring框架的一个扩展用于开发riche ... -
hibernate session cache tips
2009-12-27 22:13 10071、只有当通过主键load或者get时,hibernate才不 ... -
事物tips
2009-12-27 20:27 9771、只读标志只在事务启动时应用。不启动任何事务,则只读标志被忽 ... -
常用正则表达式
2009-12-24 10:11 1023Email : /^\w+([-+.]\w+)*@\w+([- ... -
hibernate batch insert 和id策略
2009-11-17 10:40 1154在id生成策略为native的情况下,batch insert ... -
两个好用的java反编译工具
2009-11-09 09:54 901jad jd-gui -
Design Patterns in Dynamic Programming
2009-11-07 23:04 1071http://norvig.com/design-patter ... -
几个好用的开源工具
2009-11-02 14:20 1173DBDesigner4 一款开源的数据库设计、建模、维 ... -
fix tomcat memory settings
2009-10-27 16:10 969-Dorg.apache.jasper.runtime.Bod ... -
CI和maven私服
2009-10-22 18:56 1080Nexus quickbuild hudson -
异构数据库复制工具
2009-10-22 15:27 1772实现常见的数据库之间的复制: 一、 Daffodil Re ...
相关推荐
持续集成作为一种现代软件开发的最佳实践,能够极大地提高团队的效率和代码质量。希望读者能够将所学到的知识运用到实际工作中,实现更高效、更稳定的软件开发流程。 #### 附录一HELLOWORLD!与VSS 除了使用CVS作为...
总之,JavaMelody是一款强大的监控工具,集成到Spring项目中可以极大地提高我们的开发和运维效率,确保应用的稳定性和性能。通过深入理解和熟练使用JavaMelody,我们可以更好地管理和维护我们的Java Web应用程序。
11. **持续集成与部署**:对于大型项目,可能会使用Jenkins或Travis CI等工具实现自动化构建和测试,确保代码质量。 通过这个项目,开发者不仅可以学习到Android应用的基本架构和开发流程,还能深入了解如何集成...
这些IDE提供了代码编写、编译、调试等一系列功能,极大地提高了开发效率。 3. **固件下载与烧录**:在编写好程序后,需要将固件下载到开发板上。这通常通过JTAG、SWD等接口完成,可能需要用到像ST-Link、J-Link等...
在Android应用开发中,对应用行为的追踪和分析是非常重要的,这可以帮助开发者了解用户...这个例子源码是一个极好的学习资源,它不仅展示了一种集成方式,还可能包含了一些高级特性或最佳实践,值得开发者深入研究。
1. 学生学习研究:对于正在学习iOS开发的学生而言,源代码是一个极好的实践平台,能让他们亲手操作,了解如何在实际项目中运用所学知识,如用户界面设计、网络通信、数据存储等。 2. 个人学习研究:对于个人开发者...
"简单的Android地球旋转的例子"是一个很好的起点,它展示了如何利用Android的动画框架来实现3D对象(如地球)的旋转效果。让我们深入探讨这个项目的关键知识点。 首先,项目的根目录包含了几个关键文件: 1. `....
《Team Foundation Server 书籍源代码》是一份专为TFS 2013定制化的学习资源,旨在深入探讨如何利用Microsoft ...同时,这也是一个极好的学习资料,对于想要深入了解TFS的开发者和项目经理来说,无疑是一份宝贵的财富。
9. **单元测试与持续集成实例**:学习如何使用Visual Studio内置的测试工具进行单元测试,确保代码质量,并理解持续集成的概念。 10. **性能优化实例**:了解性能瓶颈的识别和优化方法,提高应用程序的运行效率。 ...
9. **持续集成与构建工具**:在Groovy项目中,可以结合Jenkins或Gradle等工具实现持续集成和自动化构建,这些工具通常也支持Groovy插件,使得整个开发流程更加顺畅。 10. **学习和社区支持**:由于Groovy与Java的...
持续集成 每次更改时,所有模板都会根据awless的最新版本进行验证和编译。 您可以使用以下方法在本地运行验证: go get github.com/wallix/awless # if needed go test -v 例子 高度可用的wordpress基础架构 ...
"易LOGO支持库之工控"是针对工业控制领域的易语言应用开发的重要资源,包含了丰富的项目实例和源代码,对于学习和实践易语言在工控领域的应用具有极高的价值。 该资源的核心是易LOGO支持库,它提供了一系列的函数和...
源码管理与持续集成/持续部署(CI/CD)是现代软件开发中的核心实践,它极大地提升了开发效率和代码质量。"ex_cicd_428-源码.rar"这个压缩包文件很可能是某个项目或课程关于CI/CD流程的实例代码。尽管没有具体的标签...
云原生架构设计强调DevOps文化,提倡开发和运维团队紧密协作,通过自动化工具实现持续集成和持续交付(CI/CD),从而加快产品上市速度。此外,服务网格如Istio等,用于管理微服务间的通信,提供服务发现、负载均衡、...
`AndroidViewAnimations` 是一个专门为安卓平台设计的开源库,它包含了多种预设的动画效果,方便开发者快速集成到自己的应用程序中。这个库提供了丰富的动画类型,使得开发者无需从零开始编写复杂的动画代码,从而...
如今,手机操作系统高度智能化,提供各种便捷服务,而电脑则通过云技术实现了数据的高效存储和处理,极大地提高了工作效率和数据安全性。同时,自动化技术的应用减少了人力和物力的投入,提升了信息收集和传递的速度...
- VC++:作为C++的集成开发环境,VC++支持MFC(Microsoft Foundation Classes),这是一套用于构建Windows应用程序的类库,极大地简化了窗口、控件等元素的创建和管理。 - 课程设计:课程设计是教学过程中的一个重要...
- **Scrum评审会议与XP实践**:在冲刺评审会议中,除了展示已完成的故事外,还可以演示通过XP的持续集成流程自动构建的软件版本。 - **Scrum回顾会议与XP实践**:在冲刺回顾会议中,团队可以讨论如何改进XP中的持续...
10. **单元测试与持续集成**:使用Visual Studio Team System进行单元测试和持续集成也是.NET开发的重要部分,源代码可能包含测试驱动开发(TDD)的实例。 通过分析和学习这些源代码,开发者能够提升对C#语言和.NET ...
Philips公司在这一领域取得了显著成就,尤其是将MCS-51系列从单片微型计算机发展为微控制器,极大地扩展了单片机的应用范围。 进入SoC阶段,单片机的设计趋势是将整个应用系统尽可能地集成在单个芯片上,这得益于微...