DotNet 笔记

东方欲晓,莫道君起早。

.Net可持续化集成(CruiseControl.Net的使用)

一、概念

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

二、工具

1:CruiseControl.NET,是一个自动化的持续集成服务器,使用.NETFramework实现。官网下载地址:下载  本地下载:下载

2:.NetFramework环境以及IIS环境(因为我是开发的电脑,上面装的又开发工具vs2013,所以我什么环境都有)

3:svnsever端安装文件。

以上环境逐一安装和准备,不分先后顺序。

三、安装,找一台服务器,对以下环境软件进行安装

1:在服务器端进行CruiseControl.NET安装后,会自动安装一个叫做“CruiseControl.NET Server”的windows服务以及在IIS默认网站下面生成一个名字叫ccnet网站 

a: windows服务 主要是用来根据【配置文件】执行任务的:如自动通过svn checkout 项目,执行msbuild.exe,还会监听一个服务端口让自己网站调用(不用管,看不见,咱们也用不到)等等

b: ccnet网站 提供了一个可视化项目管理界面。

2:.NetFramework

.net环境的安装几乎就是下一步>下一步>...完成。

3:svn server

svn server的安装几乎就是下一步>下一步>...完成。

四、启动windows服务,用浏览器打开ccnet网站。

五、配置文件

1:我准备了一个解决方案,解决方案下面含一个 bll项目,一个网站项目和一个单元测试项目。项目关系如图:

2:把当前解决方案放入svn内,就可以开始配置了。CruiseControl对项目进行可持续化集成的目标功能:

a:SVN获取修改的代码

b:msbuild.exe编译整个解决方案

c:msbuild.exe生成单元测试项目的dll到指定目录

d:mstest.exe进行自动执行单元测试dll

e:msbuild.exe生成web到指定的目录

f:发布网站到指定的目录

e:邮件通知

3:准备

a:你要知道ccnet网站的访问URL。

b:准备一个目录,用来存放日志文件。

c:项目代码的Svn地址和Svn账号密码。svn的可执行文件路径。

d:svn代码检出目录。网站生成目录。项目发布目录。单元测试生成目录。

e:两个邮箱,一个测试发邮件,一个用来测试收邮件。

4:之所以用CruiseControl,就是因为所有的以上功能他都可以完成。咱们只需要写好配置文件就行了。

