子夜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
1、什么是持续集成及相关工具
大师Martin Fowler对持续集成是这样定义的:
 
持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少

集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,

发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少

集成的问题,让团队能够更快的开发内聚的软件。
 
一些原则:
1. 所有的开发人员需要在本地机器上做本地构建,然后再提交的版本控制库中,从而确保他

们的变更不会导致持续集成失败。
2. 开发人员每天至少向版本控制库中提交一次代码。
3. 开发人员每天至少需要从版本控制库中更新一次代码到本地机器。
4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构建。
5. 每次构建都要100%通过。
6. 每次构建都可以生成可发布的产品。
7. 修复失败的构建是优先级最高的事情。

持续集成工具:
主要有cruisecontrol.net(开源)和vsts(微软)

cc.net说明:
它是cruisecontrol的.net版本。本软件开源免费。
它只是一个持续集成中的一个架构性软件。它要和其它相关软件结合使用才能发挥作用。
如版本管理工具svn、编译工具msbuild、代码检查工具fxCop、单元测试工具nuit.net
cc.net负责把这些工具串连起来共同作用。




2、安装

cc.net 分服务器软件和客户端软件
环境:

服务器端:
安装.net FrameWork:具体版本根据cc.net的版本而定。
安装IIS:cc.net包含WEB应用

环境很重要,我就吃了这个苦头,一开始照着其他人的方法,就是执行不了,原来是我公司的

机器的环境有些问题,没装iis。后来装了iis,iis还是有问题,没有办法,只好用自己的笔

记本重新安装了环境。
 
安装顺序:IIS->.NET->others
 
首先安装IIS,用测试页面检测IIS无误后,安装VS2005,然后再安装cruisecontrol.net,从

控制面板进入IIS控制界 面。检查有无名为ccnet的虚拟目录,如果有正常,右键浏览,应该

可以看到cruisecontrol.net的default页面。
 
环境很重要,我就吃了这个苦头,一开始照着其他人的方法,就是执行不了,原来是我公司的

机器的环境有些问题,没装iis。后来装了iis,iis还是有问题,没有办法,只好用自己的笔

记本重新安装了环境。
 
安装顺序:IIS->.NET->others
 
首先安装IIS,用测试页面检测IIS无误后,安装VS2005,然后再安装cruisecontrol.net,从

控制面板进入IIS控制界 面。检查有无名为ccnet的虚拟目录,如果有正常,右键浏览,应该

可以看到cruisecontrol.net的default页面。
 

客户端:
安装.net FrameWork:具体版本根据cc.net的版本而定。

然后安装CruiseControl.NET Tray【以下简称CCTray】来监视每次提交后的编译状态。
CCTray是一个工具,通过它可以强制执行编译,当然也可以自动编译,然后查看编译的结果。
 
在服务中找到【cruisecontrol.net server】这项,并启动他。
 
注意:如果想用浏览器查看cruisecontrol界面,必须关闭迅雷等占用8080端口的程序。

 

3、配置(CruiseControl.Net+SVN+MSBuild自动编译环境)


配置CruiseControl.NET安装目录下(我的机器上是:C:\Program

Files\CruiseControl.NET\server)下的ccnet.config文件,此文件是指定

cruisecontrol.net 怎么运行的,文件中是有关于cruisecontrol.net 的配置。

注意:每次改动了ccnet.config文件的话,都要重启【cruisecontrol.net server】服务。


我使用的版本管理器是SVN 1.63 ,编译工具是MSBuild 2010,代码检查工具FXCop1.35,

我写了一个最简单的:

<cruisecontrol>
<project name="Painter">
<triggers>
<intervalTrigger seconds="10"/>
</triggers>
<webURL>http://127.0.0.1/ccnet</webURL>
<artifactDirectory>f:</artifactDirectory>
<sourcecontrol type="svn" autoGetSource="true">
<executable>C:\Program Files\Subversion\bin\svn.exe</executable>
<username>liuli</username>
<password>liuli</password>
<trunkUrl>svn://192.168.1.100/reponsity/</trunkUrl>
<workingDirectory>d:\tmp\</workingDirectory>
</sourcecontrol>
<tasks>
<msbuild>
<executable>C:\windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
<workingDirectory>D:\tmp\build</workingDirectory>
<projectFile>Painter.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug</buildArgs>
<timeout>15</timeout>

</msbuild>
</tasks>
</project>
</cruisecontrol>

 
说明:
<project>项目节点,支持多个项目
<sourcecontrol></sourcecontrol>之间写的是从服务器上获得代码的过程,具体指定使用的

是哪种源代码管理工具。

<triggers> </triggers>是触发器。

这两个加起来的作用是:每个10秒中检测服务器上代码是否有改动,如果有,则更新文件到客

户端。

 <tasks>是任务

