每日构建(二)

      上一篇文章是简单的介绍了ccnet的部分设置,已经完成的设置有:

          1:获取源代码 ,sourcecontrol 节点有所体现。推荐使用svn,感觉它在DOS下面调用会简单些。
          2:编译工程。tasks/msbuild,主要是让msbuilder来完成,其实msbuilder远不止这个编译功能,像网站的发布功能它都有。
          3:部署文件。tasks/nant。这正是这篇需要重点介绍的内容。

       nant工具功能非常全,也能获取完成获取源码和编译的工作,但这里我只应用它的部署文件功能。因为nant虽然功能强大,但均是DOS命令操作,用作主流程对普通用户来说有难度。

       nant最核心的就是它的build脚本文件了,这里简单的介绍下文件结构。

       1:build:XML格式,每个build文件包含一个project,project有若干target,每个target包含若干task  。但每个具体的task并不是包含在target标签中,而是平级关系。

       2:Projects:工程节点,相关属性如下:
          1>:name:工程名称。
          2>:default:指定默认的target。
          3>:basedir:设置build文件的父目录。 

       3:Targets:目标、对象,target是nant脚本具体执行动作的最小单位,包含一系列的task。相关属性如下:

          1>:name,任务名称。
          2>:depends,当前targets所依赖的target,支持多个,中间用","分开。
          3>:if,判断语句,如成立则执行此target。
          4>:unless,如果条件不成立则路过target。
          5>:description,相关描述。

      4:Properties:属性。一个project可能有多个属性。主要是用来定义一些全局变量。例如:

< property name = " base.dir "  value = ".. /../20091030_NationalDay/src "   />
< property name = " deploy.dir "  value = ".. /../deploy/web "   />

   
      5:Task:具体任务,即执行的具体代码块。例如:意思是把一个目录下的所有后缀为dll的文件复制到另外一个目录中。

< copy todir = " ${deploy.dir}/bin " >
     
< fileset basedir = " ${base.dir}/Hotel/bin/ " >
                
< include name = " *.dll "   />
            
</ fileset >
 
</ copy >

  
      之前已经说明过,我利用nant只用了它部署文件的功能,nant有一个非常好用的命令"copy",它只会复制比参考版本文件新的或者是不存在的文件。支持单个文件复制和文件夹的复制。这里正旧利用它的部署功能,可能把有修改的文件分别复制到你指定的目录中,目前有很多公司都喜欢把图片单独分开,形成一个独有域名,例如:image.a.com,图片文件和工程文件并不在一个目录下面,这里nant就能轻松胜任。
  

< copy todir = " ${deploy.dir}/resource/英文站点目录/flights/images/ " >
        
< fileset basedir = " ${base.dir}/Flights/Images/ " >
                
< include name = " *.jpg "   />
                
< include name = " *.jpeg "   />
                
< include name = " *.gif "   />
            
</ fileset >
    
</ copy >

  
      copy相关属性说明:
          1>:todir:复制到的目标文件夹路径。
          2>:fileset:源文件目录相关设置。
          3>:include:指包含某种规则的,例如包含所有.html的文件。
          4>:exclude:排除指定规则,例如不包含.cs的文件。

      如何运行nant, nant唯一的缺点就是它没有可操作的界面,需要通过dos命令来完成。在命令提示框中,进入到nant应用程序的目录,然后执行类似如下命令:

      Nant -buildfile:\bin\DeployScripts\Hotels\default.build

      nant如何和ccnet结合:上面都是介绍nant的用法,但ccnet中如何应用呢?ccnet很好的支持了nant的应用。具体体现了tasks/nant节点中。ccnet在编译完工程后就会调用nant应用程序,nant/buildFile是最好的体现。

      到此为此,我们已经实现了自动获取源码,自动编译,打包,但nant生成的包是一个包含了所有应用程序内容的包,当然cs之类的代码是不会有的,直接点就是只包含网站所需要的文件。我们部署时并不需要这么多的文件,因为有的文件根本就没有修改过,我们需要的只是有这一阶段有修改过的内容。这里我们需要利用ccnet配置中的publishers节点了,exec能执行相关脚本来完成后面的打包部署工作,我们来写一个批处理文件,通过调用win.rar来完成压缩。相关win.rar相关命令可以网上搜索下,这里为了实现增量包,利用了ta这个参数,即只关心这个时间之后修改过的文件。

 

