内容提要
- 构建管道和持续集成(CI)的重要性
- Maven 3:惯例优先于配置的构建工具
- Jenkins:得到公认的CI工具
- 使用FindBugs和Checkstyle等静态代码分析工具
- Leiningen:Clojure构建工具
我们接下来要讲的故事取材于MegaCorp的真实事件,出于对当事人的保护隐去了真实姓名。故事的主角是:
- Riley,刚毕业的新人;
- Alice和Bob,两个“经验丰富”的开发老手;
- Hazel,紧张的项目经理。
时间是周五下午两点,新开发的Sally支付功能要在周末跑批前上线。
Riley:我能为上线做点什么吗?
Alice:当然,我想最后一版是Bob构建的。Bob?
Bob:是的,是我几周前用Eclipse生成的。
Riley:但现在我们都用IntelliJ了;那么,该怎么构建呢?
Bob:哦,这需要些经验!总之我们会搞定它,年轻人!
Riley:好。我没这方面的经验,但支付功能的构建应该没问题,对吧?
Alice:当然没问题。我在两周前刚创建的代码分支,其他人对代码的改动肯定还不多。
Bob:但是,实际上,你知道我们添了些泛型的修改,对不对?
[尴尬的沉默]Hazel:改完你们要经常在一起试试。这个我们强调过很多次了!
Riley:要不要我订外卖?貌似今晚我们得加班了。
Hazel:你说对了,学得挺快嘛!
Alice:实际上,我已经将订餐电话设成快速拨号状态了,这是常态!
Hazel:赶紧把它搞定!我们已经因为延迟发布和bug太多损失很多了,高管正想找机会杀鸡儆猴呢。
Alice、Bob和Riley明显没有优秀的构建和持续集成(CI)经验,但“构建和CI”究竟是什么意思?
构建和持续集成 快速和重复地为各种环境产生高质量二进制部署工件的过程。
开发团队经常谈论“构建”或“构建过程”1。就本章而言,我们在提到构建时是指遵循构建周期用构建工具将源码转化成二进制工件的过程。像Maven这种构建工具有很长的、详细的构建周期,它们中的大多数对于开发人员来说是不可见的。一个相当基础的、典型的构建周期如图12-1所示。
1 如果你的团队在谈论这些内容时或虔诚、或害怕,或话不多,那这一章就是为你准备的。
清除——>编译——>测试——>打包
图12-1 一个简化的典型构建周期
持续集成是指团队成员按照“尽早提交,经常提交”的口号频繁地集成工作成果。每个开发人员至少按天把代码提交到版本控制系统中,CI服务器会自动定期构建,以尽快检查集成错误2。CI服务器通常会在大屏幕上显示开心/悲伤的表情给团队以反馈。
2 构建时间可配置:间隔可以是几分钟,也可以在提交时触发,或在其他特定时间运行。
那么构建和CI为什么重要?本章的每一节都会强调某些独特的好处,表12-1中列出了其中最为重要的几个。
表12-1 构建和CI的主要优势
为了将源码部署到运行时环境中,需要经过构建周期将其转变成二进制工件(JAR、WAR、RAR、EAR等)。比较老的Java项目通常都使用Ant,而比较新的则使用Maven或Gradle。很多开发团队还有夜间集成构建,有些已经升级成用CI服务器定期执行构建了。3
3 合作极其默契的项目团队能让非技术队友运行构建。
警告 如果你从IDE中构建JAR文件或其他工件,那是在自找麻烦。从IDE中构建得到的不是与本地IDE设置无关的可重用构建,那简直就是埋下了祸根。作为朋友,我再怎么强调这一点都不为过:不允许你用IDE构建工件!
但大多数开发人员都觉得构建和CI不值得他们投入精力,他们觉得这个工作做起来不够爽,也得不到什么回报。构建工具和CI服务器经常是在项目一开始的时候搭起来,但很快就被遗忘了。这么多年来,我们听到过很多类似的说法:“我们为什么还要在构建和CI服务器上花时间呢?现在弄得也挺好用的。够用就好,对不对?”
我们坚信良好的构建和CI能加快编码速度,提高代码质量。跟TDD(见第11章)相结合的构建和CI意味着你可以毫无后顾之忧地快速重构。你可以把它当做在你身后默默提供支持的导师,它为你营造一个安全的环境,让你可以快速编写并大胆修改代码。
本章,我们会首先介绍Maven 3。Maven 3是一个流行(还有争议,有些开发人员挺讨厌它)的构建工具,会强迫你按照严格定义好的构建周期工作。介绍Maven 3的内容中,除了常见的Java代码,还会涉及Groovy和Scala代码的构建。
Jenkins是CI界的流行天王,可以通过多种方式配置(以插件系统的方式)持续执行构建,并产生质量指标。在学习Jenkins时,我们还会深入了解FindBugs和Checkstyle产生的代码质量指标。
在学完Maven和Jenkins之后,你应该会彻底熟悉典型的Java构建和CI流程。之后我们会重点讨论Clojure的构建工具Leiningen,完全从另一个角度看看构建和部署工具。你会看到它在提供了工业级强度的构建和部署能力的同时又如何实现了极其迅速、易用的TDD风格。
与Maven 3的相遇将开启你的构建和CI之旅!