<msbuild>是要进行编译的任务,msbuild还有发布的功能,后面的例子中会有说明



我的项目配置说明:

我有两个项目进行持续集成。一个test web应用,一个解决方案内有多个子项目。
要求:每个项目能够自动从源代码管理器svn中获取最新代码,然后进行编译,进行代码检查

,最后进行发布。
配置文件如下:

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="TestSystem" queuePriority="0">
    <workingDirectory>C:\DailyBuild</workingDirectory>
    <artifactDirectory>C:\DailyBuild\log\buildlogs</artifactDirectory>
   

<webURL>http://192.168.0.151/ccnet/server/local/project/TestSystem/ViewProjectRepo

rt.aspx</webURL>
    <modificationDelaySeconds>2</modificationDelaySeconds>
    <sourcecontrol type="svn">
      <trunkUrl>http://192.168.0.151:8080/svn/test</trunkUrl>
      <workingDirectory>C:\DailyBuild\test</workingDirectory>
      <executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
      <username>admin</username>
      <password>123456</password>
      <autoGetSource>True</autoGetSource>
    </sourcecontrol>
    <triggers>
      <intervalTrigger name="myTriger" seconds="6000"

buildCondition="IfModificationExists" />
    </triggers>
    <tasks>
      <msbuild>
        <executable>C:\windows\Microsoft.NET\Framework\v4.0.30319

\MSBuild.exe</executable>
        <workingDirectory>C:\DailyBuild\test</workingDirectory>
        <projectFile>WebApplication2.csproj</projectFile>
        <buildArgs>/t:ResolveReferences;Compile /t:_CopyWebApplication

/p:Configuration=Release /p:WebProjectOutputDir=C:\publish

/p:OutputPath=C:\publish\bin /v:diag</buildArgs>
        <targets>Build</targets>
        <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program

Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>180</timeout>
      </msbuild>

    <exec>
        <executable>C:\Program Files\Microsoft FxCop 1.35

\FxCopCmd.exe</executable>
        <baseDirectory>C:\DailyBuild\fxCops\</baseDirectory>
        <buildArgs>/p:"test.FxCop"

/out:"C:\DailyBuild\log\buildlogs\FxCop-results.xml" /gac</buildArgs>
        <buildTimeoutSeconds>120</buildTimeoutSeconds>
   </exec>

    </tasks>
    <publishers>
    <merge>
        <files>
            <file>C:\DailyBuild\log\buildlogs\FxCop-results.xml</file>
        </files>
    </merge>
    <xmllogger logDir="C:\DailyBuild\log\buildlogs\"></xmllogger>

      <email mailhost="192.168.0.2" from="Sysuser@eastsim.mail">
        <mailhostUsername>Sysuser@eastsim.mail</mailhostUsername>
        <mailhostPassword>BestSim</mailhostPassword>
        <includeDetails>True</includeDetails>
        <users>
          <user name="zhaoshiyuan" address="zsy@eastsim.mail" group="webGroup" />
          <user name="yangtao" address="yt@eastsim.mail" group="webGroup"

/>       
        </users>
        <groups>
          <group name="webGroup"  />
        </groups>
        <modifierNotificationTypes>
          <NotificationType>Always</NotificationType>
        </modifierNotificationTypes>
      </email>
    </publishers>
    <state type="state" directory="C:\DailyBuild\CCState" />
    <labeller type="dateLabeller" />
  </project>
 
  <project name="FrameWorkSystem" queuePriority="0">
    <workingDirectory>C:\DailyBuild</workingDirectory>
    <artifactDirectory>C:\DailyBuild\log\FrameWorkLogs\</artifactDirectory>
   

<webURL>http://192.168.0.151/ccnet/server/local/project/FrameWorkSystem/ViewProjec

tReport.aspx</webURL>
    <modificationDelaySeconds>2</modificationDelaySeconds>
    <sourcecontrol type="svn">
      <trunkUrl>http://192.168.0.151:8080/svn/FrameWork</trunkUrl>
      <workingDirectory>C:\DailyBuild\FrameWork</workingDirectory>
      <executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
      <username>admin</username>
      <password>123456</password>
      <autoGetSource>True</autoGetSource>
    </sourcecontrol>
    <triggers>
      <intervalTrigger name="myTriger" seconds="6000"

buildCondition="IfModificationExists" />
    </triggers>
    <tasks>
    <msbuild>
        <executable>C:\windows\Microsoft.NET\Framework\v4.0.30319

\MSBuild.exe</executable>
        <workingDirectory>C:\DailyBuild\FrameWork\SQLServerDAL\</workingDirectory>
        <projectFile>FrameWork.SQLServerDAL.csproj</projectFile>
        <buildArgs>/t:build /p:Configuration=Release

