阿不

不抛弃,不放弃

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  158 随笔 :: 0 文章 :: 2073 评论 :: 66 Trackbacks

每日构建,对我们团队来说一个全新的概念。随着项目开发的进展,在开发过程需要及时反馈一些BUG和功能要求的处理情况。而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以就特别有必要引入每日构建。关于每日构建,在园里有已经有很多的文章了,特别是摩诘的《.NET境中实现每日构建(Daily Build)--NAnt》更是从概念上和实践上手把手地介绍如果在.NET环境下实现每日构建。但很遗憾,在我实现每日构建之前没有看到这篇文章,错失了一次快速入门的机会,不过感到庆幸的是,经过一天的研究和学习,把自己在学习配置过程中遇到的一些问题总结一下,算是对每日构建实现方法的一个补充吧。

我是在Windows 2003中做每日构建的,使用CruiseControl.Net自动从VSS服务器中检测并下载最新的源代码,然后用MsBuild对解决方案自动编译。利用CCTray可以对每日构建的情况进行监控,了解CruiseControl.Net的工作情况。

下载安装完ccnet后,最重要的工作就是配置ccnet.config了。在安装目录下的server子目录里可以找到这个文件。虽然有帮助文件的支持,并且在Examples目录下有一个示例的配置文件,但是要想正确地配置这个文件也不是很容易的。在Ccnet.config里可以创建多个要监控项目的配置信息配置信息。包括:每个版本的标识方式,使用的源码库类型和登录信息,项目状态管理,每次构建要执行的任务,执行周期。以下是我的一个配置文件:

<cruisecontrol>   

     <project name="ccnetProject" webURL="Http://192.168.1.1/ccnet" publishExceptions="true">

         <!--工作目录,下载的源码将会被保存在这个目录下,如没有设置则会自被保存在安装目录下server子目录以project name为名称的目录下-->

         <workingDirectory>e:\ccnet</workingDirectory>

         <!--对这个项目的监控过程的日志记录目录-->

         <artifactDirectory>e:\ccnet</artifactDirectory>

         <!--使用什么样的方式标识每一个自动生成的版本,可以有多种不同的方式。Labeller Blocks -->

         <labeller type="dateLabeller" />

         <!--使用的源码控制器类型,我算了一下,它支持18种的源码控制器,强吧?这里使用的是VSS-->

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

              <!--源码库中的项目名称-->

              <project>$/ </project>

              <!--vss用户名-->

              <username>ccnet</username>

              <!--vss密码-->

              <password>dailybuild</password>

              <!--vss服务器所在的路径-->

              <ssdir>\\192.168.*.*\Vss Server</ssdir>

              <!--工作目录,可以使用相对目录,以上面的workingDirectory为准-->

              <workingDirectory>e:\ccnet</workingDirectory>

         </sourcecontrol>

 

         <!--执行周期-->

         <triggers>

              <!--定时任务,可以设置在哪天的那个时间执行构建计划-->

              <scheduleTrigger time="14:00" buildCondition="ForceBuild">

                   <!--以下配置节有指定,则会在指定的时间日期内执行,没有则每天执行-->

                   <!--<weekDays>

                       <weekDay>Monday</weekDay>

                   </weekDays>-->

              </scheduleTrigger>

              <!--每隔多少时间执行一次-->

              <!--<intervalTrigger seconds="30" buildCondition="ForceBuild"/>-->

         </triggers>

 

         <!--每次下载完代码后要执行的任务,可以有

         * Build Publisher

 

         * Email Publisher

 

         * Executable Task

 

         * File Merge Task

 

         * ForceBuildPublisher

 

         * Modification Writer Task

 

         * MsBuild Task

 

         * NAnt Task

 

         * Null Task

 

         * NUnit Task

 

         * Visual Studio Task

 

         * Xml Log Publisher

        -->

         <tasks>

              <!--msbuild 自动编译任务-->

              <msbuild>

                   <!--msbuild的路径,一般在系统目录下-->

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

                   <workingDirectory></workingDirectory>

                   <!--解决方案文件,相对project workingDirectoryMSBuild会找到这个文件,并对它进行编译-->

                   <projectFile>code\*.sln</projectFile>

                   <!--编译参数-->

                   <buildArgs></buildArgs>

                   <!--编译的目录类型-->

                   <targets></targets>

                   <!--过期时间-->

                   <timeout>60</timeout>

                   <!--记录编译的详细日志,需要单独下载这个程序集,放在工作目录(workingDirectory)下,下载路径 http://ccnetlive.thoughtworks.com/MSBuildXmlLogger%2DBuilds/-->

                   <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>

              </msbuild>

         </tasks>

         <!--发布和部署配置-->

         <publishers>

              <!--下面的配置,会自将我源文件夹下的文件copy到指定的目录的版本标识(上面配置的labeller)的子目录下 如:e:\ccnet\publish\Shop\1\ e:\ccnet\publish\Shop\2\ 每一次生成都会递增-->

              <buildpublisher>

                   <sourceDir>e:\ccnet\code\Shop</sourceDir>

                   <publishDir>e:\ccnet\publish\Shop</publishDir>

              </buildpublisher>

              <buildpublisher>

                   <sourceDir>e:\ccnet\code\Manager</sourceDir>

                   <publishDir>e:\ccnet\publish\Manager</publishDir>

              </buildpublisher>

         </publishers>

     </project>

