在.NET环境中实现每日构建(Daily Build)--NAnt篇(转- 摩诘)
来源:百度文库 编辑:神马文学网 时间:2024/07/08 20:31:59
在.NET环境中实现每日构建--NAnt篇
前言
关于每日构建这个话题,也已经有很多很好的文章讨论了。本文的写作过程中也参考了这些文章。本文之所以继续这个题目,是因为在查阅了网上的资源后,发现没有一个比较通用的过程。所以本文就主要讨论了利用NAnt构建一个通用日编译的方案。利用这个方案,日编译的维护者可以不需要对每个要编译的方案都要做很多维护。只要定义一个属性文件就可以了。
关键词: Daily Build, NAnt
1. 简介
1.1. 每日构建的优点:
每日构建(Daily Build)也可称为持续集成(Continuous Integration),强调完全自动化的、可重复的创建过程,其中包括每天运行多次的自动化测试。每日构建的作用日益显得重要。它让开发者可以每天进行系统集成,从而减少了开发过程中的集成问题。
持续集成可以减少集成阶段"捉虫"消耗的时间,从而最终提高生产力。它使得绝大多数bug在引入的同一天就可以被发现。而且,由于一天之中发生变动的部分并不多,所以可以很快找到出错的位置。
1.2. 每日构建完成的任务
实现自动化每日构建需要做以下几部分的工作:
l 使创建过程完全自动化,让任何人都可以只输入一条命令就完成系统的创建。
l 使测试完全自动化,让任何人都可以只输入一条命令就运行一套完整的系统测试。
l 确保所有人都可以得到最新、最好的可执行文件。
2. 每日构建所使用的工具
在.NET环境下建立每日构建可以使用一系列开源工具:
Nant: 完成代码的自动编译,自动运行测试工具。http://nant.sourceforge.net/builds/
NantContrib:自动从源码库中获取源代码。http://nantcontrib.sourceforge.net/nightly/builds/
NUnit2Report:将NUnit测试工具产生的XML报告转换为HTML报告形式。http://NUnit2Report.sourceforge.net
VSS:Visual Source Safe,微软源码管理工具
Draco.NET: 用于自动检测VSS中源代码变动情况,调用Nant完成自动编译
http://sourceforge.net/projects/draconet/
下载所需的工具后,按照如下步骤进行安装:
在服务器上安装VSS源码管理工具
安装下载的Draco Server 和 Draco Web,修改安装后的Draco Web目录下的web.config文件,设置正确的Draco Server安装路径
将NAnt、NAntContrib、NUnit2Report压缩包解压,将三个Bin目录中的内容复制到一个公用目录,比如D:\DailyBuildTools,然后将该路径加入系统的Path路径列表中,具体为“控制面板-〉系统属性-〉环境变量-〉Path”
3. NAnt自动脚本
NAnt脚本实现了每日构建的主体功能,它具体分为下面几部分
l 定义每日构建所需的一些环境变量,比如从VSS上下载的源码的保存目录,发布目录等
l 清除旧的代码并从VSS源码库中下载最新源代码
l 编译源代码并运行测试代码集
l 将编译后的目标代码拷贝到发布目录进行发布
为了尽可能少的改动NAnt的脚本文件,简化日常维护的工作量,我们把一些对所有项目都基本相同的过程抽取出来,如环境变量定义,清除旧代码获取新代码,编译源代码,对目标代码进行发布的过程都可以写成通用的脚本,而一个具体项目的每日构建脚本则调用通用过程完成
本文采取的目录体系如下所示:
D:\DailyBuild\
\Source:存放源代码的目录
\Build:存放编译后的目标代码的目录
\Publish:存放的WEB发布文件的目录
\log:存放的日志文件
3.1. Nant的基础知识
l Nant脚本代码文件的基本结构
……
……
说明:encoding="gb2312"使得脚本文件可以支持中文
标签定义了项目属性,一个脚本文件只能有一个项目定义
default="prebuild"说明该项目缺省从prebuild任务开始执行
标签定义了一项任务,任务是Nant脚本具体执行动作的最小单元
depends="namecheck,clean "说明该任务执行前需要namecheck和clean任务先执行
description描述了该任务的一些说明性信息
l 定义变量
如上所示,定义变量使用标签,name属性定义了变量的名称,value属性定义变量的值,其中name属性可以使用字母、数字、点号、下划线等符号,而value属性可以使用字符串或是已经定义的变量,Nant内建的函数等,
要使用已经定义的变量,可以用${<变量名>},要使用内建函数,可以使用${<函数名称>}
如:
使用了已定义变量core.basedir和solution.name来定义变量solution.basedir;
使用了NAnt内建函数directory::get-current-directory()来定义curdir变量
3.2. 定义环境变量
定义环境变量的脚本代码写在Common。Config文件里
主要有以下几类信息的定义:
l 每日构建所在的根目录
说明:${directory::get-current-directory()}内建函数获取当前文件所在路径信息
l 被编译的解决方案的目录结构,和前面提到的目录体系一致
说明:以上代码是定义了要编译的解决方案的目录结构信息,其中${solution.name}是由外部传入的解决方案的名称,后面的代码将根据该名称在日编译的根目录下生成和solution.name指定的名称同名的目录,并在该目录下生成source,buld,log等子目录
l VSS源代码管理系统的基本信息
说明:定义了和VSS源码管理系统相关的一些信息,其中VSS数据库所在位置可以是网络路径,也可以是本地路径
l <编译时的一些参数
3.3. 建立目录结构,获取源代码
脚本代码写在CheckSource.build.xml文件里
l 包含在Common.config文件里定义的公共变量
l 检查是否存在solution.name变量
说明:${property::exists(‘<变量名>‘)}是NAnt内建函数,用于测试某变量是否存在
${string::get-length(<字符串变量>)==0}测试字符串的长度是否为0
… :如果test表达式值为假,执行标签内的代码
… :如果test表达式值为假,执行标签内的代码
l 建立解决方案的目录结构
说明:delete和mkdir标签内的failonerror属性表示即使操作文件夹的过程中出现了错误,也忽略错误向下执行
l 获取源代码:
从VSS上获取解决方案的源代码
user="${vss.username}"
password="${vss.password}"
localpath="${solution.source}"
recursive="true"
replace="true"
dbpath="${vss.dbpath}"
path="${vss.basepath}${vss.projectpath}"
/>
说明:标签是NAntContrib的语法,用来从VSS源码管理器上下载源代码,user和password属性表示登录VSS服务器的信息;Localpath属性是指下载的源代码存放的路径;recursive="true"表示递归获取代码;replace="true"表示如果本地有重复文件,则进行覆盖;dbpath定义VSS的srcsafe.ini文件的路径信息,包括srcsafe.ini文件名;path定义了要获取的源代码在VSS数据库中的路径,一般都是以$/为根目录。
3.4. 编译源代码
l 编译命令
编译解决方案的命令为
其中solutionfile属性表明了要编译的解决方案文件的路径信息,即以"sln"为扩展名的文件,
configuration属性表明要编译的是发行版还是调试版,取值为"Release"或"Debug"
outputdir表明了编译后的动态链接库或可执行文件存放的目录
solution中的嵌套标签用于当解决方案含有WEB项目的情况,有几个WEB项目,就有几项
前言
关于每日构建这个话题,也已经有很多很好的文章讨论了。本文的写作过程中也参考了这些文章。本文之所以继续这个题目,是因为在查阅了网上的资源后,发现没有一个比较通用的过程。所以本文就主要讨论了利用NAnt构建一个通用日编译的方案。利用这个方案,日编译的维护者可以不需要对每个要编译的方案都要做很多维护。只要定义一个属性文件就可以了。
关键词: Daily Build, NAnt
1. 简介
1.1. 每日构建的优点:
每日构建(Daily Build)也可称为持续集成(Continuous Integration),强调完全自动化的、可重复的创建过程,其中包括每天运行多次的自动化测试。每日构建的作用日益显得重要。它让开发者可以每天进行系统集成,从而减少了开发过程中的集成问题。
持续集成可以减少集成阶段"捉虫"消耗的时间,从而最终提高生产力。它使得绝大多数bug在引入的同一天就可以被发现。而且,由于一天之中发生变动的部分并不多,所以可以很快找到出错的位置。
1.2. 每日构建完成的任务
实现自动化每日构建需要做以下几部分的工作:
l 使创建过程完全自动化,让任何人都可以只输入一条命令就完成系统的创建。
l 使测试完全自动化,让任何人都可以只输入一条命令就运行一套完整的系统测试。
l 确保所有人都可以得到最新、最好的可执行文件。
2. 每日构建所使用的工具
在.NET环境下建立每日构建可以使用一系列开源工具:
Nant: 完成代码的自动编译,自动运行测试工具。http://nant.sourceforge.net/builds/
NantContrib:自动从源码库中获取源代码。http://nantcontrib.sourceforge.net/nightly/builds/
NUnit2Report:将NUnit测试工具产生的XML报告转换为HTML报告形式。http://NUnit2Report.sourceforge.net
VSS:Visual Source Safe,微软源码管理工具
Draco.NET: 用于自动检测VSS中源代码变动情况,调用Nant完成自动编译
http://sourceforge.net/projects/draconet/
下载所需的工具后,按照如下步骤进行安装:
在服务器上安装VSS源码管理工具
安装下载的Draco Server 和 Draco Web,修改安装后的Draco Web目录下的web.config文件,设置正确的Draco Server安装路径
将NAnt、NAntContrib、NUnit2Report压缩包解压,将三个Bin目录中的内容复制到一个公用目录,比如D:\DailyBuildTools,然后将该路径加入系统的Path路径列表中,具体为“控制面板-〉系统属性-〉环境变量-〉Path”
3. NAnt自动脚本
NAnt脚本实现了每日构建的主体功能,它具体分为下面几部分
l 定义每日构建所需的一些环境变量,比如从VSS上下载的源码的保存目录,发布目录等
l 清除旧的代码并从VSS源码库中下载最新源代码
l 编译源代码并运行测试代码集
l 将编译后的目标代码拷贝到发布目录进行发布
为了尽可能少的改动NAnt的脚本文件,简化日常维护的工作量,我们把一些对所有项目都基本相同的过程抽取出来,如环境变量定义,清除旧代码获取新代码,编译源代码,对目标代码进行发布的过程都可以写成通用的脚本,而一个具体项目的每日构建脚本则调用通用过程完成
本文采取的目录体系如下所示:
D:\DailyBuild\
3.1. Nant的基础知识
l Nant脚本代码文件的基本结构
……
……
说明:encoding="gb2312"使得脚本文件可以支持中文
default="prebuild"说明该项目缺省从prebuild任务开始执行
depends="namecheck,clean "说明该任务执行前需要namecheck和clean任务先执行
description描述了该任务的一些说明性信息
l 定义变量
如上所示,定义变量使用
要使用已经定义的变量,可以用${<变量名>},要使用内建函数,可以使用${<函数名称>}
如:
使用了已定义变量core.basedir和solution.name来定义变量solution.basedir;
使用了NAnt内建函数directory::get-current-directory()来定义curdir变量
3.2. 定义环境变量
定义环境变量的脚本代码写在Common。Config文件里
主要有以下几类信息的定义:
l 每日构建所在的根目录
说明:${directory::get-current-directory()}内建函数获取当前文件所在路径信息
l 被编译的解决方案的目录结构,和前面提到的目录体系一致
说明:以上代码是定义了要编译的解决方案的目录结构信息,其中${solution.name}是由外部传入的解决方案的名称,后面的代码将根据该名称在日编译的根目录下生成和solution.name指定的名称同名的目录,并在该目录下生成source,buld,log等子目录
l VSS源代码管理系统的基本信息
说明:定义了和VSS源码管理系统相关的一些信息,其中VSS数据库所在位置可以是网络路径,也可以是本地路径
l <编译时的一些参数
3.3. 建立目录结构,获取源代码
脚本代码写在CheckSource.build.xml文件里
l 包含在Common.config文件里定义的公共变量
l 检查是否存在solution.name变量
说明:${property::exists(‘<变量名>‘)}是NAnt内建函数,用于测试某变量是否存在
${string::get-length(<字符串变量>)==0}测试字符串的长度是否为0
l 建立解决方案的目录结构
说明:delete和mkdir标签内的failonerror属性表示即使操作文件夹的过程中出现了错误,也忽略错误向下执行
l 获取源代码:
从VSS上获取解决方案
password="${vss.password}"
localpath="${solution.source}"
recursive="true"
replace="true"
dbpath="${vss.dbpath}"
path="${vss.basepath}${vss.projectpath}"
/>
说明:
3.4. 编译源代码
l 编译命令
编译解决方案的命令为
其中solutionfile属性表明了要编译的解决方案文件的路径信息,即以"sln"为扩展名的文件,
configuration属性表明要编译的是发行版还是调试版,取值为"Release"或"Debug"
outputdir表明了编译后的动态链接库或可执行文件存放的目录
solution中的嵌套标签
在.NET环境中实现每日构建(Daily Build)--NAnt篇(转- 摩诘)
在Dreamweaver中构建ASP.net开发环境
Managing .NET Development with NAnt
我在环境中
博客园 - 热衷于DotNet技术! - 在Asp.net页面中实现数据饼图
ASP.NET中树形图的实现
在JSF中实现分页(一)
构建linux下IDE环境--Eclipse篇
构建linux下IDE环境--Eclipse篇
个人学习环境(PLE)的构建
正则表达式的终极能力 - 递归(在.NET的正则表达式实现中匹配嵌套结构的方法)
在jsp环境中配置使用FCKEditor(转载)
[精华] (分享)在UNIX中找出黑客。 - ChinaUnix.net
在oracle中实现分页
在JSF中实现分页
在化解矛盾中构建和谐社会
构建数字化学习环境
构建数字化学习环境
ASP.NET 2.0中实现模板中的数据绑定
ASP.NET中利用存储过程实现模糊查询
ASP.NET 2.0中实现模板中的数据绑定
ASP.NET中利用存储过程实现模糊查询
转在VC中如果实现GIF的播放?
在word中实现表格的行列转置