现在的位置: 首页 > 综合 > 正文

每日构建(二)

2012年06月30日 ⁄ 综合 ⁄ 共 6007字 ⁄ 字号 评论关闭

      上一篇文章是简单的介绍了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="CcErr@com.cn" 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>

 

抱歉!评论已关闭.