说实在话,07年最大的感悟就是重新认识了TDD和持续集成的意义,这个下次有机会再说。这次要说的是部署一个持续集成服务器。
持续集成服务器的作用其实很简单,就是check out最新的代码,然后运行指定的script,然后把结果记录下来,还可以将结果(尤其是错误的结果)通过email等手段发给程序员。
事情倒是很简单,但是我们为什么要专门的软件呢,当然你也可以自己写bash script来做这些事情,做着做着你就会发现差不多实现一个CruiseControl出来了,呵呵,无谓重复发明轮子。
常用的持续集成服务器有CruiseControl、Luntbuild 和 Anthill等,相对来说CruiseControl比较老牌,支持度也比较好,不过实际使用的时候还是觉得不太好使(最近又发现了一个软件 Hudson,Netbeans在使用)
下面是安装和配置过程,可能有一些细节不是很准确,因为已经是比较早之前安装的
从官方网站下载最新版的CruiseControl 2.7.1,我选用的是exe的版本,因为我的服务器是windows的,相对来说,exe版本有一些预设的参数,配置会简单些
运行安装程序,默认装在C:\Program Files\CruiseControl,可以不改动,而实际的项目文件可以放在其他盘上面的
安装成功之后运行cruisecontrol.bat,就能看到一个dos窗口运行,这个时候访问本机8080端口就可以看到一个示范项目
接下来修改配置文件
打开config.xml,可以看到示范例子的配置,把它都注释掉,不过其实我最后的配置也跟它差不多
直接贴我的配置吧,然后再来解释
<project name="xxx-xxx">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<bootstrappers>
<svnbootstrapper localWorkingCopy="D:/cc/${project.name}" />
</bootstrappers>
<modificationset quietperiod="30">
<svn localWorkingCopy="D:/cc/${project.name}"/>
</modificationset>
<schedule interval="300">
<ant anthome="apache-ant-1.7.0" buildfile="D:/cc/${project.name}/build.xml"
target="svnup test" />
</schedule>
<log>
<merge dir="D:/cc/${project.name}/target/testresult"/>
</log>
</project>
首先是项目的名字,这个是必须的,中途可以用${project.name}来引用
listeners是监听事件,这里加了一个构建状态监听。CruiseControl默认把构建状态保存在 logs/${project.name}/status.txt下,但是,这仅仅是成功or失败的状态,而没有具体的信息,加上这个配置的话,就能在首 页看到是否成功的显示
bootstrappers和modificationset启动监听,其实我已经分不清他们两个的具体作用了(不好意思了,以后再翻一下补上), 配置到你的项目目录中,我这里用了D:/cc/${project.name}。另外,你应该预先用svn checkout一份项目在这个位置,因为CruiseControl还要在该目录进行svn update的操作,所以这个目录的svn信息必须完整的,比如有.svn等文件,简单来说,也就是你可以在该目录成功运行“svn update”的命令
schedule里面放的是实际运行的script,很明显,我这里用了ant,调用了它的svnup和test两个target,为什么有个 svnup的东西?呵呵待会说
最后是log,这个是用来合并ant输出日志的,如果你在CruiseControl的构建页面里面没有看到任何出错的详细信息,那就可能是没有合 并日志,而ant脚本也必须配置成把相应的日志输出到设定的目录
基本的配置就是这样,这里还miss了一个ant的build.xml的内容,待会再介绍它,现在我先来说说CruiseControl的工作流程
CruiseControl通过内置的svn支持,定期检查localWorkingCopy目录的svn状态变化,然后触发构建script,但 是,这里有一点必须主意的是,CruiseControl并没有svn update的功能,他仅仅是用内置的svn支持去检查你的目录是否有更新,但是具体的更新是由你来做,于是便有了很奇怪的ant svnup的target,待会你会看到它的内容
说实在话我觉得这种模式非常奇怪。而且如果检查的频率不够的话,svnup的时候,非常有可能update了好几个changeset下来,也就是 说构建不是按照changeset分割的,仅仅是按照时间分割的
接下来就是build.xml的内容,我只列出跟CruiseControl相关的部分
<target name="test" depends="testcompile">
<junit printsummary="true" fork="true">
<classpath>
...
</classpath>
<batchtest todir="target/testresult">
<fileset dir="target/test">
<include name="**/*Test.*" />
</fileset>
</batchtest>
</junit>
</target>
<target name="svnup">
<exec executable="svn">
<arg line="up" />
</exec>
</target>
这里需要主意的是,把测试结果输出到目录,然后在 CruiseControl合并。另外一个当然是奇怪的svnup
这里有一个问题,如果你用海龟之类的svn client checkout项目,而你的机器上面没有装svn命令行的话,你可能不能使用我这个方法,需要有少少改动。其实就是用ant的svn支持来代替命令行的 svn操作,具体可以研究ant的配置手册
基本就是这样了,重启你的CruiseControl,然后提交一些changge上svn,看看有没有结果输出吧
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。