DailyBuild全攻略
随着软件开发规模的扩大,软件内在bug的增多,以致于项目经理和开发者被许多无名bug和各种故障弄得焦头烂额,甚至为了一个小问题,而到会议室开会。于是软件的发布日期被无限地延期。可是这一切如果有了DailyBuild,项目经理只要在下班前沏上一壶茶,然后在命令提示符下敲入一个命令,这一切便尽在掌握之中。不信,请跟我来。
DailyBuild中文译作“每日构建”是利用一序列软件,对进行中的项目进行监控,如果发现服务器上共享的项目文件有所改动,便会再次编译,得到软件的最新版本,并且生成测试和代码规范文档。本文将带你步入.NET下DailyBuild的佳境。
本文主要讲解的是如果将DailyBuild相关的一序列软件合作起来,考虑到篇幅大小,本文将对具体某一个软件的基础知识不作详解(关于基础一点的知识在http://www.cnblogs.com/coolbug/category/10651.aspx?Show=All里有介绍)。
1. 系統需求
Win2000 以上操作系统,VS.NET 2003 必须被安裝。
2. 相关工具說明
为了能够实现功能,以下的软件是必须下载安装的(为了程序能够正常运行,请载最新稳定版本),后边有相关的下载地址:
Nant
基于.NET的自动化编译工具。
NantContrib
增强Nant的工具。
Nunit
单元测试的一个比较优秀的工具。
Visual Source Safe
版本控制工具。
FxCop
代码规范检查工具。
CruiseControl.NET
项目监控工具。
NUnit2report
将NUnit生成的XML文件“样式”成HTML文件的一个小工具。
3. 开始进入DailyBuild
首先安装上边所列出来的所有软件.
程序运行总框架如下图:
说明:
CC.Net 监控VSS里的变化,如果发现有变化,CC.Net立即调出NAnt将最新改动的VSS里的数据拷贝到本地并且进行编译,将结果输出.生成DLL程序集或者EXE可执行文件.NAnt将得到的将要执行单元测试的程序集DLL文件交给NUnit检测并且生成XML文件(为了方便我在这里又将XML文件”样式”成HTML文件,打开即以图形方式查看)。并且将得到的程序集交给FxCop检查,并生成XML文件,检查编码是否规范. 只要将CC.NET打开,并且设置好配置文件,这一切就是自动化的,需要的只是你的眼睛来看结果而已。
3.1 建立两个工程
3.1.1 待测项目
打开Visual Studio 2003, 新建一个类库项目,名称为Bank,位置为D:\ClientVSS, 使之生成Bank.dll程序集。
代码如下:
using System;
namespace Bank
{
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)
{
destination.Deposit(amount);
Withdraw(amount);
}
public float Balance
{
get{ return balance;}
}
}
}
3.1.2 测试项目
安装Nunit,这样在工程就可以引用nunit.framework.
新建一个类库项目,命名为 Test, 位置为D:\ClientVSS,使之生成 Test.dll单元测试程序集。在引用里将nunit.framework.引用进来,如下
写测试项目的目的是为了测试待测项目,所以待测项目也要引用进来,即引用刚刚生成的Bank.dll。
代码如下:
namespace Bank
{
using NUnit.Framework;
[TestFixture] //类前必须加的
public class AccountTest
{
[Test] //方法前必须加的,只有加了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);
}
}
}
编译生成 Test.dll程序集(作为单元测试用)。
打开Nunit,将Test.dll添加到Nunit中,并且点击Run,则会得到如下图示:
绿色表示测试通过。
3.2 建立VSS服务器
VSS(Visual Source Safe)是MicroSoft的一个版本控制软件,目前许多公司都在用。
打开VSS的服务端,添加帐号 coolbug,密码:111111,然后创建数据库,这里数据库用的是安装的自带的srcsafe.ini文件,并且将srcsafe.ini的目录共享(我这里将VSS目录设为默认共享即\\coolbug\vss$即可访问我机子上的srcsafe.ini文件,为了让客户端能够访问.然后打开客户端,将刚建立的两个工程加到服务器上。
并将所有项check in到服务器上。
3.3 建立default.build文件
.build文件是靠NAnt来build的,所以先要配置好NAnt的环境。要使Nant支持从VSS得到文件,就要将nantcontrib 里bin目录里的文件都拷贝到Nant的bin 目录里。这样Nant就有了vssget这个task。为了方便,将nant和fxcop的可执行文件添加到环境变量中去。直接在以前的环境变量path 的值后边加上:分号和nant.exe的目录分号和fxcop.exe的目录。如我的:在命令提示符下打入命令:
Set path= %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;D:\dailybuild\tools\nant\bin;D:\dailybuild\tools\fxcop
然后直接就在命令提示符下敲入 nant 再回车,通过提示可以得出Nant有没有安装好。将nunit2report\ bin下的文件都拷贝到nant的BIN目录里,目的是为了将 Nunit生成的XML 文件转化成HTML文件,以.html的形式输出来。
在D:\test 下建立 default.build 文件,由前边的程序运行总框架可以看出,程序的的关键运行全部靠Nant来完成,而Nant是靠执行default.build文件来完成的。所以说Nant的配置文件default.build也是最最关键的。
这里我以C#的注释方法注释,方便大家看。在.build里注释同html里注释一样(<!-- -->),如果让代码支持中文注释,则在XML的开头加上encoding=“gb2312“。
<?xml version="1.0" encoding="gb2312"?>
/*
Default 指将要运行的target的名字。没有调用到的target将不执行。
*/
<project name="TestRemote" default="run" basedir=".">
/*
待编译的解决方案
解决方案路径,及编译后输出路径。
这里一共是两个方案,即待测试项目和测试项目
*/
<property name="Solution.Filename" value="D:\test\local\bank\bank.sln" />
<property name="Solution.Configuration" value="DEBUG" />
<property name="Build.OutputFolder" value="d:\test\result"/>
<property name="Solution.Filename1" value="D:\test\local\test\test.sln" />
<property name="Solution.Configuration1" value="DEBUG" />
<property name="Build.OutputFolder1" value="d:\test\result"/>
/*
target t1
功能:把VSS里$/下所有文件下载到本地机 D:\test\local 目录中
User:VSS用户名, password :VSS密码 dbpath:服务器上srcsafe.ini的路径。
*/
<target name="t1">
<vssget user="coolbug" password="******" localpath="D:\test\local" dbpath="\\coolbug\vss$\srcsafe.ini" path="$/" />
</target>
/*
Target t2 依赖于t1,只要当t1正确执行才能执行t2
功能:编译方案bank.sln
*/
<target name="t2" depends="t1">
<solution solutionfile="${Solution.Filename}" outputdir="${Build.OutputFolder}\" configuration="${Solution.Configuration}" />
</target>
/*
Target t3
功能: 编译方案test.sln
*/
<target name="t3">
<solution solutionfile="${Solution.Filename1}" outputdir="${Build.OutputFolder1}\" configuration="${Solution.Configuration1}" />
</target>
/*
Target run
功能:这个.build文件将要执行的target
Call : 指定本 target将要调用的target的名字,以先后的顺序执行
*/
<target name="run">
<call target="t1" />
<call target="t2" />
<call target="t3" />
<call target="nunit" />
<call target="fxcop" />
</target>
/*
Target nunit
功能:调用nunit并生成扩展名为.xml文件,以此来测试代码。
Outputdir:输入路径设为根目录。
Task nunit2report是将生成的xml文件转化成.html格式,文件查看。
*/
<target name="nunit" depends="t3">
<nunit2>
<formatter type="Plain" />
<formatter type="Xml" usefile="true" extension=".xml" outputdir="." />
<test assemblyname="d:\test\result\test.dll" />
</nunit2>
<nunit2report output="index.html">
<fileset>
<includes name="test.dll-results.xml" />
</fileset>
</nunit2report>
</target>
/*
Target fxcop
功能:调用fxcop这个文件来检测bank.dll这个文件是否符合事先定义好的代码规范,并以
test.xml文件输出。
Commandline: /f指要测试的程序集的路径和名称,/o 指输出XML文件的地址和名称。
*/
<target name="fxcop">
<exec program="fxcopcmd" commandline="/f:D:\test\result\bank.dll /o:test.xml" />
</target>
</project>
为了要将文件全放到记事本里,排版有点不好看.
打开命令提示符,在 d:\test 下敲入 nant 并且回车,将会得到如下界面:
上图表示成功编译了,于是在d:\test文件夹里将会得到结果:
Local 文件夹: 存放从VSS里下载下来文件。
Result 文件夹: 存放用Nant编译Local文件夹里的解决方案后得到的文件。
test.dll-results.xml:为Nunit生成的xml文件。
Index.html: 是将test.dll-results.xml”样式“成 html的结果。
Test.xml: 为 FxCop生成的代码规范检测文件。
打开这些文件看看:
Local文件夹里的结构和VSS客户端上的顺序一样,当然得要看你Build文件里是取哪个目录.result文件夹里只有编译完成的dll文件. 先打开test.dll-results.xml文件看看.
Index.html文件:
呵呵,真酷, 100%通过。
Test.xml文件:
3.4 配置CC.Net
先进入CC.Net的安装目录,进入Server文件夹,新建一个ccnet.config文件(如果里边有则修改之),添加如下内容。为了方便大家阅读,我还是以C#的注释方式注释,大家在build的时候可以将 “/* */”中的内容删去。
<cruisecontrol>
<project name="MyProject">
<webURL>http://localhost/ccnet</webURL>
<schedule type="schedule" sleepSeconds="6"/>
/*
功能:监控VSS里是否有代码改动情况。
Ssdir :本地机VSS的安装目录
Executable:执行服务器上 ss.exe文件
Project: 取得服务器上哪些文件
Username: VSS登陆用户名 password:VSS登陆密码
*/
<sourcecontrol type="vss" autoGetSource="true">
<ssdir>d:\program\vss\</ssdir>
<executable>\\coolbug\vss$\win32\ss.exe</executable>
<project>$/</project>
<username>coolbug</username>
<password>111111</password>
</sourcecontrol>
/*
功能:让Nant去执行 d:\test\default.build文件。
Executable:nant.exe文件的绝对路径。
baseDirectory: .build文件的目录。
buildFile: 将要build的文件的名字(nant一次只能执行一个.build文件)。
*/
<build type="nant">
<executable> D:\dailybuild\tools\nant\bin\nant.exe</executable>
<baseDirectory>d:\test</baseDirectory>
<buildFile>default.build</buildFile>
<targetList>
<target>run</target>
</targetList>
<buildTimeoutSeconds>300</buildTimeoutSeconds>
</build>
<modificationDelaySeconds>10</modificationDelaySeconds>
</project>
</cruisecontrol>
配置好ccnet.config文件后,双击 StartCCNet.bat 文件,(意最好只双击一次,然后不要关掉,否则第二次打开的时候,会一闪而过(要过一会儿才好),所有的结果与错误都在ccnet.log文件里,如果你想用WEB的方式查看或者发Mail给PM,可以再配置一下ccnet.config文件)。
代码没有改动时的情况如下:
将代码稍微改动一下,于是CC.NET立即监测到:
这样,CC.NET将调用Nant去执行default.build文件,将重新执行3.3操作。并在d:\test里生成如3.3的一序列文件。在这里就不一一再述。
4. 小结
本文从DailyBuild的好处讲到相关软件的配置及最后生成结果的文件。整体看来,DailyBuild的确是项目便捷,快速,稳定开发的利器。工欲善其事,必先利其器,希望本文能对那些为项目的bug调试搞得焦头烂额的项目经理们起到抛砖引玉的作用。