持续集成cruisecontrol.net学习总结
时间:2011-04-01 来源:子夜
1、什么是持续集成及相关工具
大师Martin Fowler对持续集成是这样定义的:
持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少
集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,
发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少
集成的问题,让团队能够更快的开发内聚的软件。
一些原则:
1. 所有的开发人员需要在本地机器上做本地构建,然后再提交的版本控制库中,从而确保他
们的变更不会导致持续集成失败。
2. 开发人员每天至少向版本控制库中提交一次代码。
3. 开发人员每天至少需要从版本控制库中更新一次代码到本地机器。
4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构建。
5. 每次构建都要100%通过。
6. 每次构建都可以生成可发布的产品。
7. 修复失败的构建是优先级最高的事情。
持续集成工具:
主要有cruisecontrol.net(开源)和vsts(微软)
cc.net说明:
它是cruisecontrol的.net版本。本软件开源免费。
它只是一个持续集成中的一个架构性软件。它要和其它相关软件结合使用才能发挥作用。
如版本管理工具svn、编译工具msbuild、代码检查工具fxCop、单元测试工具nuit.net
cc.net负责把这些工具串连起来共同作用。
2、安装
cc.net 分服务器软件和客户端软件
环境:
服务器端:
安装.net FrameWork:具体版本根据cc.net的版本而定。
安装IIS:cc.net包含WEB应用
环境很重要,我就吃了这个苦头,一开始照着其他人的方法,就是执行不了,原来是我公司的
机器的环境有些问题,没装iis。后来装了iis,iis还是有问题,没有办法,只好用自己的笔
记本重新安装了环境。
安装顺序:IIS->.NET->others
首先安装IIS,用测试页面检测IIS无误后,安装VS2005,然后再安装cruisecontrol.net,从
控制面板进入IIS控制界 面。检查有无名为ccnet的虚拟目录,如果有正常,右键浏览,应该
可以看到cruisecontrol.net的default页面。
环境很重要,我就吃了这个苦头,一开始照着其他人的方法,就是执行不了,原来是我公司的
机器的环境有些问题,没装iis。后来装了iis,iis还是有问题,没有办法,只好用自己的笔
记本重新安装了环境。
安装顺序:IIS->.NET->others
首先安装IIS,用测试页面检测IIS无误后,安装VS2005,然后再安装cruisecontrol.net,从
控制面板进入IIS控制界 面。检查有无名为ccnet的虚拟目录,如果有正常,右键浏览,应该
可以看到cruisecontrol.net的default页面。
客户端:
安装.net FrameWork:具体版本根据cc.net的版本而定。
然后安装CruiseControl.NET Tray【以下简称CCTray】来监视每次提交后的编译状态。
CCTray是一个工具,通过它可以强制执行编译,当然也可以自动编译,然后查看编译的结果。
在服务中找到【cruisecontrol.net server】这项,并启动他。
注意:如果想用浏览器查看cruisecontrol界面,必须关闭迅雷等占用8080端口的程序。
3、配置(CruiseControl.Net+SVN+MSBuild自动编译环境)
配置CruiseControl.NET安装目录下(我的机器上是:C:\Program
Files\CruiseControl.NET\server)下的ccnet.config文件,此文件是指定
cruisecontrol.net 怎么运行的,文件中是有关于cruisecontrol.net 的配置。
注意:每次改动了ccnet.config文件的话,都要重启【cruisecontrol.net server】服务。
我使用的版本管理器是SVN 1.63 ,编译工具是MSBuild 2010,代码检查工具FXCop1.35,
我写了一个最简单的:
<cruisecontrol>
<project name="Painter">
<triggers>
<intervalTrigger seconds="10"/>
</triggers>
<webURL>http://127.0.0.1/ccnet</webURL>
<artifactDirectory>f:</artifactDirectory>
<sourcecontrol type="svn" autoGetSource="true">
<executable>C:\Program Files\Subversion\bin\svn.exe</executable>
<username>liuli</username>
<password>liuli</password>
<trunkUrl>svn://192.168.1.100/reponsity/</trunkUrl>
<workingDirectory>d:\tmp\</workingDirectory>
</sourcecontrol>
<tasks>
<msbuild>
<executable>C:\windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
<workingDirectory>D:\tmp\build</workingDirectory>
<projectFile>Painter.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug</buildArgs>
<timeout>15</timeout>
</msbuild>
</tasks>
</project>
</cruisecontrol>
说明:
<project>项目节点,支持多个项目
<sourcecontrol></sourcecontrol>之间写的是从服务器上获得代码的过程,具体指定使用的
是哪种源代码管理工具。
<triggers> </triggers>是触发器。
这两个加起来的作用是:每个10秒中检测服务器上代码是否有改动,如果有,则更新文件到客
户端。
<tasks>是任务
<msbuild>是要进行编译的任务,msbuild还有发布的功能,后面的例子中会有说明
我的项目配置说明:
我有两个项目进行持续集成。一个test web应用,一个解决方案内有多个子项目。
要求:每个项目能够自动从源代码管理器svn中获取最新代码,然后进行编译,进行代码检查
,最后进行发布。
配置文件如下:
<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
<project name="TestSystem" queuePriority="0">
<workingDirectory>C:\DailyBuild</workingDirectory>
<artifactDirectory>C:\DailyBuild\log\buildlogs</artifactDirectory>
<webURL>http://192.168.0.151/ccnet/server/local/project/TestSystem/ViewProjectRepo
rt.aspx</webURL>
<modificationDelaySeconds>2</modificationDelaySeconds>
<sourcecontrol type="svn">
<trunkUrl>http://192.168.0.151:8080/svn/test</trunkUrl>
<workingDirectory>C:\DailyBuild\test</workingDirectory>
<executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
<username>admin</username>
<password>123456</password>
<autoGetSource>True</autoGetSource>
</sourcecontrol>
<triggers>
<intervalTrigger name="myTriger" seconds="6000"
buildCondition="IfModificationExists" />
</triggers>
<tasks>
<msbuild>
<executable>C:\windows\Microsoft.NET\Framework\v4.0.30319
\MSBuild.exe</executable>
<workingDirectory>C:\DailyBuild\test</workingDirectory>
<projectFile>WebApplication2.csproj</projectFile>
<buildArgs>/t:ResolveReferences;Compile /t:_CopyWebApplication
/p:Configuration=Release /p:WebProjectOutputDir=C:\publish
/p:OutputPath=C:\publish\bin /v:diag</buildArgs>
<targets>Build</targets>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program
Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
<timeout>180</timeout>
</msbuild>
<exec>
<executable>C:\Program Files\Microsoft FxCop 1.35
\FxCopCmd.exe</executable>
<baseDirectory>C:\DailyBuild\fxCops\</baseDirectory>
<buildArgs>/p:"test.FxCop"
/out:"C:\DailyBuild\log\buildlogs\FxCop-results.xml" /gac</buildArgs>
<buildTimeoutSeconds>120</buildTimeoutSeconds>
</exec>
</tasks>
<publishers>
<merge>
<files>
<file>C:\DailyBuild\log\buildlogs\FxCop-results.xml</file>
</files>
</merge>
<xmllogger logDir="C:\DailyBuild\log\buildlogs\"></xmllogger>
<email mailhost="192.168.0.2" from="[email protected]">
<mailhostUsername>[email protected]</mailhostUsername>
<mailhostPassword>BestSim</mailhostPassword>
<includeDetails>True</includeDetails>
<users>
<user name="zhaoshiyuan" address="[email protected]" group="webGroup" />
<user name="yangtao" address="[email protected]" group="webGroup"
/>
</users>
<groups>
<group name="webGroup" />
</groups>
<modifierNotificationTypes>
<NotificationType>Always</NotificationType>
</modifierNotificationTypes>
</email>
</publishers>
<state type="state" directory="C:\DailyBuild\CCState" />
<labeller type="dateLabeller" />
</project>
<project name="FrameWorkSystem" queuePriority="0">
<workingDirectory>C:\DailyBuild</workingDirectory>
<artifactDirectory>C:\DailyBuild\log\FrameWorkLogs\</artifactDirectory>
<webURL>http://192.168.0.151/ccnet/server/local/project/FrameWorkSystem/ViewProjec
tReport.aspx</webURL>
<modificationDelaySeconds>2</modificationDelaySeconds>
<sourcecontrol type="svn">
<trunkUrl>http://192.168.0.151:8080/svn/FrameWork</trunkUrl>
<workingDirectory>C:\DailyBuild\FrameWork</workingDirectory>
<executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
<username>admin</username>
<password>123456</password>
<autoGetSource>True</autoGetSource>
</sourcecontrol>
<triggers>
<intervalTrigger name="myTriger" seconds="6000"
buildCondition="IfModificationExists" />
</triggers>
<tasks>
<msbuild>
<executable>C:\windows\Microsoft.NET\Framework\v4.0.30319
\MSBuild.exe</executable>
<workingDirectory>C:\DailyBuild\FrameWork\SQLServerDAL\</workingDirectory>
<projectFile>FrameWork.SQLServerDAL.csproj</projectFile>
<buildArgs>/t:build /p:Configuration=Release
/p:OutputPath=C:\publish\FrameWork\bin /v:diag</buildArgs>
<targets>Build</targets>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program
Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
<timeout>120</timeout>
</msbuild>
<msbuild>
<executable>C:\windows\Microsoft.NET\Framework\v4.0.30319
\MSBuild.exe</executable>
<workingDirectory>C:\DailyBuild\FrameWork\WebManage\</workingDirectory>
<projectFile>FrameWork.WebManage.csproj</projectFile>
<buildArgs>/t:ResolveReferences;build /t:_CopyWebApplication
/p:Configuration=Release /p:WebProjectOutputDir=C:\publish\FrameWork\
/p:OutputPath=C:\publish\FrameWork\bin /v:diag</buildArgs>
<targets>Build</targets>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program
Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
<timeout>600</timeout>
</msbuild>-->
<!--
<exec>
<executable>C:\Program Files\Microsoft FxCop 1.35
\FxCopCmd.exe</executable>
<baseDirectory>C:\DailyBuild\fxCops\</baseDirectory>
<buildArgs>/p:"FrameWork.FxCop"
/out:"C:\DailyBuild\log\FrameWorklogs\FxCop-results.xml" /gac</buildArgs>
<buildTimeoutSeconds>120</buildTimeoutSeconds>
</exec>
-->
</tasks>
<publishers>
<merge>
<files>
<!--
<file>C:\DailyBuild\log\FrameWorklogs\FxCop-
results.xml</file> -->
</files>
</merge>
<xmllogger logDir="C:\DailyBuild\log\FrameWorklogs\"></xmllogger>
<email mailhost="192.168.0.2" from="[email protected]">
<mailhostUsername>[email protected]</mailhostUsername>
<mailhostPassword>BestSim</mailhostPassword>
<includeDetails>True</includeDetails>
<users>
<user name="zhaoshiyuan" address="[email protected]" group="webGroup" />
<!--<user name="yangtao" address="[email protected]"
group="webGroup" /> -->
</users>
<groups>
<group name="webGroup" />
</groups>
<modifierNotificationTypes>
<NotificationType>Always</NotificationType>
</modifierNotificationTypes>
</email>
</publishers>
<state type="state" directory="C:\DailyBuild\CCState" />
<labeller type="dateLabeller" />
</project>
</cruisecontrol>
说明:
第一个projectTestSystem。是个测试项目,web应用程序。
<workingDirectory>工作目录
<artifactDirectory>项目日志输出目录
<sourcecontrol type="svn">指定源代码管理器为svn.
<trunkUrl>http://192.168.0.151:8080/svn/test</trunkUrl>项目源代码地址
【注意了】在这个地方我花了多少时间来配置。
1)、网上大多的svn配置都是老版本。地址类型为svn:XXX/XXX。而我的svn为1.63版本,使用
的是WEB发布方式,地址类型为http://server.cm/svn/xxxx。
这个地址就是svn项目的地址。
2)、默认使用SSH(https)。但我搞半天也没搞清楚。就改Svn配置,直接使用http了。
<triggers>我使用每隔6000秒检查一次是否有新版本,如果有就签出新版本,进行编译,发布
等。
<msbuild>:负责编译,发布。。
关于发布使用这两个属性就完全搞定了
/t:ResolveReferences :指定编译包含的引用
/t:_CopyWebApplication:指定发布,拷贝web应用文件
/p:WebProjectOutputDir=C:\publish\FrameWork\ :指定拷贝地址
/p:OutputPath=C:\publish\FrameWork\bin :指定编译后的bin输出地址
<email>指定集成结果发送邮件到指定用户邮件中
第二个project。此包含7个类项目,一个web项目,但最后要发布是web项目。
此处要注意两点:
1)、项目之间的引用最好使用项目引用方式,不要直接引用dll。这样就可以只编译web项目。
msbuild会自己编译引用的其它项目。
2)、有3个类项目没有被web项目直接引用。使用的反射机制。所以编译web项目时,不会自动
编译这三个项目。但这三个项目中有一个引用了另两个。最后再多编译一个项目就行了。如上
我有两个<msbuild>节
4、注意事项及常见问题
1)、清楚项目间的引用关系
2)、间接引用项目的输出路径要指定到发布后的相关位置上。
5、相关资源
1)cc.net官网地址:
http://sourceforge.net/projects/ccnet/
2)cc.net参考手册
3)ccnet.config的配置工具
http://ccnetconfig.codeplex.com/
4)其它参考
介绍比较全的文章
http://tech.it168.com/m/2008-05-04/200805042108206.shtml
http://kb.cnblogs.com/a/1512017/