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