您的位置:首页 > 产品设计 > UI/UE

一种耦合比较松的NCover和CruiseControl.Net集成的方式

2010-12-28 14:16 405 查看
对于软件的安装不用多记,网上很多,但是大家说得比较简单要么比较复杂,对于刚介入的人来说,不知道代码应该写在哪里,该怎么写。下面参考http://docs.ncover.com/how-to/continuous-integration/cruisecontrol-net/的,算是“较”为详细。下面是配置NCover和CI服务器的集成部分,也是比较繁琐的环节。下面记录一下我的方法:

第一步:环境清单

 

软件版本列表如下:

NCover:  NCover-3.1.2.5168(被好心人破解的)
NUnit:     NUnit-2.5.9.10348(没什么好说的)
CI服务器:CruiseControl.NET-1.5.7256.1-Setup(没什么好说的)
CCTray: CruiseControl.NET-CCTray-1.5.7256.1-Setup(没什么好说的)
SVN:       VisualSVN-Server-2.1.5(这个说下,一开始用VSS,但是我的生产环境是在SVN下,用它方便)


操作系统:  Windows Server2003 SP2(WindowsServer2003-KB914961-SP2-x86-CHS.exe)

.Net环境: dotNetFx35setup.exe

 

注:后面没有加粗的地方是因为我的系统一开始是SP1,.net环境时2.0,我的项目环境现在定在3.5上,用2.0编译有些问题,懒得解决,直接装了3.5的环境。如果你参考我的安装方法,不要被这里迷惑。

 

第二步:安装

安装的方法,在google上很多,而且都比较详细,直接双击,一路确定,最后完成。

 

第三步:规划文件夹目录

为什么要规划目录?因为在配置CruiseControl.Net时,会出现很多让你输入的文件夹目录或输出的文件,这个文件夹或者目录如果不统一把他们安排到一个指定的地方,默认会放到“%Cruise安装目录%/CruiseControl.NET/server”目录下,这个目录会被感染,变得乱七八糟。所以,我建议自己“约定”一下自己的目录(下面图1是我自己的目录):



图1

TempReports:用来存储NUnit处理后的结果和NCover生成的结果文件

Workplaces:  CruiseControl的工作目录--我觉得Eclipse的工作区的名字很不错

CCNetStates:用来保存CruiseControl的状态信息

HistoryVersions:发布的历史版本,可以打Tag的版本

Artifacts:日志、统计等信息

SrcCodes:从SVN上下载的源代码

注意:CCNetStates、HistoryVersions,在ccnet.config中配置后不会被创建,需要手动创建,也可以用脚本搞定。

第四步:配置ccnet.config文件,文件如下:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">
<project>
<name>CCNet-Test</name>
<labeller type="defaultlabeller">
<prefix>CCNET-LYB-</prefix>
<incrementOnFailure>false</incrementOnFailure>
<labelFormat>00000</labelFormat>
</labeller>

<workingDirectory>D:/NetCruise/Workplaces/</workingDirectory>
<artifactDirectory>D:/NetCruise/Workplaces/Artifacts/</artifactDirectory>
<modificationDelaySeconds>2</modificationDelaySeconds>
<webURL>http://localhost:8000/ccnet</webURL>

<triggers>
<intervalTrigger name="continuous" seconds="30" buildCondition="ForceBuild" initialSeconds="30"/>
</triggers>

<sourcecontrol type="svn" autoGetSource="true">
<executable>C:/Program Files/VisualSVN Server/bin/svn.exe</executable>
<username>kbims</username>
<password>kbims</password>
<trunkUrl>https://cnlab-hgyyq/svn/kbims/trunk/</trunkUrl>
<workingDirectory>D:/NetCruise/Workplaces/SrcCodes/</workingDirectory>
</sourcecontrol>

