我们用一个实例CISample来说明如何配置CC.Net、VSS等。

我们用一个实例CISample来说明如何配置CC.Net、VSS等。

持续集成服务器源代码管理器配置:

从程序里面选择Microsoft Visual SourceSafe Administration运行源代码管理程序:

我们在磁盘上建立一个目录来作为源代码管理器的数据库目录(例:c:/vsswoker),从文件菜单里新建数据库,浏览到新建的目录下,创建一个名叫CISample的目录:

使用默认的CISample作为连接名字:

选择版本控制模型之后,CISample创建就完成了:

完成之后从Users菜单里面选择新建用户,添加参与这个项目的所有用户,用户可以是只读属性的:

最后共享VSSWorker目录:

同时设置相关人员的访问权限。

实例目录结构准备:

我们在开发用的机器上建立一个项目文件夹(例:Projects),用来存放项目,再建立一个库文件夹(例:Libs),用来存放其他需要引用的库文件和工具,比如NUnit等。将这两个目录用Subst命令映射成2个独立的盘符(例:subst p: c:/Projects, subst l: c:/Libs)。

VS2005源代码管理器配置:

从VS2005的工具菜单选择选项,展开源代码管理选择插件选择,VSS可以支持文件共享方式和Internet方式

新建一个项目:

打开VS2005,新建一个类库项目,位置选择映射的项目文件夹盘符,取名为CISample,同时创建解决方案目录,删除自动创建的Class1.cs文件。在解决方案上点击右键从菜单中选择将解决方案添加到源代码管理器:

在添加SourceSafe数据库向导中,选择连接到已存在的数据库:

在位置处输入//CIServer/VSSWorker/CISample:

后面的连接名字使用默认的就可以了。然后使用前面建立的用户和密码登录:

出现添加到SourceSafe对话框,直接点击OK,随后的确认对话框选择Yes:

开始往源代码管理器添加文件:

添加完成之后,解决方案、项目以及文件前面都加了一把小锁:

在解决方案上点击右键,选择添加新项目,添加一个新的名为CISampleTest的类库项目,这个项目用于单元测试:

为这个项目添加CISample项目引用和NUnit的引用。

我们使用NUnit网站上Quick Start的例子。

在CISample项目上点击右键,添加一个类,命名为Account,然后输入下面的代码:

using System;

using System.Collections.Generic;

using Syste.Text;

namespace CISample

{

public class Account

{

private float balance;

public void Deposit(float amount)

{

balance+=amount;

}

public void Withdraw(float amount)

{

balance-=amount;

}

public void TransferFunds(Account destination, float amount)

{

}

public float Balance

{

get{ return balance;}

}

}

}

在CISampleTest项目上点右键,新建一个类,命名为AccountTest,然后输入下面的代码:

using System;

using System.Collections.Generic;

using Syste.Text;

using NUnit.Framework;

namespace CISampleTest

{

[TestFixture]

public class AccountTest

{

[Test]

public void TransferFunds()

{

Account source = new Account();

source.Deposit(200.00F);

Account destination = new Account();

destination.Deposit(150.00F);

source.TransferFunds(destination, 100.00F);

Assert.AreEqual(250.00F, destination.Balance);

Assert.AreEqual(100.00F, source.Balance);

     

}

}

}

现在build一次,通过。用Nunit-gui打开CISampleTest.dll,点击Run,看到下面的结果:

出错了,测试没有通过,现在不着急让它通过,先签入到源代码管理器中。

配置CC.Net:

在持续集成服务器上创建一个文件夹CIWorker,用来存放项目文件,再在下面创建一个CISample文件夹。

进入CC.Net的webdashboard目录,用记事本打开web.config文件进行编辑,找到xslReportBuildPlugin,添加msbuild的report插件,因为我们使用msbuild所以就要注释掉NAnt的report插件,Fitness以后再写文章介绍,所以也注释掉:

<xslReportBuildPlugin description="MSBuild Output" actionName="MSBuildOutputBuildPlugin" xslFileName="xsl/msbuild.xsl" />

<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" />

<xslReportBuildPlugin description="NCover Report" actionName="NCoverBuildReport" xslFileName="xsl/NCover.xsl" />

<xslReportBuildPlugin description="Simian Report" actionName="SimianBuildReport" xslFileName="xsl/SimianReport.xsl"/>

<!-- <xslReportBuildPlugin description="Fitnesse Report" actionName="FitnesseBuildReport" xslFileName="xsl/FitnesseReport.xsl"/> -->

进入CC.Net的Server目录,创建一个名为MapDriver.bat的批处理文件:

subst p: /d

subst l: /d

subst p: c:/CIWorker

subst l: c:/tools

然后用记事本打开ccnet.config文件进行编辑:

<cruisecontrol>

<project>

<name>CISample</name>

<triggers>

<intervalTrigger seconds="60"/>

</triggers>

<webURL>http://localhost/ccnet</webURL>