/p:OutputPath=C:\publish\FrameWork\bin /v:diag</buildArgs>
        <targets>Build</targets>
        <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program

Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>120</timeout>
    </msbuild>
   
      <msbuild>
        <executable>C:\windows\Microsoft.NET\Framework\v4.0.30319

\MSBuild.exe</executable>
        <workingDirectory>C:\DailyBuild\FrameWork\WebManage\</workingDirectory>
        <projectFile>FrameWork.WebManage.csproj</projectFile>
        <buildArgs>/t:ResolveReferences;build /t:_CopyWebApplication

/p:Configuration=Release /p:WebProjectOutputDir=C:\publish\FrameWork\

/p:OutputPath=C:\publish\FrameWork\bin /v:diag</buildArgs>
        <targets>Build</targets>
        <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program

Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>600</timeout>
      </msbuild>-->
<!--
    <exec>
        <executable>C:\Program Files\Microsoft FxCop 1.35

\FxCopCmd.exe</executable>
        <baseDirectory>C:\DailyBuild\fxCops\</baseDirectory>
        <buildArgs>/p:"FrameWork.FxCop"

/out:"C:\DailyBuild\log\FrameWorklogs\FxCop-results.xml" /gac</buildArgs>
        <buildTimeoutSeconds>120</buildTimeoutSeconds>
   </exec>
-->
    </tasks>
    <publishers>
    <merge>
        <files>
        <!--
            <file>C:\DailyBuild\log\FrameWorklogs\FxCop-

results.xml</file> -->
        </files>
    </merge>
    <xmllogger logDir="C:\DailyBuild\log\FrameWorklogs\"></xmllogger>

      <email mailhost="192.168.0.2" from="Sysuser@eastsim.mail">
        <mailhostUsername>Sysuser@eastsim.mail</mailhostUsername>
        <mailhostPassword>BestSim</mailhostPassword>
        <includeDetails>True</includeDetails>
        <users>
          <user name="zhaoshiyuan" address="zsy@eastsim.mail" group="webGroup" />
          <!--<user name="yangtao" address="yt@eastsim.mail"

group="webGroup" />    -->   
        </users>
        <groups>
          <group name="webGroup"  />
        </groups>
        <modifierNotificationTypes>
          <NotificationType>Always</NotificationType>
        </modifierNotificationTypes>
      </email>
    </publishers>
    <state type="state" directory="C:\DailyBuild\CCState" />
    <labeller type="dateLabeller" />
  </project>
 
</cruisecontrol>

说明:
第一个projectTestSystem。是个测试项目,web应用程序。
<workingDirectory>工作目录
<artifactDirectory>项目日志输出目录
<sourcecontrol type="svn">指定源代码管理器为svn.
<trunkUrl>http://192.168.0.151:8080/svn/test</trunkUrl>项目源代码地址
【注意了】在这个地方我花了多少时间来配置。
1)、网上大多的svn配置都是老版本。地址类型为svn:XXX/XXX。而我的svn为1.63版本,使用

的是WEB发布方式,地址类型为http://server.cm/svn/xxxx。
这个地址就是svn项目的地址。
2)、默认使用SSH(https)。但我搞半天也没搞清楚。就改Svn配置,直接使用http了。

<triggers>我使用每隔6000秒检查一次是否有新版本,如果有就签出新版本,进行编译,发布

等。
<msbuild>:负责编译,发布。。
关于发布使用这两个属性就完全搞定了
/t:ResolveReferences  :指定编译包含的引用
/t:_CopyWebApplication:指定发布,拷贝web应用文件
/p:WebProjectOutputDir=C:\publish\FrameWork\ :指定拷贝地址
/p:OutputPath=C:\publish\FrameWork\bin :指定编译后的bin输出地址


<email>指定集成结果发送邮件到指定用户邮件中

第二个project。此包含7个类项目,一个web项目,但最后要发布是web项目。
此处要注意两点:
1)、项目之间的引用最好使用项目引用方式,不要直接引用dll。这样就可以只编译web项目。

msbuild会自己编译引用的其它项目。
2)、有3个类项目没有被web项目直接引用。使用的反射机制。所以编译web项目时,不会自动

编译这三个项目。但这三个项目中有一个引用了另两个。最后再多编译一个项目就行了。如上

我有两个<msbuild>节



4、注意事项及常见问题
1)、清楚项目间的引用关系
2)、间接引用项目的输出路径要指定到发布后的相关位置上。


5、相关资源

1)cc.net官网地址:
http://sourceforge.net/projects/ccnet/
2)cc.net参考手册

3)ccnet.config的配置工具
 http://ccnetconfig.codeplex.com/
4)其它参考
介绍比较全的文章
 http://tech.it168.com/m/2008-05-04/200805042108206.shtml
http://kb.cnblogs.com/a/1512017/
posted on 2011-04-01 16:36  子夜  阅读(1133)  评论(0编辑  收藏  举报