• 每日构建(二)


          上一篇文章是简单的介绍了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>


     

  • 相关阅读:
    学号160809212姓名田京诚C语言程序设计实验2选择结构程序设计
    自我介绍
    Python中如何实现im2col和col2im函数(sliding类型)
    二维DCT变换
    android 进阶之android中隐藏的layout (抽屉)
    如何申请个人Google API Key用于Android真机上发布安装
    Android:在不同的Activity之间进行数据的共享
    Androi重写EditText改变边框
    activity添加ScrollView后onFling不起作用,无法滑动问题
    根据名称获去资源ID (反射)
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1576755.html
Copyright © 2020-2023  润新知