我们用一个实例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持续集成环境搭建和配置基本完成了。
分享到:
相关推荐
本文将深入探讨如何使用.NET与Vss进行团队开发,帮助开发者更好地理解和实践这一工作流程。 首先,我们需要理解.NET Framework。.NET是微软推出的一个全面的开发平台,它提供了丰富的库、语言支持以及开发工具,...
- 安装VSS服务器组件,这通常包括创建一个新的VSS数据库,定义用户和权限。 - 设置服务器共享,确保客户端可以访问VSS数据库所在的文件夹。 - 创建项目和版本库,用于存储源代码和其他相关文件。 2. **客户端...
vss_.net vss_.net
在标题提到的“使用.NET和VSS进行团队开发”中,我们主要关注的是如何利用Microsoft的Visual Studio .NET(VS.NET)集成开发环境(IDE)和Visual SourceSafe(VSS)版本控制系统进行协同工作。下面将详细介绍这两个...
在.NET开发环境中,Visual SourceSafe(VSS)是一款常见的版本...在实际工作中,根据团队规模和项目需求,可能还需要考虑更高级的版本控制系统,如Git或SVN,但VSS作为基础,对于初学者和小型团队是一个不错的选择。
### VSS在Visual Studio .NET的团队开发 #### 关键知识点概述 - **VSS (Visual SourceSafe)**:一种版本控制系统,主要用于管理软件项目的源代码。 - **Visual Studio .NET**:微软公司推出的集成开发环境(IDE)...
asp.net mvc easyui EF VSS 权限管理 主要是框架的设计,应用了asp.net MVC + Entity Framework + jQuery EasyUI + VSS等技术
在一个 VSS 中,同时激活这两个机箱的数据平面和交换阵列,各支持 720Gbps 管理引擎,每 VSS 共1400-Gbps 交换容量。只有其中一个虚拟交换机成员有激活的控制平面。 VSS 提供了出色优势,可分为以下四个大类: 1. ...
总的来说,VS.NET下的Web团队开发源代码管理VSS是一个实用的入门级解决方案,对于初学者或小团队来说,它能有效帮助管理源代码并促进协作。然而,随着项目规模和复杂度的增长,考虑升级到更先进的工具是明智的选择。