</cruisecontrol>

以上是对一个项目的进行监控的配置,当然也可以创建多个不同的项目。然后运行ccnet.exe每日构建就开始工作了,ccnet.exe.config文件是对当前的ccnet服务器工作环境的配置,不用进行修改就可以工作了,如果愿意可以配置监听端口号等等。

webdashboard目录,通过WEB的方式对当前的ccnet的工作情况进行反馈。不知道是不是我配置的问题,我只看到了一条错误信息。但是通过CCTray可以更加方便的监视和管理构建过程。安装完CCTray后,打开Setting配置卡File>Settings

ccnet1.jpg

单击右边的Add按钮,添加一个要监视的服务器。在这里可以设置构建,成功,失败等各种声音。

ccnet2.jpg

在下边的文本框中输入要监视的服务器,如果是默认端口号则不用输入端口号,否则需要“:”隔开输入端口号。如果添加成功,则会在右边的Project列表框中出现在当前ccnet服务器中存在的项目。OK返回到主窗口。

ccnet3.jpg

在主窗体中有显示当前的服务器状态,最后一个编译时间,最后一次版本号,下一次生成时间等。点下面的Force Build按钮还可以强制马上进行生成。

最后说明一点,MsBuild会根据当前的项目文件或解决方案文件对项目自动进行编译,而不需要写任何的配置文件。而在asp.net 2.0Web工程默认是一种新的Web Site模式,这样可能就会对编译造成Web工程产生一定的影响。所以推荐使用VS 2005Web Application Project Web工程模型。

CruiseControl.Net官方地址:

http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET

Web Application Web 请参阅:http://dflying.cnblogs.com/archive/2006/04/06/368203.html

关于MSBuild的更多介绍请查阅相关资料,或查看MSDN

ThoughtWorks.CruiseControl.MSBuild.dll

阿不 http://hjf1223.cnblogs.com
posted on 2006-04-13 21:32 阿不 阅读(6795) 评论(43)  编辑 收藏 所属分类: .Net相关技术

评论

#1楼  2006-04-14 08:41 Terrylee      
好东西:)
  回复  引用  查看    

#2楼  2006-04-15 20:15 sema      
不错!
  回复  引用  查看    

#3楼  2006-05-23 14:40 linna [未注册用户]
不错,谢谢了!
  回复  引用    

#4楼  2006-05-26 10:58 梁广永      
看看,
  回复  引用  查看    

#5楼 [楼主] 2006-06-01 19:01 阿不      
ThoughtWorks.CruiseControl.MSBuild.dll 需要在网上下载
  回复  引用  查看    

#6楼 [楼主] 2006-06-01 19:01 阿不      
上次在配置的时候还出现三个问题,今天重新做的时候没有注意到,这边也记录一下:
一、如果使用MSBuild任务的话,需要把ThoughtWorks.CruiseControl.MSBuild.dll文件拷贝到工作目录下才能正常编译。
二、如果提示找不到LC.exe,(在没有安装Vs 2005的机器执行每日构建)需要把lc.exe(在有安装VS 2005的安装目录下的Microsoft Visual Studio 8\SDK\v2.0\Bin)拷贝到对应的Microsoft Visual Studio 8\SDK\v2.0\Bin目录下,然后修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 下新增一个字符串值SDKInstallRootv2.0 指向系统目录的Microsoft Visual Studio 8\SDK\v2.0 目录(不能到bin目录)
三、使用VSS做为源码服务器必须安装VSS客户端。
  回复  引用  查看    

#7楼  2006-06-19 09:10 晓寒 [未注册用户]
ThoughtWorks.CruiseControl.MSBuild.dl在哪里可以下到?我下载的msbuild和ccnet中都没有包含这个dll。 希望能告知。
  回复  引用    

#8楼 [楼主] 2006-06-19 11:17 阿不      
@晓寒
在原文的最后已经提供了下载了。
  回复  引用  查看    

#9楼  2006-06-19 14:11 晓寒 [未注册用户]
非常感谢。

万事俱备,只欠‘东风’。 就是这个dll了。
  回复  引用    