<modificationDelaySeconds>2</modificationDelaySeconds>

<sourcecontrol type="vss" autoGetSource="true">

<ssdir>//CIServer/VSSWorker/CISample</ssdir>

<executable>C:/Program Files/Microsoft Visual SourceSafe/SS.exe</executable>

<project>$/CISample.root/CISample</project>

<username>tubo</username>

<password>******</password>

<workingDirectory>c:/CIWorker/CISample</workingDirectory>

</sourcecontrol>

<publishers>

<xmllogger logDir="log" />

</publishers>

</project>

</cruisecontrol>

保存之后,用浏览器打开http://localhost/ccnet,应该就可以看到:

点击CISample就可以看到CISample的日志了,不过目前还只能看到从VSS获取代码的日志,还没有build日志,在ccnet.config文件中添加如下红色内容:

<cruisecontrol>

<project name="CISample">

<name>CISample</name>

<triggers>

<intervalTrigger seconds="60"/>

</triggers>

<webURL>http://localhost/ccnet</webURL>

<modificationDelaySeconds>2</modificationDelaySeconds>

<sourcecontrol type="vss" autoGetSource="true">

<ssdir>//CIServer/VSSWorker/CISample</ssdir>

<executable>C:/Program Files/Microsoft Visual SourceSafe/SS.exe</executable>

<project>$/CISample.root/CISample</project>

<username>tubo</username>

<password>******</password>

<workingDirectory>c:/CIWorker/CISample</workingDirectory>

</sourcecontrol>

<tasks>

<exec>

<executable>c:/CCNet/Server/MapDriver.bat</executable>

</exec>

<msbuild>

<executable>C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe</executable>

<workingDirectory>p:/CISample</workingDirectory>

<projectFile>CISample.sln</projectFile>

<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>

<targets>ReBuild</targets>

<timeout>10000</timeout>

<logger>C:/CCNET/server/ThoughtWorks.CruiseControl.MsBuild.dll</logger>

</msbuild>

</tasks>

<publishers>

<xmllogger logDir="log" />

</publishers>

</project>

</cruisecontrol>

点击Dashboard页面上的Force按钮强制build,然后点击CISample查看Build日志,可以看到msbuild的输出日志,继续修改ccnet.config,添加NUnit的配置:

<cruisecontrol>

<project>

<name>CISample</name>

<triggers>

    <intervalTrigger seconds="60"/>

</triggers>

<webURL>http://localhost/ccnet</webURL>

<modificationDelaySeconds>2</modificationDelaySeconds>

<sourcecontrol type="vss" autoGetSource="true">

<ssdir>//CIServer/VSSWorker/CISample</ssdir>

<executable>C:/Program Files/Microsoft Visual SourceSafe/SS.exe</executable>

<project>$/CISample.root/CISample</project>

<username>tubo</username>

<password>*******</password>

<workingDirectory>c:/CIWorker/CISample</workingDirectory>

</sourcecontrol>

<tasks>

<exec>

<executable>c:/CCNet/Server/MapDriver.bat</executable>

</exec>

<msbuild>

<executable>C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe</executable>

<workingDirectory>p:/CISample</workingDirectory>

<projectFile>CISample.sln</projectFile>

<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>

<targets>ReBuild</targets>

<timeout>10000</timeout>

<logger>C:/CCNET/server/ThoughtWorks.CruiseControl.MsBuild.dll</logger>

</msbuild>

<nunit>

<path>l:/nunit/nunit-console.exe</path>

<assemblies>

<assembly>p:/CISample/CISampleTest/bin/Debug/CISampleTest.dll</assembly>

</assemblies>

</nunit>

</tasks>

<publishers>

<xmllogger logDir="log" />

</publishers>

</project>

</cruisecontrol>

再次点击Force按钮,查看日志,可以看到这次build失败了,是单元测试没有通过。

CISample项目,打开CISample项目的Account.cs文件,完成TransferFunds方法:

public void TransferFunds(Account destination, float amount)

{

    destination.Deposit(amount);

    Withdraw(amount);

}

重新生成解决方案,然后运行NUnit,可以看到测试通过了,将修改的代码签入到源代码管理器中,等一会打开dashboard页面,点击CISample查看日志,可以看到已经自动Build了一次:

下面介绍如何配置FxCop、NCover、Simian。因为CCNet没有支持FxCop等的task,所以只能在msbuild中配置FxCop等(对于NUnit,CCNet建议也在msbuild或NAnt里面配置)。

进入到CIWorker的CISample目录下面,创建一个名为CISample.FxCop的文本文件,输入如下内容:

<?xml version="1.0" encoding="utf-8"?>

<FxCopProject Version="8.0" Name="CISample">

<ProjectOptions>

<SharedProject>True</SharedProject>

<Stylesheet Apply="False">L:/FxCop/Xml/FxCopReport.Xsl</Stylesheet>

<SaveMessages>

<Project Status="Active, Excluded" NewOnly="False" />

<Report Status="Active" NewOnly="False" />

