博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用CruiseControl.Net全面实现持续集成
阅读量:4632 次
发布时间:2019-06-09

本文共 9775 字,大约阅读时间需要 32 分钟。

持续集成想必大家很多人都听说过,甚至都实践过,最近我又一次亲历了一次持续集成,现将我的经验分享给大家。关于持续集成的理论在本文概不涉及,本文的主要目的是实战CruiseControl.Net,用它来全面实现持续集成。

在配置ccnet.config时会用到一些小工具,一并附上:

首先,我们来看看用CC.Net能为我们做哪些事情:

在开始之前,第一件事是配置我们的持续集成环境

  获取SVN或TFS工具,TFS可通过安装VisualStudio获得,SVN可通过安装TortoiseSVN来获得。

  安装和配置IIS,因为我们要使用Web页面查看持续集成的结果,所以需要配置IIS,安装CruiseControl.Net时会为我们创建一个名为ccnet的web应用程序。

  从这个站点上现在我们需要的工具CruiseControl.Net并将其安装。

  安装VisualStudio2013(当然也可选其它版本)。安装它的目的有两个,1. 使用了VSTest.Console.exe产生单元测试结果数据(UnitTest结果和测试覆盖率),2. 当编译不能通过时用它可以发现问题。

到此为止,集成环境已经OK,下面,我们来逐一来通过配置ccnet.config实现上述功能。

1.自动获取源代码

首先需要了解,持续集成的单位是以项目为单位,在ccnet.config文件里体现为Project,如下:

View Code

配置项目的源代地址,包括本地工作地址和源代码管理服务地址,对于使用TFS的源码管理器,向Project下添加如下配置:

E:\dailybuild
E:\dailybuild
TestProject
http://tfs1.TestProject.com:8080
TestProject.com
$/TestProject projects/Analysis and Design\Concierge\Prototype
E:\dailybuild\TestProject
true
View Code

对于使用svn源码管理器,可以使用以下配置:

d:\svn\Log\MyProject
C:\Program Files\TortoiseSVN\bin\svn.exe
UserName
******
true
http://svnserver/trunk/MyProject
d:\svn\trunk\MyProject
View Code 

2.实现自动Build,向Project节点下增加tasks节点,如下

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
/p:OutputPath=D:\BuildOutput
D:\svn\branch\project\
mysolution.sln
Build
9000
View Code

3.自动执行UnitTest,并生成单元测试报告

如果要生成单元测试报告和单元测试覆盖率,这里需要多下写功夫去配置。首先在创建Runsettings文件,如下:

CodeCoverage.runsettings的配置内容如下:

d:\svn\log\TestResults
x86
Framework40
.*\.dll$
.*\.exe$
.*CPPUnitTestFramework.*
^Fabrikam\.UnitTest\..*
^std::.*
^ATL::.*
.*::__GetTestMethodInfo.*
^Microsoft::VisualStudio::CppCodeCoverageFramework::.*
^Microsoft::VisualStudio::CppUnitTestFramework::.*
^System.Diagnostics.DebuggerHiddenAttribute$
^System.Diagnostics.DebuggerNonUserCodeAttribute$
^System.Runtime.CompilerServices.CompilerGeneratedAttribute$
^System.CodeDom.Compiler.GeneratedCodeAttribute$
^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$
.*\\atlmfc\\.*
.*\\vctools\\.*
.*\\public\\sdk\\.*
.*\\microsoft sdks\\.*
.*\\vc\\include\\.*
.*microsoft.*
^B77A5C561934E089$
^B03F5F7F11D50A3A$
^31BF3856AD364E35$
^89845DCD8080CC91$
^71E9BCE111E9429C$
^8F50407C4E9E73B6$
^E361AF139669C375$
True
True
True
False
View Code

里面最重要的信息室配置了单元测试结果存放路径:<ResultsDirectory>d:\svn\log\TestResults</ResultsDirectory>,以便我们后来生成测试结果。

接着来配置ccnet.config,以执行单元测试

D:\svn\tool\delfile.bat
D:\svn\Log\TestResultsReal\mstest-results.trx
300
-1,0
D:\svn\tool\delfile.bat
D:\svn\Log\TestResultsReal\mstest-coverage.xml
300
-1,0
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\VSTest.Console.exe
D:\svn\UnitTest.dll所在的文件目录
UnitTest.dll /Enablecodecoverage /Settings:D:\svn\tool\CodeCoverage.runsettings /logger:trx
300
D:\svn\tool\delfile.bat
D:\svn\Log\TestResultsReal\mstest-results.trx
300
-1,0
D:\svn\tool\delfile.bat
D:\svn\Log\TestResultsReal\mstest-coverage.xml
300
-1,0
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\VSTest.Console.exe
D:\svn\UnitTest.dll所在的文件目录
UnitTest.dll /Enablecodecoverage /Settings:D:\svn\tool\CodeCoverage.runsettings /logger:trx
300
D:\svn\tool\coverage\Auto.Dealer.UnitTest.Tool.exe
D:\svn\log\TestResults\ D:\svn\log\TestResultsReal\mstest-results.trx D:\svn\log\TestResultsReal\mstest-coverage.xml
300
-1,0
D:\svn\Log\TestResultsReal\mstest-results.trx
D:\svn\Log\TestResultsReal\mstest-coverage.xml
D:\svn\tool\coverage\Auto.Dealer.UnitTest.Tool.exe
D:\svn\log\TestResults\ D:\svn\log\TestResultsReal\mstest-results.trx D:\svn\log\TestResultsReal\mstest-coverage.xml
300
-1,0
D:\svn\Log\TestResultsReal\mstest-results.trx
D:\svn\Log\TestResultsReal\mstest-coverage.xml
View Code