我的配置文件如下:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">

  <!--可以有多个,但是name需要唯一-->
  <project name="WorkDemo">
    <!--集成报告的URL(自动生成的iis下ccnet网站的访问url),一个让用户看到的管理界面(十分丑)-->
    <webURL>http://localhost:8111/ccnet/</webURL>
    <!--集成的日志,对这个项目的监控过程的日志记录目录, 需要确保文件夹路径存在-->
    <artifactDirectory>C:\Program Files (x86)\CruiseControl.NET\log</artifactDirectory>
    <!--源码修改后延迟多少秒执行集成-->
    <modificationDelaySeconds>3</modificationDelaySeconds>
    <!--每次编译标记-->
    <!--Date Labeller   生成如下格式yyyy.mm.dd.build-->
    <labeller type="dateLabeller" />
    <!--引起集成编译的触发器-->
    <triggers>
      <!--
      name: trigger的名字,可以随便起,
      seconds: 两次集成的时间间隔
      buildCondition: IfModificationExists,只有源码有修改才运行  —— 好像没填这个就是默认
      ForceBuild,不管有无修改都运行
      -->
      <intervalTrigger name="intervalTrigger1" initialSeconds="0" seconds="10" buildCondition="IfModificationExists"/>

    </triggers>

    <!--源码控制器配置-->
    <sourcecontrol type="svn" autoGetSource="true">
      <!--该项目的SVN路径-->
      <trunkUrl>https://szcb:8443/svn/CCnetTest/trunk</trunkUrl>
      <!--配置的这个目录将作为CruiseControl.NET的工作目 录,CruiseControl.NET会将代码从SVN中 check out到这个目录中.-->
      <workingDirectory>C:\Program Files (x86)\CruiseControl.NET\workspaces\PCcnetTest</workingDirectory>
      <!--机器上的SVN服务端的可执行文件路径-->
      <executable>C:\Program Files (x86)\VisualSVN Server\bin\svn.exe</executable>
      <!--SVN的用户名与密码-->
      <username>zfy</username>
      <password>zfy</password>
    </sourcecontrol>

    <!--注意:tasks中的节点是按照顺序执行的-->
    <!--本例中顺序:编译整个解决方案>>>生成单元测试项目>>>执行单元测试>>>生成web项目>>>拷贝生成的web到发布目录 -->
    <tasks>

      <!--编译解决方案-->
      <!--自定义msbuild:用来编译整个解决方案下的所有项目(只是编译生成)-->
      <msbuild>
        <!-- if you want the task to fail, ping an unknown server -->
        <executable>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe</executable>
        <!-- svn检出后,projectFile节点说指定的文件(本例中:PCcnetTest.sln)所在的目录路径-->
        <workingDirectory>C:\Program Files (x86)\CruiseControl.NET\workspaces\PCcnetTest</workingDirectory>

        <projectFile>PCcnetTest.sln</projectFile>
        <!--
        <buildArgs>/noconsolelogger /p:VisualStudioVersion=12.0 /p:Configuration=Debug /v:diag</buildArgs>
        <buildArgs> /p:VisualStudioVersion=12.0 /v:diag /p:OutputPath=F:\发布\PCcnetTest</buildArgs>
        -->
        <!--注意:/p:OutputPath只能指定一个项目的输出文件-->
        <!--注意:一般情况,一个解决方案下面有多个项目,因为本msbuild节点编译的是整个解决方案,所以无法使用/p:OutputPath-->
        <buildArgs>/p:VisualStudioVersion=12.0 /v:diag </buildArgs>
        <targets>Build</targets>
        <!-- build的超时时间-->
        <timeout>900</timeout>
        <!--记录编译日志-->
        <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
      </msbuild>


      <!--生成测试项目-->
      <!--自定义msbuild:用来编译并输出测试项目(输出生成文件是为执行测试做准备), 把“输出项目”生成到OutputPath中,本示例是一个单元测试项目-->
      <!--自定义msbuild:如果不是为了执行单元测试项目项目的dll,完全不需要此msbuild节点-->
      <msbuild>
        <!-- MSBuild.exe路径-->
        <executable>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe</executable>
        <!-- svn检出后,projectFile节点说指定的文件(本例中:UnitTestProject.csproj)所在的目录路径-->
        <workingDirectory>C:\Program Files (x86)\CruiseControl.NET\workspaces\PCcnetTest\UnitTestProject</workingDirectory>
        <!-- 项目的sln或csproj文件名-->
        <projectFile>UnitTestProject.csproj</projectFile>
        <!--注意:OutputPath内容如果有空格,必须使用引号括起来-->
        <!--生成单元测试项目dll到指定的目录中-->
        <buildArgs>/p:VisualStudioVersion=12.0 /v:diag /p:OutputPath="C:\Program Files (x86)\CruiseControl.NET\发布\PCcnetTest\测试项目"</buildArgs>

        <targets>Build</targets>
        <!-- 项目的build的超时时间-->
        <timeout>900</timeout>
        <!--CruiseControl.NET处理日志的dll文件(安装后,该文件在安装目录内)-->
        <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
      </msbuild>

      <!--执行测试项目-->
      <exec>
        <!--MSTest的路径-->
        <executable>D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest.exe</executable>
        <!--工作目录,就是上一步的单元测试项目生成文件的所在目录-->
        <baseDirectory>C:\Program Files (x86)\CruiseControl.NET\发布\PCcnetTest\测试项目</baseDirectory>
        <!--执行MSTest的参数,以及被执行的dll文件-->
        <buildArgs>
          /testcontainer:UnitTestProject.dll
        </buildArgs>
        <!--执行MSTest的超时-->
        <buildTimeoutSeconds>120</buildTimeoutSeconds>
      </exec>


      <!--生成web项目-->
      <!--自定义msbuild:用来编译并输出(输出生成文件是为发布做准备), 把“输出项目”生成到OutputPath中,本示例是一个web项目-->
      <!--自定义msbuild:如果不是为了发布输出项目,完全不需要此msbuild节点-->
      <msbuild>
        <!-- MSBuild.exe路径-->
        <executable>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe</executable>
        <!-- svn检出后,projectFile节点说指定的文件(本例中:PCcnetTest.csproj)所在的目录路径-->
        <workingDirectory>C:\Program Files (x86)\CruiseControl.NET\workspaces\PCcnetTest\PCcnetTest</workingDirectory>
        <!-- 项目的sln或csproj文件名-->
        <projectFile>PCcnetTest.csproj</projectFile>
        <!--注意:OutputPath内容如果有空格,必须使用引号括起来-->
        <!--生成网站项目到指定的目录中-->
        <buildArgs>/p:VisualStudioVersion=12.0 /v:diag /p:OutputPath="C:\Program Files (x86)\CruiseControl.NET\发布\PCcnetTest\编译内容"</buildArgs>

        <targets>Build</targets>
        <!-- 项目的build的超时时间-->
        <timeout>900</timeout>
        <!--CruiseControl.NET处理日志的dll文件(安装后,该文件在安装目录内)-->
        <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
      </msbuild>


      <!--发布web项目-->
      <!--其实就是从sourceDir目录拷贝到publishDir目录-->
      <buildpublisher>
        <!--sourceDir:源文件地址,必须是msbuild》buildArgs节点中的/p:OutputPath属性内的生成内容-->
        <sourceDir>C:\Program Files (x86)\CruiseControl.NET\发布\PCcnetTest\编译内容\_PublishedWebsites\PCcnetTest</sourceDir>
        <!--publishDir:要发布到的地址-->
        <publishDir>C:\Program Files (x86)\CruiseControl.NET\发布\PCcnetTest\发布内容</publishDir>
        <!--useLabelSubDirectory:是否每一个版本根据label标签创建一个字目录里并把发布内容放进去-->
        <useLabelSubDirectory>false</useLabelSubDirectory>
      </buildpublisher>
    </tasks>

    <!--执行一个程序, 可以在这里加载任何你需要执行的程序,比如Fxcop等-->

    <!--示例-->
    <!--
      <exec executable="c:\projects\myproject\build.bat"/>
    -->
    
    <!--编译成功后执行的任务-->
    <!--发送邮件-->
    <publishers>
      <statistics />
      <xmllogger />
      <email from="1x42xxx7@qq.com" mailhost="smtp.qq.com" mailhostPassword="zfy0xx0xx8" mailhostUsername="1x42xx7@qq.com" useSSL="false" includeDetails="true">
        <users>
          <!-- 向谁发送邮件,可以写多user节点,注意group属性(指定用户所属组) -->
          <!--
             <user name="zhifeiyaTest" address="971310956@qq.com" group="buildmaster" />
        -->
        </users>
        <groups>
          <!-- 
            "always": 只要编译发生
            "change": 编译的状态改变,成功到失败,或者失败到成功
            "failed": 编译失败
            "success":编译成功
            "Fixed":  当build的状态发成改变时发送(从“失败”到“成功”)
            也可以这样写:<group name="developers" notification="change"/>
          -->
          <!--自定义组-->
          <group name="developers">
            <notifications>
              <NotificationType>Failed</NotificationType>
              <NotificationType>Exception</NotificationType>
            </notifications>
          </group>
          <!--自定义组-->
          <group name="buildmaster">
            <notifications>
              <NotificationType>Always</NotificationType>
            </notifications>
          </group>
        </groups>
      </email>
      <modificationHistory onlyLogWhenChangesFound="true" />
    </publishers>
  </project>
</cruisecontrol>

六、测试

ok,保存配置文件,重启windows服务。

现在就可以试着修改一下代码文件,然后svn提交,看看是否能够自动获取,自动编译/生成,单元测试,发布。

 

 

 

 

 

Loading