经过一个多月学习各类材料、做试验,以及一周左右编写、整理学习笔记的过程,入门级的CI学习也算告一段落了。说一下阶段性的心得体会吧。
先讲一下为什么这么安排学习笔记的内容吧:
在一个以项目团队为主体的开发环境中(需要对团队成员进行适度的管理,所以有了《学习笔记9》),首先要搭建好CI的实施环境(《学习笔记2&3:工具选择和环境搭建》),并在持续集成高效地、自动化地工作(《学习笔记4&5&6:持续集成自动化系列》)帮助下,产生两个主要成果:
1、提供给用户使用的软件/WEB产品。产品的(生成、发布、回溯)管理工作需要的一个重要线索就是版本号(所以有《学习笔记8:版本号的管理》)
2、项目设计、开发时产生的必要文档。这些文档通过公司内部技术网站的形式(maven site)进行展示(《学习笔记7:maven项目站点管理》)
一、学习和使用CI的视角
回到最初的CI过程图:
我们可以看出,相关工作是环环相扣的,所以必须以系统化的视角去学习:不能只单独使用个别工具,而是要琢磨如何在将这些工具如何相互配合使用。笔者总结了学习和使用CI的几个原则,即所谓的“四化”建设:
(一)、学习:系统化
系统化自然不用多说,学习时当然不能只看局部,不见整体。不过CI涉及的工具比较杂,刚上手时很容易陷入到某个单独工具的学习中无法自拔,但不久就会发现有很多问题只靠单个工具是无法解决的。所以需要调整学习方向,从纵向深入化的学习方式向横向联系化的学习方式转变。
所以,所谓的“系统化”,就是学习时不应该只把精力放到某个局部,而是想办法看一下不同工具的使用之间是否有关联,怎么互相配合来解决问题。
(二)操作:整合化
所谓整合化,其实也是系统化。只不过方向是思想层面的东西,操作是执行层面的东西而已。笔者为了凑够“四化”之数,硬生生将其从系统化中拆分出来。
在实际工作中,是先遇到问题,再想办法用不同工具解决。所以对CI管理者的实践工作来说,出发点不是要用哪个工具,而是先搞清楚这个问题涉及到那些工具。
主要思路:
1、分析要解决的问题,分解其可能涉及到的各类内容。
比如版本号的自动生成问题,就可以分解为:源代码所在地,取出源代码、产品发布、自动化实施等各类问题,然后看一下应由哪个工具解决。
2、找到连接各工具之间的辅助工具,这个辅助工具实际上就是第三方插件。
如版本发布方面,通过maven-release-plugin将SVN和maven连接起来,通过maven –plugin将Jenkins和maven连接起来。
(三)应用:过程化
所谓过程化,就是针对就是将CI应用到ALM中。虽然,通过开源的CI工具,很难象Rational Rose这样的商业化软件,能够覆盖到软件产品开发的整个生命周期,但也多多少少会给各阶段带来一些帮助。
从需求分析阶段开始就可以进行持续集成相关工作。持续集成覆盖需求分析、设计、开发、测试、安装部署所有阶段。这里列出笔者能想到的、各阶段与CI相关的工作:
1、 需求分析阶段:
l 生成项目的maven站点,加入项目基本信息和需求分析相关文档
2、 系统设计阶段
l 向maven站点加入系统设计相关文档(功能设计、数据库设计等)
l CI准备工作:确定项目的目录结构;生成SVN仓库;编写POM文件;在Jenkins上新建job
3、 开发、测试阶段:
l 程序员使用TDD开发方式,周期性提交源代码
l CI自动进行代码编译、单元测试,在maven站点自动生成相应运行报告
l 测试人员可以随时进行产品新版本的界面测试
l 需求分析、设计文档如发生变化,也及时提交至maven站点
4、 安装部署阶段:
l 根据开发、测试结果,随时进行阶段性的自动(远程)部署(war/ear等文件)
5、 项目收尾阶段:
l 源代码存档:从SVN仓库中checkout项目各版本的源代码
l 项目文档存档:(如果对设计文档进行了SVN管理)从SVN仓库中checkout文档;备份maven站点
(四)运行:自动化
自动化的重要性不必多说。尽量把非CI人员的手工工作压缩在三方面:编写设计文档、编写源代码、点击“更新”和“提交”键,而极力把其他工作交给机器自动化运行。没有自动化, CI的实际执行效率就会大大缩水。
二、再谈CI的好处
从公司管理或项目管理的角度看,通过持续集成可以达到若干个目的。而其中,团队工作则是笔者最为看重的。
1、项目文档得到管理
ü 可以实现源代码、项目设计文档等文档的备份和版本控制
ü 结合Maven site,我们可以及时向团队成员展示最新的项目文档
说明:虽然针对开发人员来说,一个项目开发完了,可能一辈子都不会再接触这个项目的源代码或文档了。但对公司来说,极可能需要进行产品维护和升级工作,所以文档的保管是极其重要的。全面的文档也帮助后续的维护人员缩短学习时间,实际上减少了维护和升级成本
2、软件开发质量提高、总体成本降低
ü 代码集成能够以较短的时间间隔自动进行,可以及时暴露问题,从而快速修正
ü 使得可以及时向客户展示可用成果
ü 降低总体工作时间:软件质量的提高减少后续维护工作量,软件升级开发变得相对容易
ü 降低总成本:持续集成相关软件多数开源,基本免费。需要增加的是人员学习成本(员工其实可以自学),或者增加CI配置人员的成本,但与原来的开发、升级、维护等成本之和相比,总体成本仍然降低了
3、团队工作、管理效率提升
ü 程序员摆脱了人工管理集成,至少不需要为了等待收集代码而进行无聊的加班
ü 程序员可以将主要精力放至程序编制本身,相互沟通更有效率
ü 通过Maven site,新进项目组的成员可以看到项目设计文档、工作的进展状况以及已经开发好的程序究竟是什么,降低学习成本,可以更快地上手
ü 对公司老板或项目经理来说,可以追踪成员开发成果。
三、CI进阶学习方向
毕竟只是入门级的学习笔记,而且面对的是极其简单的项目,与实际项目开发仍有不小差距。但以后要面对的诸多复杂的实际问题,以及需要进阶学习的诸多方面,都可以看做是这个简单过程中某个阶段或某个知识点的深化。作者现在能看到的需要进一步深化学习的内容:
1、如何实现Linux、windows下的C/S架构的CI环境搭建
2、如何实现各子项目CI的整合
3、如何实现多语言开发项目的持续集成
4、如何自动整合其它岗位的的工作结果,比如美工、测试员等
5、如何在异地连接到本地CI服务器(硬件)
……
这就需要多重依赖、多级POM、SVN-GIT连接等诸多需要深化学习的知识点了。