这里,想必大家已经注意到有两处删除操作,因为持续集成式一个不断重复的过程,如果不删除原来的测试结果就会发生错误。另外,用到的一个工具(这个工具里的代码很简单,一并提供出来如下),用来将trx文件转化为xml文件,即单元测试覆盖率结果。最后将它们一起合并到CruiseControl的执行日志里。

生成单元测试覆盖率代码如下:

class Program    {        static void Main(string[] args)        {            string dirName = args[0];            string trxUutPutFileName = args[1];            string coverageoutPutFileName = args[2];            if (Directory.Exists(dirName))            {                DirectoryInfo dirc = new DirectoryInfo(dirName);                foreach (FileInfo file in dirc.GetFiles("*.trx"))                {                    file.CopyTo(trxUutPutFileName, true);                    break;                }                foreach (FileInfo file in dirc.GetFiles("*.coverage", SearchOption.AllDirectories))                {                    ConvertToXML(file.FullName, coverageoutPutFileName);                    break;                }                dirc.Delete(true);            }            else            {                Console.WriteLine("没找到目录:"+dirName);            }        }        public static void ConvertToXML(string coverageFile, string outputFile)        {            using( CoverageInfo coverageInfo = CoverageInfo.CreateFromFile(coverageFile))            {                using (CoverageDS ds = coverageInfo.BuildDataSet())                {                    ds.ExportXml(outputFile);                }            }        }    }
View Code

4.自动部署

d:\svn\_PublishedWebsites\MyWeb
\\IP地址\website\
false
View Code

5. 触发自动化(回归)测试

如果有自动化测试框架,则可以考虑部署完毕后自动触发执行自动化测试,由于自动化测试框架可能会有很大差异,这里就不在给出配置,总的来说,使用<exec></exec>可以很灵活地实现我们的需求。

6. 邮件提醒功能

无论持续集成执行成功,还是失败,都可以配置相应的邮件接收人员。邮件配置要放到<publishers></publishers>。这样,邮件发送的失败就不会阻塞持续集成。

my@sina.com
smtp.sina.net
Failed
Fixed
Always
Failed
Fixed
View Code

7. 使用CCTray监控持续集成

打开http://CruiseControl所在机的IP/ccnet/,可以看到如下连接,下载并安装。就可以监控制定的项目了。

8.应用plugin显示集成结果

最后,做了以上所有的事情以后,在http://CruiseControl所在机的IP/ccnet/这个站点上并不能看到我们所有的持续集成结构,CruiseControl为我们提供了一些Plugins,即一些xsl文件,使用它们就可以显示我们想要的结果了。这些xsl文件的地址为:CruiseControl的安装路径\CruiseControl.NET\webdashboard\xsl。我们需要修改一下dashboard.config这个文件,我向其中添加了如下内容:

xsl\header.xsl
xsl\modifications.xsl
xsl\unittests.xsl
xsl\MsTestSummary2008.xsl
xsl\compile-msbuild.xsl
xsl\SimianSummary.xsl
xsl\MsTestSummary2010.xsl
xsl\MsTestSummary.xsl
xsl\MsTestReport2010.xsl
xsl\MsTestCover2010.xsl
View Code

这样,重启ccnet站点后,我们的测试结果也会被格式化地显示出来。

9.设置集成策略

以每日构建为例,需要在<triggers></triggers>里配置如下结果:

Monday
Tuesday
Wednesday
Thursday
Friday
View Code

 

至此,我们的持续集成也基本上可以告一段落了。可以使用它来进行一些自动化的工作了。

 

转载于:https://www.cnblogs.com/wangjq/p/3977318.html

你可能感兴趣的文章
jeecg 定时任务配置用法
查看>>
[状压dp]JZOJ P3632——舞伴
查看>>
[并查集][暴力][二分] Jzoj P5177 TRAVEL
查看>>
[单调队列] 洛谷 P2564 生日礼物
查看>>
iOS - OC - XML 解析 - NSXMLParser
查看>>
cf837D(01背包)
查看>>
函数重载
查看>>
Unity鼠标拖拽控制人物的左右旋转
查看>>
python 获取路径不同方法的比较
查看>>
redis-trib构建集群
查看>>
《白帽子》里面的安全三要素
查看>>
大型运输行业实战_day04_2_高级查询
查看>>
Visual.Basic.6大学教程pdf
查看>>
像计算机科学家一样思考Python pdf
查看>>
计算广告 互联网商业变现的市场与技术.pdf
查看>>
C++ typedef小结(转载)
查看>>
hdu 4612 Warm up 桥缩点
查看>>
类类型
查看>>
【树论 倍增】51nod1709 复杂度分析
查看>>
【树链剖分 ODT】cf1137F. Matches Are Not a Child's Play
查看>>