shift
if  exist   " E:\deploy\Web_auto.rar "  del  / F E:\deploy\Web_auto.rar
" D:\Program Files\WinRAR\rar.exe "  A  - - ep1  - ta20090925000000 E:\deploy\Web_auto.rar  - AD 
E:\deploy\web

   
     至此,我们利用ccnet+svn+msbuilder+nant+winrar实现了获取源码,编译,打包自动化的工作,通过ccnet的管理平台,我们非常方面直接的进行打包的跟踪和管理。这里为了大家实现方便,我把我做的ccnet的配置文件贴出来供大家参考。

< cruisecontrol xmlns:cb = " urn:ccnet.config.builder " >
  
<!--  This  is  your CruiseControl.NET Server Configuration file. Add your projects below !   -->
  
<!--
        
< project name = " MyFirstProject "   />
    
-->
  
< project name = " 20091030_NationalDay "  queue = " Q2 "  queuePriority = " 2 " >
    
< webURL > http: // localhost/ccnet/ViewProjectReport.aspx</webURL>
     < workingDirectory > E:\20091030_NationalDay </ workingDirectory >
    
< artifactDirectory > E:\20091030_NationalDay\log </ artifactDirectory >
    
< modificationDelaySeconds > 10 </ modificationDelaySeconds >

    
< sourcecontrol type = " svn " >
      
< trunkUrl > svn路径 </ trunkUrl >
      
< workingDirectory > E:\20091030_NationalDay </ workingDirectory >
      
< executable > D:\Program Files\VisualSVN\bin\svn.exe </ executable >
      
< username > svn用户名 </ username >
      
< password > svn用户密码 </ password >
      
< timeout units = " hours " > 1 </ timeout >
      
< cleanUp > true </ cleanUp >
    
</ sourcecontrol >

    
< triggers >
      
< intervalTrigger name = " continuous "  seconds = " 6000 "   />
    
</ triggers >

    
< tasks >
      
< modificationWriter >
        
< filename > svnchangelist.xml </ filename >
        
< path > E:\20091030_NationalDay </ path >
        
< appendTimeStamp > True </ appendTimeStamp >
      
</ modificationWriter >

      
< modificationReader >
        
< filename > svnchangelist.xml </ filename >
        
< path > E:\20091030_NationalDay </ path >
      
</ modificationReader >

      
< msbuild >
        
< executable > C:\Windows\Microsoft.NET\Framework\v3. 5 \MSBuild.exe </ executable >
        
< workingDirectory > 解决方案所在目录 </ workingDirectory >
        
< projectFile > Hotel.sln </ projectFile >
        
< buildArgs >/ noconsolelogger  / p:Configuration = Release  / v:diag </ buildArgs >
        
< timeout > 900 </ timeout >
        
< logger > D:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll </ logger >
      
</ msbuild >

      
< nant >
        
< executable > E:\bin\nant.exe </ executable >
        
< baseDirectory > E:\20091030_NationalDay </ baseDirectory >
        
< buildArgs >- D:cvs.executable = E:\bin\DeployScripts\deploy.bat </ buildArgs >

        
< nologo > false </ nologo >
        
< buildFile > E:\bin\DeployScripts\Hotels\ default .build </ buildFile >
       
        
< targetList >
          
< target > run </ target >
        
</ targetList >
        
< buildTimeoutSeconds > 1200 </ buildTimeoutSeconds >
      
</ nant >

    
</ tasks >

    
< publishers >
      
< exec >
        
< executable > deploy.bat </ executable >
        
< baseDirectory > D:\Program Files\CruiseControl.NET\ </ baseDirectory >
        
< buildArgs > EL_Online_V36_03.01_200910 </ buildArgs >
      
</ exec >
      
< modificationHistory onlyLogWhenChangesFound = " true "   />
      
< rss items = " 30 "   />
      
< statistics  />


      
< xmllogger logDir = " E:\20091030_NationalDay\buildlogs\  "   />

      
< email from = " [email protected] "  includeDetails = " TRUE "  mailhost = " 邮件服务器地址 " >
        
< users >
          
< user address = " 接收邮件地址 "  group = " buildmaster "  name = " min.jiang "   />
        
</ users >
        
< groups >
          
< group name = " developers "  notification = " always "   />
          
< group name = " buildmaster "  notification = " always "   />
        
</ groups >
        
< modifierNotificationTypes >
          
< NotificationType > Failed </ NotificationType >
          
< NotificationType > Fixed </ NotificationType >
        
</ modifierNotificationTypes >

        
< subjectSettings >
          
< subject buildResult = " StillBroken "  value = " Build is still broken for 20091030_NationalDay "   />
        
</ subjectSettings >
      
</ email >

    
</ publishers >

  
</ project >
</ cruisecontrol >


 

你可能感兴趣的:(构建)