#10楼  2006-06-19 14:11 晓寒 [未注册用户]
非常感谢。
  回复  引用    

#11楼  2006-09-15 19:32 qixiafeng [未注册用户]
您好,我是采用MsBuild对解决方案文件对项目自动进行编译的方式,编写了一个批处理文件,我现在的问题是,编译了以后,原来的aspx文件不见了,不知道您是否知道原因。我查了帮助,里面好象是说,要把解决方案文件中的Release.AspNetCompiler.Updateable设置为true,表示发布后允许修改,我试了,依然不行。

我的批处理脚本如下:
set solutionfile=D:\dailybuild\SPMS.MSBuild.sln
msbuild %solutionfile% /t:Rebuild /p:Configuration=Release >>D:\dailybuild\backlog\%DATEe%spmsbuild-log.txt

请指教。
  回复  引用    

#12楼 [楼主] 2006-09-15 23:24 阿不      
你是对什么样的工程进行编译呢?你查看一下aspx页面有没有在assembly里面?
  回复  引用  查看    

#13楼  2006-09-18 13:59 qixiafeng [未注册用户]
是一个WEB 工程。用VS编译可以完成编译,ASPX文件也都在,没有任何问题
  回复  引用    

#14楼 [楼主] 2006-09-19 08:40 阿不      
@qixiafeng
你是什么样的web工程,是VS 2005的Web site,还是Web application Project工程?如果是后者的话,可以用MSBuild直接编辑它的工程文件就行了。另外,在我的工程文件中没有Release.AspNetCompiler.Updateable这个设置,我的是WAP工程。
  回复  引用  查看    

#15楼  2006-09-30 10:58 liujj-xujj      
和Team System里的Team Build有异曲同工之妙。
  回复  引用  查看    

#16楼  2007-03-21 15:58 Jeffrey [未注册用户]
@阿不在原文提到"在webdashboard目录,通过WEB的方式对当前的ccnet的工作情况进行反馈。不知道是不是我配置的问题,我只看到了一条错误信息。"
这是因为没有将编译细节发布出来写到日志中.需要在ccnet.config中添加如下备置:
例:
<publishers>

<buildpublisher>

<sourceDir>e:\ccnet\code\Shop</sourceDir>

<publishDir>e:\ccnet\publish\Shop</publishDir>

<xmllogger logDir="BuildLog"></xmllogger>

</buildpublisher>



</publishers>



  回复  引用    

#17楼 [楼主] 2007-03-21 17:48 阿不      
@Jeffrey
谢谢。
  回复  引用  查看    

#18楼  2007-05-28 18:45 moonvan [未注册用户]
[ccnetProject:INFO] Task output: Js.sln : 解决方案文件 error MSB5010: 找不到文件格式头。 vs2005这个是什么原因?
  回复  引用    

#19楼 [楼主] 2007-05-30 08:32 阿不      
这估计是解决方案文件的格式不正确吧?你用VS能打开吗?
  回复  引用  查看    

#20楼  2007-06-11 09:43 bryanzk      
用msbuild来做编译,在ie 7.0中,查看Build Log和MSBuild Output速度如何?我现在一点这个选项,ie占到系统资源一下就50%多,而且要1分多钟才能看到输出,您遇到过这种问题么?
  回复  引用  查看    

#21楼 [楼主] 2007-06-11 09:48 阿不      
@ bryanzk
我没有遇到这样的问题。
  回复  引用  查看    

#22楼  2007-07-11 16:04 joyce [未注册用户]
使用SVN,会遇到诸如“Unable to load the output from svn”的问题,
查看错误信息时往往发现,因为log中有中文,<msg></msg>变成了?/msg>,直接导致了CCNET的异常,请问有什么方法能解决,而我又想在svn写中文
  回复  引用    

招聘兼职翻译、同传译员和外籍英文校对人员,不知道是否有时间。
希望有机会合作.
郭先生

北京华译网翻译公司
中国专家翻译网
地址:北京海淀区太阳园17号楼405室(北三环西路大钟寺东侧)邮编:100098
E-mail:bjctn@vip.sina.com
电话:010-82115891 82115892 传真010-82130386

  回复  引用    

#24楼  2007-08-27 14:08 小S [未注册用户]
发布文件时,可不可以过滤掉不想发布出来的文件?
  回复  引用    

#25楼 [楼主] 2007-08-28 15:12 阿不      
@小S
应该是可以的,你也可以自己写批处理文件来实现你的目的。
  回复  引用  查看    

#26楼  2007-09-12 18:54 戏水      
如果源代码管理使用svn做的怎么办呢?
  回复  引用  查看    

#27楼 [楼主] 2007-09-13 08:45 阿不      
CCNET有Subversion Source Control Block,就用这个就行了。
  回复  引用  查看    

