Continuum Continuum 入门--实例

liuxue.gu@hotmail.com · 2009年03月10日 · 26 次阅读

本文虽然是 Continuum 的入门,但并不涉及 Continuum 的历史、下载与安装,这些内容可以到 Continuum 的官方网站 (http://maven.apache.org/continuum/) 上了解。本文主要是以一个实例来阐述使用 Continuum 的基本方法,而其中将使用的 Maven 工程是《Maven 入门 -- 概念与实例》中的实例(该文末有下载链接)。 [size=12pt] 注:转载时请注明原作者 (jiangshachina) 及出处 ([url=http://www.blogjava.net/jiangshachinahttp://www.blogjava.net/jiangshachina[/url)!]

[b] 1 使用持续集成的好处 [/b] [b] 1.1 较早提交,经常提交 [/b] 当开发者有规律性地提交文件时,持续集成将是最高效的。这就是意味着,不能提交不完全的代码,而是保持每次的改动不大,并且有很好的测试。这就可以更好地发现代码中的错误。 [b] 1.2 尽可能频繁的构建 [/b] 频繁的 Build 可能要受到需要进行 Build 的工作量,以及进行 Build 工作的机器的性能的影响。但频繁的 Build 确实可以在开发人员转移注意力之前,尽可能早的发现错误。任何时候,任何一个提交的发生,Continuum 都可以触发一个 Build 工作。这就意味着,这些 Build 工作应该更快,对于大量的 Build 工作或性能测试 [b] 1.3 创建一个稳定的环境 [/b] 如果该 Build 不是其它开发,测试或产品环境中的一员,那么就可以避免定制 JDK 或其它的本地设置。如果在持续集成环境中,一个 Build 工作失败了,它会被从引起它的原因的修改中隔离出来,可以独立于运行环境来被使用。 [b] 1.4 运行干净的构建 [/b] 快速、重复地构建是十分有用的,同样重要的是,不会由于旧的 Build 状态而发生失败的 Build 工作。有规律的考虑问题,就能得到干净的构建。Continuum 默认就是进行干净的 Build 工作,未来它还可以允许开发者根据所选的时间表去请求一个初始的 checkout。 [b] 2 实例 [/b] [b] 2.1 构想 [/b] 本实例中需要持续集成的 Maven 工程是 [b]《Maven 入门 -- 概念与实例》[/b] 中的 Demo。使用的 SCM 是 Subversion,即假定已经安装好了 Subversion 服务器和命令行客户端。我们的目标是使用 Continuum 对 Maven 工程 demo(包括它的子工程)进行定时的持续集成。在本文的环境中有如下路径: [color=#0000ff][i] Continuum_Home =D:\continuum [i] SVN_Repoitory =E:\svn-repo\repository [i] Maven_Demo =D:\maven\demo [i] Continuum_Maven =D:\maven\continuum // 该目录存放从 Subversion 下载的 Maven Demo 工程 [b] 2.2 初始化 Subversion 仓库 [/b] 生成仓库:[color=#0000ff] svnadmin create [i] SVN_Repository
将 Maven_Demo 中的文件导入到仓库: [color=#0000ff] svn import Maven_Demo file:///[i] SVN_Repoitory /demo -m "initial import demo" 重新下载仓库中的文件 (在目录 Continuum_Maven 中运行如下命令): [color=#0000ff] svn checkout file:///[i] SVN_Repoitory /demo demo [b] 2.3 启动 Continuum[/b] 假设此时已经安装了 Continuum,但还没有运行它。要运行 Continuum,可以双击 [color=#0000ff][i] Continuum_Home \bin\win32\run.bat 文件。对于第一次运行,会报一些错误: [size=13px] …… WARN RDBMS - Error initialising derby schema : Schema 'SA' does not exist ERROR 42Y07: Schema 'SA' does not exist ……
这种情况是正常的,因为 Continuum 后台使用的是 Apache Derby 数据库,在第一次运行之前,Continuum 所需要的一些表和数据并不存在。但 Continuum 会初始化这些数据,当第 2 次启动 Continuum 时,这些错误就不会出现了。 Continuum 服务器默认使用 8080 端口,如果之前该端口已被占用了,那么启动将失败。为了解决这个问题,我们需要修改 jar 文件 [color=#0000ff][i] Continuum_Home \apps\continuum-plexus-application-1.0.3.jar 中的 [color=#0000ff]\conf\application.xml 文件。在该文件中查找 [b] 8080/b,将改它为你所指定的端口值,本文是使用 [b] 8081[/b]。经过上述过程后,Continuum 服务器应该就可以正常启动了。下面将讨论 Continuum 的初始化配置。 [b] 2.4 初始化配置 [/b] 在浏览器中使用地址 [color=#0000ff][url=http://localhost:8081/continuumhttp://localhost:8081/continuum[/url]] 登录 Continuum 控制台界面,如下图所示。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum01.gif/img][ 第一次登录 Continuum 后,需要进行一些配置。主要包括用户名/密码,工作区目录,Build 输出目录以及公司信息。主要参数值如下所示: [color=#0000ff] Working Directory=D:\continuum\workspace Build Output Directory=D:\continuum\workspace\output Base URL=http://localhost:8081/continuum/servlet/continuum // 这里的 Company 信息就借用此 Blog 站点的信息吧 _ Company Name=BlogJava Company Logo=http://www.blogjava.net/images/logo.gif Company URL=http://www.blogjava.net/
提交之后会出现如下画面(能够看到 BlogJava 的 logo 吗 _) [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum02.gif/img][ 使用初始配置时设置的用户名及密码,就可以登录 Continuum 控制台了。 [b] 2.5 修改 POM 文件 [/b] 在目录 [i] Continuum_Maven 中执行如下命令,将 Maven 工程 demo 重新下载一次 [color=#0000ff] svn checkout file:///[i] SVN_Repository /demo demo 为了能被 Continuum 使用,且能与 Subversion 进行配合,需要对原来 Maven 工程中的 POM 文件进行修改。在每个 POM 中加入如下形式的语句: [size=13px][color=#00ff]< project [color=#00ff]>
…… [color=#00ff]< ciManagement [color=#00ff]> [color=#00ff]< system [color=#00ff]> Continuum [color=#00ff]</ system [color=#00ff]> [color=#00ff]< url [color=#00ff]> http://localhost:8081/continuum/servlet/continuum [color=#00ff]</ url [color=#00ff]> [color=#00ff]< notifiers [color=#00ff]> [color=#00ff]< notifier [color=#00ff]> [color=#00ff]< type [color=#00ff]> mail [color=#00ff]</ type [color=#00ff]> [color=#00ff]< address [color=#00ff]> jiangshachina@163.com [color=#00ff]</ address [color=#00ff]> [color=#00ff]</ notifier [color=#00ff]> [color=#00ff]</ notifiers [color=#00ff]> [color=#00ff]</ ciManagement [color=#00ff]> [color=#00ff]< scm [color=#00ff]> [color=#00ff]< connection [color=#00ff]> scm:svn:file://localhost/[i] SVN_Repository /[i] ProjectName [color=#00ff]</ connection [color=#00ff]> [color=#00ff]</ scm [color=#00ff]>
…… [color=#00ff]</ project [color=#00ff]>
其中 [i] ProjectName 要与 POM 当前所在工程名一致,如对于 demo 目录中的 POM,[i] ProjectName 就是 demo。这三个文件修改完毕之后,将它们都提交到 Subversion 服务器中,在 [b] 各个 POM 的当前目录 [/b] 下执行命令: [color=#0000ff] svn commit pom.xml -m "my settings" 为了每个工程都可以被单独地运行,需要将整个 demo 及其子工程都安装到 Maven 仓库中,仅需要在 [b][i] Maven_Demo [/b] [b] 目录 [/b] 下执行命令: [color=#0000ff] mvn install [b] 2.6 添加 Maven 工程 [/b] 登录到 Continuum 控制台后,点击左边 “Add Project” 组中的 “Maven 2.0+Project”。添加 Maven2 工程有两种情况:输入 POM 文件的 URL;直接上传 POM 文件。前者适用于任何 Maven 工程;后者只能适用于没有 module,即无子工程的 Maven 工程。由于本文使用的 Maven 工程 demo 中有两个子工程,所以只能使用前一种方法。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum03.gif/img][ 只需要加载顶层工程的 POM 文件,Continuum 会自动加载其它 moudel 的 POM 文件。如上图所示,在 M2 POM Url 中输入:[color=#0000ff] file:///D:/maven/continuum/Demo/pom.xml 提交之后会看到如下的画面,即表示 Maven 工程已经被正确地加载到 Continuum 中了。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum04.gif/img][ 加载工程时,Continuum 会将这些工程分别下载到 [b] Working Directory[/b](见 2.4 节)中,并在 [b] Build Output Directory[/b](见 2.4 节)中为每个工程 生成一个输出目录(开始只有一些 log 文件)。细心的朋友可能会发现,当上述工作完成之后,子工程 “CE Maven Demo – App” 和 “CEMaven Demo – WebApp” 的 Build 状态仍然是 “QueuedBuild”。其实这是 Continuum 的一个 Bug! Continnum 在许多情况下不会自动刷新页面,需要手动刷新,即点击 “Showprojects” 按钮。[b] 但请不要使用浏览器中的 refresh 按钮,这样可能会重新提交你的请求。[/b][i] 这个 Bug 将在 Continuum1.1 中被修复 。当页面刷新之后,App 和 WebApp 的 Build 状态将与 Demo 工程一致。 [b] 2.7 第一次 Build[/b] 要 Build 任何一个 Maven 工程都十分简单,只需要点击某个工程右边 “BuildNow” 按钮就可以 Build 该工程了。如我们点击 demo 工程对应的 “BuildNow” 按钮,那么 Continuum 将按照 demo 中的 POM 文件执行 Build 工作。当 Build 完成后,可以显示本次 Build 的结果状态:成功,失败或错误 (但请随时手动刷新页面^_^)。而 Build 次数也将从 0 改变为 1。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum09.gif/img][ 点击上图表格中的列 “Build” 中的数字,将可以看到本次 Build 的详细过程,如下图所示。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/continuum10.gif/img][ [b] 2.8 设置时间表 [/b] 前面已经谈过,持续集成就需要进行有规律的 Build。即需要建立一个时间表,让持续集成服务器按照这个表进行 Build。Continuum 默认的时间表为:每天的每一个整点进行一次 Build,即每天每隔一小时 Build 一次。我们也可以建立自己的时间表。点击 Administration 组中的 “Schedules” 按钮就可以发现当前默认使用的时间表,再点击 “Add” 按钮就可以添加新的时间表了,如下图所示。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum06.gif/img][ 这些参数项中最关键的是 CronExpression,它定义了 Continuum 执行 Build 的时间规则,它的语法规则请见参加资源 [4]。上图中规定的时间表是:在每天的 14:00-14:59 之间,每分钟都要进行一次 Build。勾选上 Enable 复选框之后,再提交,该 Schedule 就可以被使用了。 为了使用新建的 Schedule,我们需要进入工程视图页面。点击 “Show Projects”-->工程名 (如 CE Maven Demo),就可以看到该工程的详细信息,如下图所示。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum07.gif/img][ 在工程视图的 BuildDefinitions 项的 Goals 中可以发现,使用的 Schedule 就是 “DEFAULT_SCHEDULE” 时间表。再点击 “Add” 按钮,并在 Schedule 下拉列表框中,请选择刚刚新建的 “My First Schedule” 时间表 (如下图所示),最后再提交后,新的时间表将被采用。 [img=550,400]http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum08.gif/img][ [b] 4 小结 [/b] 根据前面的描述,应该可以对 Continuum 的使用有些感性上的认识了。由于 Continuum 是 Maven 的子项目,它内置支持 Maven2,所以能够与 Maven 进行良好的集成使用。现时,Continuum 也能够支持 Ant 与 Shell 脚本工程。使用 Continuum+Maven,能够对工程进行干净与频繁的集成,可以提高 Build 效率并能促进工程的健康发展。 [b] 5 参数资源 [/b] [1] Continuum 官方网站. [url=http://maven.apache.org/continuum/http://maven.apache.org/continuum/[/url]] [2] Continuum 的参考文档. [url=http://maven.apache.org/continuum/guides/index.htmlhttp://maven.apache.org/continuum/guides/index.html[/url]] [3] Better Build with Maven. [url=http://www.mergere.com/m2book_download.jsphttp://www.mergere.com/m2book_download.jsp[/url]] [4] Cron Expression 语法规则. [url=http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.htmlhttp://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html[/url]]

暂无回复。
需要 登录 后方可回复。