什么是Cruise?其工作方式是怎样的?——Cruise 101 (1)

Cruise是什么?为什么要构建Cruise?


自Thoughtworks创建了CruiseControl(第一个开源持续集成服务器)近十年以来,我们的咨询师一直在帮助我们的客户进行持续集成的实践。经过十余年的积累,在构建及部署管理以及快速、高质量且低风险的交付与发布管理方面,我们积累并总结了很多理论原则与实践,而我们将这些理论原则与最佳实践溶为了一体,研发了Cruise(持续集成和发布管理系统),使用Cruise可以帮助开发团队快速,频繁的发布经过测试的新功能。通过降低发布复杂应用的风险和花费, Cruise将开发团队解放出来,令他们专注在最有价值的工作上。Cruise于2008年7月份推出了V1.0,当前的最高版本是V1.2。

ThoughtWorks Studios是我们的产品部门,其建立目的是将敏捷开发商务模式提高到新水平。通过交付300多个关键性业务的项目ThoughtWorks积累了丰富的经验,Studios致力于使全球分布式软件开发团队持续并快速交付商业价值成为可能。Cruise仅是Studios发布的产品之一,还有其它两款工具,分别是Mingle——敏捷项目管理工具,TWIST——新一代自动化测试工具。

 

Cruise是如何工作的?


Cruise天生就是一个包括Server和多个Agent的分布式系统。Server是整个系统的神经中枢,负责分派工作,保存构建结果与产物,而Agent主要用于执行Server分发下来的工作(Job,你暂时可以理解为一个构建任务),并将结果汇报给Server。如下图所示。
  什么是Cruise?其工作方式是怎样的?——Cruise 101 (1)_第1张图片
Cruise的安装
目前,Cruise需要同时安装Server和至少一个Agent,才能真正开始工作。我们下面以Ubuntu8.04为例安装Cruise1.2。
安装前的准备工作
  1. 在Studios网站注册后,分别下载Server和Agent的deb安装包(cruise-server-1.2-????.deb 和cruise-agent-1.2-????.deb)。
  2. 在注册使用的邮箱中得到License。(免费版本最多支持两个Agent,有效期为一年。一年过后,您还可以发邮件再次申请免费版本的License)。
  3. 确定在Ubuntu8.04上安装有JAVA JRE1.6,如果你的项目是JAVA项目,你还需要JDK1.6。
安装过程
  • 安装Server
    • run 'sudo dpkg -i cruise-server-1.2-????.deb'
    • 当命令结束几分钟后,访问http://localhost:8153/cruise,你就可以看到License页面
    • 将你收到的License拷贝粘贴到页面中并保存,你可以看到更新成功的提示。
    • 点击“Current Activity” 标签后,需要你至少添加一个Pipeline。
  • 安装Agent
    • run 'sudo dpkg -i cruise-agent-1.2.-????.deb'
    • 当命令结束几分钟后,在浏览器上点击 “Agent”标签,你会发现这个本地的Agent已经自动注册到了Server上。
安装完成了,你的巡航可以开始啦!

Cruise中的几个主要概念

 通常情况下,我们的软件开发及发布过程如下图所示:

 
而Cruise正是基于这一点,通过构建管道 (Pipeline),构建阶段(Stage),构建工作(Job)等基本概念,将持续集成与发布管理联系在一起,并融于Cruise的领域模型当中,如下图所示:
什么是Cruise?其工作方式是怎样的?——Cruise 101 (1)_第2张图片
一、Pipeline(构建管道)

众所周知,Cruise引入了Pipeline的概念,但它到底是什么呢?说来简单,一个代码集内,所有代码从编译开始直到达成客户的最终目标所要经历的过程就可以被看作一个Pipeline。

