zoukankan      html  css  js  c++  java
  • Discuz!NT持续集成实战

    摘要:本文记述Discuz!NT项目实施持续集成的实施过程,并把过程中遇到的问题原样展现,并提供解决方法,以供后来者参考。

    关键字:CruiseControl.net  持续集成(Continuous Integration)  每日构建 (DailyBuild) Discuz!NT  SVN

    操作系统: win2003 

    版本控制: Subversion

    程序编译:  MSBuild

    代码规范检查:Fxcop

    • 目标:从 SVN 中取出源代码到 e:\source ,编译后发布项目到 e:\publish ,可直接在 IIS 中运行。
                编译状态发送email通知相关人员。
    • 软件环境 :(以下软件的安装过程非常简单,基本上一路 Next 就可以了。)
      1.  CruiseControl.net  
        下载:ccnet.thoughtworks.com
        安装目录:c:\C:\Program Files\
      2. Fxcop
        下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&DisplayLang=en
        安装目录: c:\Program Files\Microsoft FxCop 1.36
      3. Subversion  (SVN) 下载:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
        安装目录:c:\Program Files\  
    • 环境配置
      主要的配置文件有三个分别是:
      配置文件 说明 文件位置 生成方式
      ccnet.config 配置CruiseControl.net   已经存在
      DailyBuild.msbuild 配置MSBuild编译目标项目   手动生成
      DiscuzNT.DailyBuild.FxCop 配置Fxcop的检查目标 E:\DailyBuild\DiscuzNT.DailyBuild.FxCop Fxcop工具生成
      publish.bat 用户发布的批处理   手动生成
      filelist.txt 对publish.bat的配置   手动生成
    • 配置CruiseControl.net (编辑CruiseControl.net的配置文件 ccnet.config,其内容如下)
      <cruisecontrol> 
       
          <project name="Discuz!NT3" webURL="http://10.0.3.4/ccnet/server/local/project/Discuz!NT3/ViewLatestBuildReport.aspx"> 
       
              <workingDirectory >e:\source</workingDirectory> 
       
              <artifactDirectory>E:\DailyBuild\Log\3</artifactDirectory>   <!-- 编译日志生成路径 -->
       
              <labeller type="dateLabeller"></labeller> 
                  <sourcecontrol type="svn">   <!-- 版本控制系统的类型 -->
                      <trunkUrl>https://code.comsenz.com/</trunkUrl>   <!-- SVN的地址 -->
                      <workingDirectory>e:\source</workingDirectory>   <!-- 把源代码检出到该目录 -->
                      <executable>c:\Program Files\Subversion\bin\svn.exe</executable>   <!-- svn.exe所在路径 -->
                      <username>svnuser</username>   <!-- 登录svn的用户名和密码 -->
                      <password>123</password>
                  </sourcecontrol>
       
                  <tasks>
                      <exec>
                          <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>   <!-- MSBuild.exe 文件所在路径 -->
                              <baseDirectory>e:\source</baseDirectory>   <!-- 对 e:\source 目录下的内容进行编译,实际上是解决方案文件或者msbuild文件所在目录-->
                              <buildArgs>DailyBuild.msbuild /p:Configuration=Debug /v:q</buildArgs>  <!-- 编译参数 不懂的查MSBuild的帮助 -->
                              <buildTimeoutSeconds>1200</buildTimeoutSeconds> <!-- 编译超时时间 -->
                      </exec >    
       
                      <exec executable="E:\DailyBuild\publish.bat"/> <!-- 编译后执行的批处理文件路径,该批处理文件用于项目发布 -->
       
                      <merge>  <!-- 此节用于合并Fxcop生成的日志 到 编译日志里,最终作为Build Report -->
                          <files> 
                              <file>E:\DailyBuild\log\3\DailyBuild.FxCop.xml</file> <!-- 该文件的名字是在 publish.bat 中 FxCopCmd命令的参数中指定的 -->
                          </files> 
                      </merge> 
                  </tasks>
       
                  <publishers>
                      <xmllogger logDir="E:\DailyBuild\Log\3\buildlogs" />  <!-- 编译日志存放路径 -->
                      <!-- 下面设置编译报告通过email通知相关人员 详细信息参考cc.net的帮助-->
                      <email from="admin@163.com" mailhost="smtp.163.com" mailhostUsername="admin" mailhostPassword="123" includeDetails="true">
                          <users>
                              <user name="dachuan" group="buildmaster" address="dachuan@163.com"/>
                          </users>
                          <groups>
                              <group name="buildmaster" notification="always"/>
                          </groups>
                      </email>
                  </publishers>
       
                  <triggers>  <!-- 该触发器控制周一到周五的23点到0点的时间段内进行编译,每900秒检查一次svn有无更新 ,如果有就取出并编译-->
                      <filterTrigger startTime="08:00" endTime="23:00">
                          <trigger type="filterTrigger" startTime="23:00:00" endTime="23:59:59">
                              <trigger type="intervalTrigger" name="continuous" seconds="900" />
                              <weekDays>
                                  <weekDay>Saturday</weekDay>
                                  <weekDay>Sunday</weekDay>
                              </weekDays>
                          </trigger>
                      </filterTrigger>
                  </triggers>
          </project>
       
      </cruisecontrol> 
       
    • 配置MSBuild  (将MSBuild的配置文件DailyBuild.msbuild 放到和VS解决方案文件同级目录中,其内容如下)
      <!-- 该文件与VS解决方案文件在同一目录 --> 
      <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
          <Target Name="Build"> 
              <MSBuild Projects="Discuz_vs08.sln" Targets="Clean;Rebuild"/> 
          </Target> 
      </Project> 
    • 配置DiscuzNT.DailyBuild.FxCop

      FxCop的配置文件DiscuzNT.DailyBuild.FxCop可以通过FxCop的GUI工具生成,保存到E:\DailyBuild目录下。主要是选择检查目标然后选择配置文件保存位置,这个在此不详述。
    • 编写发布批处理 publish.bat 内容如下:
      xcopy e:\source e:\publish /E /y /D /EXCLUDE:E:\DailyBuild\filelist.txt
       
      cd c:\Program Files\Microsoft FxCop 1.36 
       
      c:
       
      FxCopCmd /project:E:\DailyBuild\DiscuzNT.DailyBuild.FxCop /out:E:\DailyBuild\log\3\DailyBuild.FxCop.xml
         
      其中xcopy的参数 /D 指定了不复制修改日期相同的文件,这样就只把原时间比目标文件新的文件复制过来,减少了复制压力。 /EXCLUDE参数中指定的filelist.txt文件中记录的是不需要复制的目录或文件,具体用法网上有很多资料。 其内容如下:
      .cs\
      \_svn
      \.svn
      .csproj\
      .sln\
      .pdb\
      .bat\
      filelist.txt
      .bak\
      .user\
      obj\
      dnt.config\
    其中有个技巧,例如 .cs\  这个包含一个"\" ,如果不写这个"\",那么所要文件名中包含"cs"的文件都不会被复制,
    因此,本来我只是想不复制.cs文件,可是却连.css文件也不复制了。 为了解决这个问题.cs后面需要一个"\"。
    • 常见问题
      1. 编译成功能收到email通知,可是编译失败时却没有email通知

        答:这个常见问题是因为 把<email>配置节写在了<tasks>配置节里面,这样当编译失败时,流程从<tasks>中跳出,导致后面的<email>根本没有执行,解决方法就是把<email> 放到 <publishers> 下。
      2. 生成的日志文件过大,在浏览器中查看build report的时候,浏览器就死掉了

        答:注意MSBuild的编译参数 <buildArgs>DailyBuild.msbuild /p:Configuration=Debug /v:q</buildArgs>  其中 /v:q 指定了输出日志的级别,自己查看一下MSBuild的/v参数的说明就明白了。

    后记:有了DailyBuild,我们可以在开发人员提交修改后,立刻生成一个可测试版本发布到IIS中,然后展示给用户看也好,开展黑盒测试也好,都非常方便,而且使用CruiseControl.net 可以把单元测试也加入进来,这样每次编译后,自动生成单元测试报告,编码规范报告,真的是非常的方便。本文并没有介绍如何加入单元测试,一是由于我自己还没有实践配置过,一是我的朋友博客园的jillzhang 同学已经写了教程。

    特别感谢:jillzhang  和 紫色阴影  这两位 诲人不倦 ,古道热肠 的朋友 。

    参考文献:

    如何用CruiseControl.Net来进行持续化集成

    持续集成简介

  • 相关阅读:
    六、Prototype 原型(创建型模式)
    七、Adapter 适配器(结构型模式)
    java weblogic 数据源 配置
    ExtJs便签
    js初步学习
    解决weblogic的oracle驱动问题
    ExtJs函数
    从一个空表中获取N条数据
    诡异的编码和字节长度
    SQL SERVER 中的日期时间
  • 原文地址:https://www.cnblogs.com/zjneter/p/1202235.html
Copyright © 2011-2022 走看看