技术开发 频道

“持续集成”也需要重构

  管道式持续集成——企业级持续集成的解决方案

  实际问题

  阶段化持续集成重复任务多,而过程化集成的管理复杂性太高了,任何过程化上的变化都要修改已经写好的脚本,而这些脚本维护比较困难。既然以上两种模式都不灵了,那就再想别的办法吧。

  理论基础

  管道式持续集成形式上与过程化持续集成相类似,但却在概念上有显著不同。在管道式持续集成中,所有的过程单元都运行在同一管道的上下文中,即各单元所使用的原材料都是完成相同的,即代码基线相同。当持续集成服务器发现有新的代码时,会创建新的一个管道,所有的过程单元都在这一个管道中运行。而每个单元产生的产物也在该管道中有效。如图所示:

  图6 管道化持续集成

  利弊分析

  管道式持续集成综合了阶段化与过程化的优点,而带来的复杂性却不用你操心,因为Cruise为你管理这一切。

  也就是说,你很容易就掌握,哪些产品代码是在哪个管道中生成的,是由哪些原材料(源代码)生成的,而与其它管道产生的产品代码有什么不同。在管道式中,每次构建都会试图从管道的一端走到另一端。因此,你不会遗漏任何一个版本的成功产品代码。

  解决方案

  Cruise持续集成类似于下面的持续集成构建管道:

  <pipeline name="Cruise">
     <stage name="UnitTest">
         <job name = "windows">
 <artifacts>
               <artifact src="testreport"  dest="report"/>
               <artifact src="pkg"  dest="package"/>
            </artifacts>
            <tasks>
               <ant />
            </tasks>
         </job>
         <job name="linux"/>
     </stage>
     <stage name="FuncTest">
         <job name = "windows"/>
         <job name="linux"/>
     </stage>
     <stage name="TwistTest">
         <job name = "windows"/>
         <job name="linux"/>
     </stage>
     <stage name="Package">
         <job name = "Solaris"/>
         <job name="linux"/>
     </stage>
 </pipeline>

  如图7所示,最后一次构建版本(1.2.128)从管道的一头成功走到了另一头,正在进行最后一步(部署到生产环境,黄色方块代表正在运行),版本 1.2.127失败于打包交付物,虽然我们让版本1.2.126走到了管道的尽头,但您可能注意到这是一个有暇疵的版本(Package有点问题),而且被很快在1.2.128中修复了。而其它版本都有问题而未能走到管道的尽头。

  图7 构建管道图解

0
相关文章