<tasks>
<msbuild>
<executable>C:/WINDOWS/Microsoft.NET/Framework/v3.5/MSBuild.exe</executable>
<workingDirectory>D:/NetCruise/Workplaces/SrcCodes/</workingDirectory>
<projectFile>testCI.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:/Program Files/CruiseControl.NET/server/ThoughtWorks.CruiseControl.MSBuild.dll</logger>
<timeout>15</timeout>
</msbuild>
<msbuild>
<executable>C:/WINDOWS/Microsoft.NET/Framework/v3.5/MSBuild.exe</executable>
<workingDirectory>D:/NetCruise/Workplaces/SrcCodes/</workingDirectory>
<projectFile>MSBuild.proj</projectFile>
<targets>CoverMyCode;CreateCoverageReports</targets>
<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:/Program Files/CruiseControl.NET/server/ThoughtWorks.CruiseControl.MSBuild.dll</logger>
<timeout>15</timeout>
</msbuild>
</tasks>

<state type="state">
<directory>D:/NetCruise/Workplaces/CCNetStates</directory>
</state>

<publishers>
<buildpublisher>
<sourceDir>D:/NetCruise/Workplaces/SrcCodes</sourceDir>
<publishDir>D:/NetCruise/Workplaces/HistoryVersions</publishDir>
</buildpublisher>
<merge>
<files>
<file>D:/NetCruise/TempReport/NCoverReport.xml</file>
</files>
</merge>
<xmllogger logDir="D:/NetCruise/Workplaces/CCNetStates"/>
<modificationHistory />
<statistics />
</publishers>
</project>
</cruisecontrol>


ccnet.config文件网上有很多说明,这里不同的是使用了2个msbuild任务,前一个msbuild用于编译代码,有一个msbuild用于生成nunit和ncover的处理和报告文件,两个msbuild唯一不同的是projectfile处,前者是C#的解决方案;后面一个msbuild的projectfile是单独的一个MSBuild.proj文件,该文件要手动创建。创建的位置和testCI.sln放在同一目录下:



图2

文件内容如下:

<Project DefaultTargets="DoNothing" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<UsingTask TaskName="NCover.MSBuildTasks.NCover"
AssemblyFile="$(ExePath)Build Task Plugins/NCover.MSBuildTasks.dll"/>

<UsingTask TaskName="NCover.MSBuildTasks.NCoverReporting"
AssemblyFile="$(ExePath)Build Task Plug
4000
ins/NCover.MSBuildTasks.dll"/>

<PropertyGroup>
<ExePath>C:/Program Files/NCover/</ExePath>
<TempReportPath>D:/NetCruise/TempReports/</TempReportPath>
<NUnitPath>C:/Program Files/NUnit 2.5.9/bin/net-2.0/</NUnitPath>
<TestObjPath>D:/NetCruise/Workplaces/SrcCodes/test/bin/Debug/</TestObjPath>
<Reports>
<Report>
<ReportType>SymbolModule</ReportType>
<Format>Xml</Format>
<OutputPath>$(TempReportPath)NCoverReport.xml</OutputPath>
</Report>
</Reports>
</PropertyGroup>

<Target Name="DoNothing" />

<Target Name="CoverMyCode">
<NCover ToolPath="$(ExePath)"
TestRunnerExe="$(NUnitPath)nunit-console.exe"
TestRunnerArgs="$(TestObjPath)test.dll /xml $(TempReportPath)NCover-NUnit-Results.xml"
CoverageFile="$(TempReportPath)Coverage.xml"
ExcludeAssemblies="NCover.Test.*;NCover.Framework.XmlSerializers"
/>
</Target>

<Target Name="CreateCoverageReports">
<NCoverReporting ToolPath="$(ExePath)"
CoverageDataPaths="$(TempReportPath)Coverage.xml"
OutputReport="$(Reports)"
/>
</Target>

</Project>


说明:上面的MSBuild中的target,可以在ccnet.config中北msbuild调用,上面指定<targets/>中的两个target就是来自这个文件

通过上面的几个步骤完成了NCover、NUnit和CruiseControl.net的集成,为了让NCover集合后的文件能够在Dashboard中显示出来:

最后:参考http://docs.ncover.com/how-to/continuous-integration/cruisecontrol-net/

1)移动文件

把"[ncover installation directory]/CC.Net/NCoverReporting30.xsl" 拷贝到"[cc.net installation directory]/webdashboard/xsl/" 文件夹下.

把"[ncover installation directory]/CC.Net/g.png" 拷贝到"[cc.net installation directory]/webdashboard/images/" 文件夹下.

把"[ncover installation directory]/CC.Net/r.png" 拷贝到"[cc.net installation directory]/webdashboard/images/" 文件夹下.

把"[ncover installation directory]/CC.Net/y.png" 拷贝到"[cc.net installation directory]/webdashboard/images/" 文件夹下.

2)配置dashbord.config文件:

<?xml version="1.0" encoding="utf-8"?>
<dashboard>
<remoteServices>
<servers>
<!-- Update this list to include all the servers you want to connect to. NB - each server name must be unique -->
<server name="local" url="tcp://localhost:21234/CruiseManager.rem" allowForceBuild="true" allowStartStopBuild="true" backwardsCompatible="false" />
</servers>
</remoteServices>
<plugins>
<farmPlugins>
<farmReportFarmPlugin />
<cctrayDownloadPlugin />
<administrationPlugin password="" />
</farmPlugins>
<serverPlugins>
<serverReportServerPlugin />
</serverPlugins>
<projectPlugins>
<projectReportProjectPlugin />
<viewProjectStatusPlugin />
<latestBuildReportProjectPlugin />
<viewAllBuildsProjectPlugin />
</projectPlugins>
<buildPlugins>
<buildReportBuildPlugin>
<xslFileNames>
<xslFile>xsl/header.xsl</xslFile>
<xslFile>xsl/modifications.xsl</xslFile>
<xslFile>xsl/compile.xsl</xslFile>
<xslFile>xsl/unittests.xsl</xslFile>
<xslFile>xsl/MsTestSummary.xsl</xslFile>
<xslFile>xsl/fxcop-summary.xsl</xslFile>
<!-- Add the following to replace the legacy NCover summary with the NCoverExplorer summary -->
<xslFile>xsl/NCoverReporting30.xsl</xslFile>
<xslFile>xsl/SimianSummary.xsl</xslFile>
<xslFile>xsl/fitnesse.xsl</xslFile>
</xslFileNames>
</buildReportBuildPlugin>
<buildLogBuildPlugin />
<xslReportBuildPlugin description="NUnit Details" actionName="NUnitDetailsBuildReport" xslFileName="xsl/tests.xsl" />
<xslReportBuildPlugin description="NUnit Timings" actionName="NUnitTimingsBuildReport" xslFileName="xsl/timing.xsl" />
<xslReportBuildPlugin description="NAnt Output" actionName="NAntOutputBuildReport" xslFileName="xsl/Nant.xsl" />
<xslReportBuildPlugin description="NAnt Timings" actionName="NAntTimingsBuildReport" xslFileName="xsl/NantTiming.xsl" />
<xslReportBuildPlugin description="FxCop Report" actionName="FxCopBuildReport" xslFileName="xsl/FxCopReport.xsl" />
<!-- Add the following to replace the legacy NCover xsl with the NCoverExplorer summary -->
<xslReportBuildPlugin description="NCover Report" actionName="NCoverBuildReport" xslFileName="xsl/NCoverReporting30.xsl" />
<xslReportBuildPlugin description="Simian Report" actionName="SimianBuildReport" xslFileName="xsl/SimianReport.xsl"/>
<xslReportBuildPlugin description="Fitnesse Report" actionName="FitnesseBuildReport" xslFileName="xsl/FitnesseReport.xsl"/>
</buildPlugins>
<securityPlugins>
<simpleSecurity />
</securityPlugins>
</plugins>
</dashboard>


 

完毕~~~

结果如下:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息