</SaveMessages>

<ProjectFile Compress="True" DefaultTargetCheck="True" DefaultRuleCheck="True" SaveByRuleGroup="" Deterministic="True" />

<EnableMultithreadedLoad>True</EnableMultithreadedLoad>

<EnableMultithreadedAnalysis>True</EnableMultithreadedAnalysis>

<SourceLookup>True</SourceLookup>

<AnalysisExceptionsThreshold>100</AnalysisExceptionsThreshold>

<RuleExceptionsThreshold>10</RuleExceptionsThreshold>

<Spelling Locale="en-us" />

<VersionAware>False</VersionAware>

<OverrideRuleVisibilities>False</OverrideRuleVisibilities>

<CustomDictionaries SearchFxCopDir="True" SearchUserProfile="True" SearchProjectDir="True" />

</ProjectOptions>

<Targets>

<Target Name="P:/CISample/CISample/bin/Debug/CISample.dll" Analyze="True" AnalyzeAllChildren="True" />

</Targets>

<Rules>

<RuleFiles>

<RuleFile Name="L:/FxCop/Rules/DesignRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/GlobalizationRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/InteroperabilityRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/MobilityRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/NamingRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/PerformanceRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/PortabilityRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/SecurityRules.dll" Enabled="True" AllRulesEnabled="True" />

<RuleFile Name="L:/FxCop/Rules/UsageRules.dll" Enabled="True" AllRulesEnabled="True" />

</RuleFiles>

<Groups />

<Settings />

</Rules>

<FxCopReport Version="8.0" />

</FxCopProject>

创建一个名为CISample.msbuild的文本文件,输入如下内容:

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

<Target Name="ReBuild">

<MSBuild Projects="CISample.sln" Targets="Clean;ReBuild" />

<Delete Files="CISample.FxCop.xml;TestResult.xml;Coverage.Xml;simian.xml" />

<Exec Command="L:/FxCop/FxCopCmd.exe /p:p:/CISample/CISample.FxCop /o:P:/CISample/CISample.FxCop.xml" WorkingDirectory="L:/FxCop" />

<Exec Command="L:/Simian/simian-2.2.8.exe -recurse=*.cs -formatter=xml:simian.xml" WorkingDirectory="P:/CISample" IgnoreExitCode="true" />

<Exec Command="L:/NCover/NCover.Console.exe //q //w P:/CISample L:/Nunit/nunit-console.exe P:/CISample/CISampleTest/bin/Debug/CISampleTest.dll" WorkingDirectory="P:/CISample" IgnoreExitCode="true" Timeout="10000000" />

</Target>

</Project>

同时修改ccnet.config文件:

<cruisecontrol>

<project>

<name>CISample</name>

<triggers>

    <intervalTrigger seconds="60"/>

</triggers>

<webURL>http://localhost/ccnet</webURL>

<modificationDelaySeconds>2</modificationDelaySeconds>

<sourcecontrol type="vss" autoGetSource="true">

<ssdir>//CIServer/VSSWorker/CISample</ssdir>

<executable>C:/Program Files/Microsoft Visual SourceSafe/SS.exe</executable>

<project>$/CISample.root/CISample</project>

<username>tubo</username>

<password>******</password>

<workingDirectory>c:/CIWorker/CISample</workingDirectory>

</sourcecontrol>

<tasks>

<exec>

<executable>c:/CCNet/Server/MapDriver.bat</executable>

</exec>

<msbuild>

<executable>C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe</executable>

<workingDirectory>p:/CISample</workingDirectory>

<projectFile>CISample.msbuild</projectFile>

<timeout>10000</timeout>

<logger>C:/CCNET/server/ThoughtWorks.CruiseControl.MsBuild.dll</logger>

</msbuild>

<nunit>

<path>l:/nunit/nunit-console.exe</path>

<assemblies>

<assembly>p:/CISample/CISampleTest/bin/Debug/CISampleTest.dll</assembly>

</assemblies>

</nunit>

<merge>

<files>

<file>P:/CISample/*.FxCop.xml</file>

<file>P:/CISample/Coverage.Xml</file>

<file>P:/CISample/simian.xml</file>

</files>

</merge>

</tasks>

<publishers>

<xmllogger logDir="log" />

</publishers>

</project>

</cruisecontrol>

再次点击Force按钮,查看CISample的最新build日志可以看到FxCop、NCover都有日志产生:

NCover的覆盖率为100%,FxCop的输出报表如图:

我们复制一个TransferFunds方法为TransferFunds1:

public void TransferFunds1(Account destination, float amount)

{

destination.Deposit(amount);

Withdraw(amount);

}

对这个方法不写单元测试,再次签入代码,可以看到覆盖测试率为85%了。然后我们把Account类重新拷贝一份命名为Account1,再次签入源代码管理器,过一会查看CISample的日志,会看到Simian报告了代码重复的行数。

至此,DotNet持续集成环境搭建和配置基本完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值