在上一篇项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】中我们已经讲解了如何使用TortoiseSVN和VisualSVN Server来做简单的版本控制,这一篇我们将会讲解使用CruiseControl.NET和MSBuild来搭建每日构建系统。
在第一篇项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】 中我们已经安装了CruiseControl.NET 1.4,因为我们还要用到MSBuild,所以如果你的系统没有安装Visual Studio,那么你需要首先安装Visual Studio 2005/2008,我们在这里使用的是Visual Studio 2008,准备好这些了吗?OK,我们正式开始今天的课程!
首先,我们要配置CruiseControl.NET【下面简写为CCNET】,配置完成后,我们每次提交源代码到SVN服务器后,CCNET就可以自动从SVN服务器上签出源代码,并调用MSBuild自动进行编译。我们以昨天的教程中创建的StartKit项目为实例,先看看下面的配置文件:
CCNET配置文件代码 1 <cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 2 <!--项目名称--> 3 <name>StartKit</name> 4 <!--标示类型,有多种类型。下面为默认标示,作为每次编译时生成的日志文件的名称--> 5 <labeller type="defaultlabeller"> 6 <!--前缀--> 7 <prefix>StartKit-1-</prefix> 8 <!--编译失败时是否增加--> 9 <incrementOnFailure>false</incrementOnFailure> 10 <!--格式--> 11 <labelFormat>00000</labelFormat> 12 </labeller> 13 <!--项目的WebDashboard地址,CruiseControl.NET包括二部分,一是Server用来配置项目和监视文件修改,二是WebDashboard,是一个显示项目信息及编译信息的Website--> 14 <webURL>http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx</webURL> 15 <!--触发器,包含多种,有兴趣可以查看官方文档--> 16 <triggers> 17 <!--时间间隔触发器,下面是60秒触发一次--> 18 <intervalTrigger seconds="60" /> 19 </triggers> 20 <!--如果发现修改,延迟多久开始编译,下面是2秒--> 21 <modificationDelaySeconds>2</modificationDelaySeconds> 22 <!--源代码控制系统,支持多种,有兴趣可以查看官方文档,下面采用svn--> 23 <sourcecontrol type="svn"> 24 <!--源代码在SVN服务器上的路径--> 25 <trunkUrl>http://zt.net.henu.edu.cn/svn/StartKit/StartKit/</trunkUrl> 26 <!--svn服务器所在路径,在这里就是VisualSVN Server安装目录中的bin目录下的svn.exe --> 27 <executable>C:/Program Files/VisualSVN Server/bin/svn.exe</executable> 28 <!--用来迁出源代码的用户名,svn服务器进行验证--> 29 <username>starter</username> 30 <!--用来迁出源代码的用户名对应的密码--> 31 <password>123456</password> 32 <!--web获取源代码的地址,类似于开源网站上浏览代码的那部分功能,这里的类型是trac--> 33 <!--<webUrlBuilder type="trac"> 34 <!--trac中对应项目的地址¬--> 35 <tracProjectUrl>http://svn.net.henu.edu.cn/pojects/StartKit/</tracProjectUrl> 36 <!--trac中对应项目的源代码库地址,相对于上面的路径--> 37 <tracRepositoryRoot>/StartKit</tracRepositoryRoot> 38 </webUrlBuilder>--> 39 </sourcecontrol> 40 <!--该节点用来配置具体执行那些任务--> 41 <tasks> 42 <!--msbuild任务配置,用来编译项目--> 43 <msbuild> 44 <!--MSBuild.exe的路径--> 45 <executable>C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe</executable> 46 <!--从SVN迁出的源代码的存放位置,可以不配置,下面的即为默认值 --> 47 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 48 <workingDirectory>D:Program FilesCruiseControl.NETserverStartKitWorkingDirectory</workingDirectory> 49 <!--对这个项目的监控过程的日志记录目录,可以不配置,下面的即为默认值--> 50 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 51 <artifactDirectory> D:Program FilesCruiseControl.NETserverStartKit Artifacts</artifactDirectory> 52 <!--要编译的项目名称 --> 53 <projectFile>StartKit.sln</projectFile> 54 <!-- MSBuild编译时的参数,具体参数信息可以查看MSDN上的说明--> 55 <buildArgs>/p:configuration=debug</buildArgs> 56 <!--指定日志记录模块--> 57 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 58 <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,D:Program FilesCruiseControl.NETserverThoughtWorks.CruiseControl.MsBuild.dll</logger> 59 <!--编译目标--> 60 <targets /> 61 </msbuild> 62 <!--在这里还可以添加其他的程序,比如运行测试、部署项目等等--> 63 </tasks> 64 <!--项目编译状态信息的保存位置--> 65 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 66 <state type="state" directory="D:Program FilesCruiseControl.NETserverCCState" /> 67 <!--发布和部署配置--> 68 <publishers> 69 <!--如果编译成功,那么下面的配置,会将源代码复制到指定目录HistoryVersion下,名称为版本标识(自动增长,labeller配置)的子目录下--> 70 <buildpublisher> 71 <!--源代码路径--> 72 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 73 <sourceDir> D:Program FilesCruiseControl.NETserverStartKitWorkingDirectory </sourceDir> 74 <!--编译成功后保存源代码到该目录下名称为版本标示labeller的目录中--> 75 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 76 <publishDir> D:Program FilesCruiseControl.NETserverStartKitHistoryVersion </publishDir> 77 </buildpublisher> 78 <!--该节点用来配置合并多个文件,当时有外部插件时,要把他们分别产生的输出文件合并--> 79 <merge> 80 <!--要合并的文件,合并后的信息可以显示在Web Dashboard和邮件通知里--> 81 <files> 82 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可--> 83 <file>D:Program FilesCruiseControl.NETserverStartKitWorkingDirectory esults.xml</file> 84 </files> 85 </merge> 86 <!--源代码路径--> 87 <xmllogger /> 88 <!--显示历史修改记录列表, 在Web Dashboard中可以查看--> 89 <modificationHistory /> 90 <!--所有编译信息的统计, 在Web Dashboard中可以查看--> 91 <statistics /> 92 <!--邮件通知配置,每次编译后,都会邮件通知下面配置中添加的用户--> 93 <!-- mailhost是发送邮件的主机,mailport是邮件发送端口,mailhostUsername发送邮件的邮箱用户名,mailhostPassword发送邮件的邮箱密码,from希望显示在发件人中的邮箱地址, includeDetails邮件内容是否包含详细的编译信息 --> 94 <email mailhost="smtp.qq.com" mailport="25" 95 mailhostUsername="******" mailhostPassword="******" from="******@qq.com" includeDetails="true"> 96 <!--接收邮件通知的用户 --> 97 <users> 98 <!--name是SVN服务器上存在的用户名,group是SVN服务器上存在的组,address是该用户的邮箱地址 --> 99 <user name="zt" group="StartKit" address="******1@qq.com" />100 <user name="***" group="StartKit" address="******2@qq.com" />101 <user name="***" group="StartKit" address="******3@qq.com" />102 </users>103 <!--接收邮件通知的组--> 104 <groups> 105 <!--name必须是SVN服务器上存在的组,notification是什么时候发送通知,可选有Always/Success/Change/Fixed/Failed --> 106 <group name="StartKit " notification="always" /> 107 </groups> 108 </email> 109 </publishers> 110 </project> 111 <!--可以同时添加多个项目 112 <project > 113 <name>test</name> 114 …… 115 </project> 116 --> 117 </cruisecontrol 1 <cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 2 3 <name>StartKit name> 4 5 <labeller type="defaultlabeller"> 6 7 <prefix>StartKit-1- prefix> 8 9 <incrementOnFailure>false incrementOnFailure> 10 11 <labelFormat>00000 labelFormat> 12 labeller> 13 14 <webURL>http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx webURL> 15 16 <triggers> 17 18 <intervalTrigger seconds="60" /> 19 triggers> 20 21 <modificationDelaySeconds>2 modificationDelaySeconds> 22 23 <sourcecontrol type="svn"> 24 25 <trunkUrl>http://zt.net.henu.edu.cn/svn/StartKit/StartKit/ trunkUrl> 26 27 <executable>C:/Program Files/VisualSVN Server/bin/svn.exe executable> 28 29 <username>starter username> 30 31 <password>123456 password> 32 33 35 <tracProjectUrl>http://svn.net.henu.edu.cn/pojects/StartKit/ tracProjectUrl> 36 37 <tracRepositoryRoot>/StartKit tracRepositoryRoot> 38 webUrlBuilder>--> 39 sourcecontrol> 40 41 <tasks> 42 43 <msbuild> 44 45 <executable>C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe executable> 46 47 48 <workingDirectory>D:Program FilesCruiseControl.NETserverStartKitWorkingDirectory workingDirectory> 49 50 51 <artifactDirectory> D:Program FilesCruiseControl.NETserverStartKit Artifacts artifactDirectory> 52 53 <projectFile>StartKit.sln projectFile> 54 55 <buildArgs>/p:configuration=debug buildArgs> 56 57 58 <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,D:Program FilesCruiseControl.NETserverThoughtWorks.CruiseControl.MsBuild.dll logger> 59 60 <targets /> 61 msbuild> 62 63 tasks> 64 65 66 <state type="state" directory="D:Program FilesCruiseControl.NETserverCCState" /> 67 68 <publishers> 69 70 <buildpublisher> 71 72 73 <sourceDir> D:Program FilesCruiseControl.NETserverStartKitWorkingDirectory sourceDir> 74 75 76 <publishDir> D:Program FilesCruiseControl.NETserverStartKitHistoryVersion publishDir> 77 buildpublisher> 78 79 <merge> 80 81 <files> 82 83 <file>D:Program FilesCruiseControl.NETserverStartKitWorkingDirectoryesults.xml file> 84 files> 85 merge> 86 87 <xmllogger /> 88 89 <modificationHistory /> 90 91 <statistics /> 92 93 94 <email mailhost="smtp.qq.com" mailport="25" 95 mailhostUsername="******" mailhostPassword="******" from="******@qq.com" includeDetails="true"> 96 97 <users> 98 99 <user name="zt" group="StartKit" address="******1@qq.com" />100 <user name="***" group="StartKit" address="******2@qq.com" />101 <user name="***" group="StartKit" address="******3@qq.com" />102 users>103 104 <groups> 105 106 <group name="StartKit " notification="always" /> 107 groups> 108 email> 109 publishers> 110 project> 111 117 cruisecontrol好了,我们已经对CCNET的配置文件有了大致的了解,接下来,你打开CCNET的安装路径,找到子目录server下的ccnet.config文件,把上面的配置信息Copy到ccnet.config文件中,记得把配置文件中的一些路径修改为自己的实际路径啊,修改好后,保存。这时候,检查Windows服务CruiseControl.NET Server是否启动,如果没有则启动它,启动该服务后,打开浏览在地址栏输入上面配置文件中的webUrl地址:http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx 也可以直接输入http://202.196.96.55:8080/server/ ,这里是演示地址,要根据自己的实际情况修改为正确的地址,OK,看到类似下图的效果,好了,搞定!如果你遇到了什么麻烦,请在下面留言,我一定会及时回复!点击StartKit,转入下图所示的页面:OK,到这里,我们提交更新到SVN服务器后,CCNET就会根据我们配置自动编译项目,而且我们也可以通过Web Dashboard来查看具体的编译信息了,提示如果配置了邮件发送,那么我们还可以通过邮件收到详细的编译信息,怎么样?够方便吧!其实,CCNET的功能是相当强大的,上面只是最常用的配置,其他还有很多非常好的功能。你想知道吗?那你可以在这里查看CCNET官方文档 ,实际上,你安装CCNET后,文档也已经安装到你的电脑了,在CCNET的安装目录下的webdashboard的子目录doc中就是。好了,我们今天的教程就到这里,本来我应该把如何使用CruiseControl.NET Tray来监视每次更新后的编译状态,但是今天真的太晚了,明天还要做项目,所以我明天补上,请大家见谅!补充部分:下面我简单讲一下,如何使用CruiseControl.NET Tray【以下简称CCTray】来监视每次提交后的编译状态。安装好打开CCTray后,运行CCTray程序,点击左上角的菜单File下的Settings…,如下图:点击Settings…会弹出下面的窗体:切换到Build Projects选项卡,如下图:点击Add…按钮,添加我们的CCNET服务器,如下图:输入我们的CCNET服务器后,CCNET服务器上的项目就会在右侧显示出来,如下图:选中右侧的项目后,点击OK按钮,返回CCTray打开时的界面,我们的二个项目已经添加进来了,如下图:我们在桌面的右下角的任务栏,可以看到如下图所示的图标:绿色的那个标示就是CCTray的标示,绿色表示所有的项目都通过了编译,紫红色表示至少有一个项目没有通过编译,橘黄色表示有项目正在编译,橘红色表示有项目被强制编译,显示为灰色则说明和CCNET服务器失去了链接。OK,大家可以使用CCTray实时监视提交更新后项目的编译状态了。如果大家有什么问题,欢迎和我交流!