举例来说,假如某项目组正在开发一个J2EE的WEB应用,而这个应用是在一套本公司内部已开发好且相对稳定的 公共组件及接口(以下称为 A)为基础,根据用户定制的 实际业务需求(以下称其为 B)来完成的,那么,其中的公共组件及接口可以被看作是一个Pipeline(以下称为 PA),而那些因业务需求而开发的代码可以看作是另一个Pipeline(以下称为 PB)。对于 A的 任何改动都需要经过编译、自动化的单元测试、功能测试(可能还会的其它类型的测试),最终发布某个新的稳定版本,而对于B的任何改动或与A的新版本集成, 使B都需要经过编译、自动化的单元测试、功能测试(可能还会的其它类型的测试),最终发布部署到客户现场,上线运行。这两个过程就象两个管道,任何代码的 变化,都会(也应该)通过这两个管道,合格的代码会从管道的另一端变为成品,而不合格的代码就会卡在管道的某一个点上。

简单一句话:Pipeline就是软件开发与部署生命周期的体现。

二、Stage(“构建阶段”)


简单来说,Stage就是存在于Pipeline之内的,一组Job(构建集成工作)的集合。

举例来说(继续用上例),在PA中,单元测试需要运行10分钟,而功能测试要运行30分钟,端到端的部署需要10分钟,端到端的测试要运行50分钟,测试人 员的探索性测试不能定时,编译发布需要3分钟。在实际工作中,很难让开发人员等到所有测试都运行完后再继续开发。此时可用多个Stage来表示这一工作流。 Cruise的用户可以将单元测试、功能测试、端到端的部署、端到端的测试、测试人员的探索性测试及编译发布分别定义成六个Stage,按顺序排列。Cruise可以在保证版本一致的前提下,使所提交的代码依次走过所有的Stage。

简单一句话:一个Pipeline中,可以有多个Stage依次被执行;每次构建的Pipeline会保持各Stage的代码运行在相同的版本号上。

三、Job(构建工作)

一个Job是存在于某个Stage之内的一个构建集成工作。

举 例来说(继续用上例),在PA中,单元测试Stage有100个测试,如果全部做为一个Job(例如 ANT all)来运行,需要10分钟。为了提高反馈速度,可以将其分成两个Job(例如 ANT component1Test 和ANT component2Test),这样的话,这两个Job就有机会并行执行啦!(如何并行,待会儿再说)

简单一句话:一个Stage中,可以有多个Job并行被执行;每个Job独立运行在Agent上面,Stage所有的Job都通过才能触发下一个Stage执行。

四、Agent(构建执行机)

一个Agent就是一个用于做某些Job的机器。

举 例来说(继续用上例),在PA中,单元测试Stage的两个Job都运行在JAVA1.5上, 使用ANT进行构建。而且,恰好有两台机器安装有JAVA1.5,那么将这两台机器安装上Cruise Agent端,并向同一个Cruise Server请求工作。只要设置好资源,那么这两个Agent就可以分别请求其中的任意一个Job来执行啦。

简单一句话:多个Agent可以注册到同一个Server上;每个Agent请求Job时,Server都会按需(资源匹配)分配工作。

五、Resource(资源)


一个Resource就是一个资源声明。

举 例来说(继续用上例),Cruise的用户将这两个Agent的Resource指定为JAVA1.5,并将PA单元测试Stage中两个Job的 Resource也指定为JAVA1.5,那么这两个Agent请求工作时,Cruise Server就会根据资源匹配规则,给它们相应的Job来执行啦。

什么是 资源匹配规则呢?如果Agent没有资源声明,则其只能分到那些没有资源要求的Job来做;没有资源要求的Job可以在任意一个Agent上来执行;有资源要求的Job一定在提供这些资源标签的 Agent上执行,而此时,该Agent上的资源标签可能会多于Job所要求的资源;如果多个Agent具有相同的资源,Server将随机将Job分配给其中某个空闲的Agent来执行。

简单一句话:一个Resource就是一个Tag;只要它们符合资源匹配规则,相应的Job就可能运行该Agent之上。

你可能感兴趣的:(什么是Cruise?其工作方式是怎样的?——Cruise 101 (1))