Jenkins的一些实践
Sep 11, 2011
持续集成已经是大家都非常熟悉的概念了,可以参考Martin的文章Continuous Integration .而Jenkins(原名hudson)正是业界最为流行的持续集成引擎.本文正是总结了近期工作之中一些使用jenkins的收获.
Keep the Build Fast
保持CI(持续集成服务器)上的工作快速是一个非常重要的方面, 这样才能提供快速的反馈.没有人会忍受一个构建跑上一个小时,毕竟喝上一个小时的茶或者咖啡也还是真是蛮浪费时间的. 之前的持续集成构建都得跑上半个小时,因为这个构建的代码库非常大,不止一个项目.每次构建都会按照一下顺序逐一执行: 可以看出这是一个具有完整构建阶段的流程. 但是每一个阶段都是按照顺序执行,是不是它们之间有严格的依赖了? 比如跑javascript单元测试得先跑quality检查了? Quality Check大致使用metric_fu等质量检测的工具来进行,包括检查代码复杂度,重复度, 以及jslint语法的检查等等. 这就跟javascript单元测试这个阶段没有直接的耦合.同样的也可以对其他阶段进行分析. 所以能否将每个阶段都抽取出来了作为一个独立的构建, 然后触发时每个构建都同时执行, 而不是顺序执行了? 这里我们可以使用Jenkins的一个插件Join.This plugin allows a job to be run after all the immediate downstream jobs have completed. In this way, the execution can branch out and perform many steps in parallel, and then run a final aggregation step just once after all the parallel work is finished.Join适合于"钻石"依赖型的项目. 也就是我们上面的构建流程可以转换成: 可以看到上面的几个阶段之间没有什么依赖,同时它们却都有一个聚合的阶段,便是Build Artifact. 这样的好处在于位于钻石形状上方的构建job是可以并发的执行,相比顺序执行,时间可是节省不少. 对于一个代码库融合了多个项目的情况, 另外一件可以做得事情是, 对于每个特定的阶段按照不同项目或团队划分.比如cucumber构建,它可能是包括好几个项目的features.所以每一次测试失败, 首先是难以知道是哪个项目的feature挂了, 另外一个也是非常慢. 所以可以做得是将之前单独的一个cucumber构建, 按照不同项目进行划分, 比如projectA-cucumber , projectB-cucumber 等等. 对于这种情形,另外一个可以追踪的问题便是能不能把不同项目从同一代码库中抽离出来放在独立的代码库中, 或许上面提到的问题都不存在了.