#28楼  2007-09-17 17:23 中文ID [未注册用户]
Cruisecontrol就是配置太复杂,为什么不试一下R2Build,在sourceforge上一个新的build工具。
http://sourceforge.net/projects/r2build
  回复  引用    

解释的很详细,对于解决我的问题很有帮助,谢谢,谢谢。
  回复  引用    

#30楼  2008-03-10 04:38 古晶      
发现一个奇怪的问题哦,我在project加了publishExceptions="true"就启动不了服务,还有一个问题,怎么在这里Dashboard > local > ITWeb > 2008-03-10 04:37:15 (2008.03.10.009) 中显示我们要的错误信息的行号等信息呢
  回复  引用  查看    

#31楼 [楼主] 2008-03-10 08:35 阿不      
关于publishExceptions我不大清楚。
如果你通过Dashboard 可以查询详细的编译信息,在编译信息里面就会有错误信息了。
  回复  引用  查看    

#32楼  2008-03-10 09:55 古晶      
@阿不
这个设置了服务都启动不了,怎么查看呢,
所以只有看看别的途径了

  回复  引用  查看    

#33楼 [楼主] 2008-03-10 16:16 阿不      
@古晶
我不是使用服务模式的,我使用的是控制台模式
  回复  引用  查看    

#34楼  2008-03-10 16:29 古晶      
控制台使用模式的话直接一闪就没有了,只要加上那个Exception就不行了,
  回复  引用  查看    

#35楼 [楼主] 2008-03-10 16:32 阿不      
@古晶
你要看一下,那个控制台输出的是什么信息,要根本那个信息来找解决办法。
  回复  引用  查看    

#36楼  2008-03-10 19:27 古晶      
我也想看啊,它不让我看啊,晕呢,看看事件查看器的信息
无法启动服务。ThoughtWorks.CruiseControl.Core.Config.ConfigurationException: Unused node detected: publishExceptions="true"
在 ThoughtWorks.CruiseControl.Core.Config.DefaultConfigurationFileLoader.WarnOnInvalidNode(InvalidNodeEventArgs args)
在 ThoughtWorks.CruiseControl.Core.Config.NetReflectorConfigurationReader.HandleUnusedNode(InvalidNodeEventArgs args)
在 Exortech.NetReflector.InvalidNodeEventHandler.Invoke(InvalidNodeEventArgs args)
在 Exortech.NetReflector.NetReflectorTypeTable.OnInvalidNode(InvalidNodeEventArgs args)
在 Exortech.NetReflector.XmlTypeSerialiser.ReadMembers(XmlNode node, Object instance, NetReflectorTypeTable table)
在 Exortech.NetReflector.XmlTypeSerialiser.Read(XmlNode node, NetReflectorTypeTable table)
在 Exortech.NetReflector.NetReflectorReader.Read(XmlNode node)
在 ThoughtWorks.CruiseControl.Core.Config.NetReflectorConfigurationReader.Read(XmlDocument document)
在 ThoughtWorks.CruiseControl.Core.Config.DefaultConfigurationFileLoader.Load(FileInfo configFile)
在 Th...

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
  回复  引用  查看    

#37楼 [楼主] 2008-03-11 08:47 阿不      
@古晶
按照你的提示信息来看,publishExceptions属性并不是一个合法的节点。你去掉吧。
  回复  引用  查看    

#38楼  2008-03-11 09:05 古晶      
@阿不
晕,那这么说是现在版本已经不支持这个节点了,~~~感谢楼主的回复~~
  回复  引用  查看    

#39楼  2008-03-28 18:56 nicolas.c [未注册用户]
我着此配置的,当发现我不能通过dashboard来看buildlog,这是怎么回事啊,其他都正常,log其实也按照路径生成了,但就是link不上,有谁遇到过吗?谢谢
  回复  引用    

请问 错误 4 未能删除目标目录。请手动删除它或选择其他目标。 ASPNETCOMPILER 1 1 WebSite_deploy
怎么解决啊~~~~急

  回复  引用    

#41楼  2008-03-31 14:43 nididege [未注册用户]
@阿不
请问如何在buildpublisher时,先将原代码或者编译出来的DLL打包,再发布?
  回复  引用    

#42楼 [楼主] 2008-03-31 14:55 阿不      
@CAIniao123
使用WDP的时候,编译后会自动拷贝目录,如果目标目录无法删除则无法拷贝,所以会出错。
  回复  引用  查看    

#43楼 [楼主] 2008-03-31 14:56 阿不      
@CAIniao123
嗯,我也不清楚。不过你可以应该通过调用bat和vbscript文件来实现你的功能。
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-06-19 11:16 编辑过


相关链接: