.NET项目持续集成实践 - Jenkins

【转自:】http://www.cnblogs.com/lovvver/archive/2012/04/04/2429531.html

现在这个项目里,我们使用了jenkins (原hudson, http://www.jenkins-ci.org/)作为CI server,开源肯定是最基本的考虑,此外这个决定是受到了前任老大的影响,jenkins是java生态圈中的一个不错的选择,现在我们这个项目采用的是.net技术,能否很好的用起来呢,有点儿担忧,一路见佛杀佛见魔杀魔,磕磕碰碰,到现在基本是搭建起来了。基本的组合是,jenkins + svn + msbuild + mstest +psexec,在这个搭建的过程中,也碰到了不少问题,有些问题解决了,有些问题绕过了,有些问题到现在都无法很好的解决。现在把这个过程简要的写下来,算是一点总结,也希望能够对大家有点儿参考作用。

 

jenkins服务器的选择

最开始我们的jenkins服务器是运行在linux上的,纯粹是安装java开发的需要来搭建的,众所周知,.net需要使用nant / msbuild进行构建,最致命的是依赖于.net framework, 仅仅这一点我们就只能把jenkins搬到windows 2003/2008上,而出于谨慎的考虑,我们最后决定选择msbuild。jenkins支持msbuild,有相关的插件可以使用。版本控制的支持,自然是没有问题,jenkins默认支持当前几款主流的版本控制软件,而单元测试这一块,我们还是优先选择了mstest,因为这也是.net 4.0 / vs 2010中内嵌的一个组件,而且在vs 2010中可以创建各种不同需要的test project,因此我们就没有选择nunit, 当然jenkins也支持mstest,当然在测试报告的支持上碰到了一些问题。当然jenkins能够支持svn / msbuild / mstest, 那么对一个.net项目的持续集成的需要也就基本能够满足了。

 

Jenkins安装及一些初始工作

从jenkins的官网上(http://www.jenkins-ci.org/)下载一个Jenkins的最新版本,安装到我们的windows 2008 R2上。jenkins会自动安装为一个windows service: Jenkins。默认使用8080作为端口,打开http://localhost:8080/就可以打开我们的jenkins主界面了。进入Manage Jenkins -> Manage system, 选中Jenkins's own user database -> Allow users to sign up, 然后点右上角的sign up,先注册一个pm的账号先,然后根据需要是否允许组员也建立属于他们自己的账号,如果不允许,可以在Allow users to sign up取消选中即可。接下来登录进去,Manage Jenkins -> Manage Plugins, 选中我们需要使用的几个组件:

Subversion plugin, Jenkins MSBuild plugin, Jenkins MSTest plugin, Version Number plug-In等。

这样,Jenkins方面的准备工作就基本差不多了,此外顺便提一下,Jenkins的插件更新这一块还有点儿问题,例如Subversion plugin的新版本更新有点儿问题,而且版本的回滚也稍稍有问题。

 

持续集成实践思路

对于持续集成,我们也只是采取比较基础的持续集成实践,每天定时从svn上轮询代码变更,如果有代码变更,那么会通过msbuild进行编译,然后进入下一步,编译单元测试solution, 接着通过mstest运行单元测试,如果有测试用例不通过,同样会发邮件给team,否则进入下一步:构建部署包,生成一个可安装的软件版本,包括服务端,数据库,以及smart client。紧接着通过net use建立局域网磁盘映射,将所有发布出来的软件版本拷贝到局域网的test server上,然后通过PSExec在test server上远程部署最新的软件版本。当部署完毕后,开始编译集成测试solution,然后通过msbuild对test server上发布的服务进行集成测试(我们的集成测试,主要是对服务进行测试,而smart client这一块交给test team,让系统测试来覆盖),并将测试报告发送给team。如果这一系列的环节都正常执行,那么表明持续集成正常进行,否则任何一个环节出现问题,都将会发邮件给team。

此外,集成的频率大概在一个小时一次,因此单元测试也是一个小时一次,但发布和集成测试的频率我们暂定在一天一次。

 

Jenkins项目规划

基于我们的持续集成的思路,我们需要创建两个Jenkins项目,一个用于代码构建和单元测试,另一个用于发布,部署和集成测试。因此在每个Jenkins项目中将需要编译哪些solution,也就一目了然了。这两个项目的名称,我们暂定位ABC Build和ABC Publish。

 

Jenkins项目配置

第一步选择项目的风格,此处我们选择Build a free-style software project。

Source control management,这个选择Subversion, 设置我们项目的svn地址,然后会提示你提供svn的验证。接下来开始Build Triggers, Build periodically: @hourly。

Version Number:在开发阶段,我们采用的版本号格式是0.{# of phase}.{# of month in current phase}.{# of successfully build of current month}。这个可以根据你的实际需要来定,由于我们在部署方面选择了smartclient / clickonce, 所以版本号管理我们需要提前都要确定下来(在Publish/Deploy client program的时候都需要指定版本号)。

接下来Add build step: Build a visual studio project or solution using MSBuild。MSBuild version: {Default}, MSBuild build file: solution file, Command line arguments: /t:Build /p:Configuration=Release。其中MSBuild build file需要注意,solution file的路径是什么呢,是基于workspace的相对路径,这个一定要设置正确。

如何通过msbuild执行单元测试呢?这个要增加的build step是,Execute Windows batch command, 在里面使用mstest命令:

mstest /testcontainer:***.Test.dll

这里我没有指定/resultfile,是因为我在配置resultfile的时候,出现了一些问题,mstest执行测试后生产的测试结果文件格式为.trx,而在Jenkins中配置一个通用的测试结果文件,发现mstest不能正常执行,所以现在我们项目的测试报告这一块还是有问题的,如果你们有好的实践经验,欢迎分享出来。另外由于Jenkins默认支持的人JUnit的测试报告,而Jenkins MSTest Report主要是将.trx转换为JUnit的测试报告,这样可以统一在Jenkins中进行显示。这一块我也没有尝试成功。

 

接下来,build deployment packages, 同样使用msbuild来完成,只是它是通过调用windows batch command来完成:

call Deployment/ABC.Server/BuildABCService.bat

call Deployment/ABC.Database/BuildABCDatabase.bat

call Deployment/ABC.Client/BuildABCClient.bat %ABC_VERSION%

 

部署包编译完毕,那么需要将其拷贝到局域网内的test server上,这也是通过调用windows batch command来完成,大致如下:

@echo off
SET VER=%1
SET LCF=Shell_%VER:.=_%

net use \\1.2.3.4\DropLocation /user:test server name\account password
rem xcopy /s DropLocation \\1.2.3.4\DropLocation /y

xcopy /s "DropLocation\ABC Deployment\ABC.Database" "\\1.2.3.4\DropLocation\ABC Deployment\ABC.Database" /y

...

net use \\1.2.3.4\DropLocation /delete

 

接下来是远程部署,通过PSExec实现,远程部署目前还存在问题,具体的过程,请看另外一篇随笔: PSExec issues with Jenkins

@echo off
echo Start to update ABC Database...
psexec \\1.2.3.4 -u account -p password -n 60 -s -h "C:\DropLocation\ABC Deployment\ABC.Database\DeployABCDatabase.bat" -accepteula

目前手动远程执行已经可以,但是通过Jenkins执行PSExec碰到了问题,所以自动部署还没有搞定。呵呵。所以现在没有办法,集成测试需要依赖于暂时性的手动部署,所以,目前集成测试也是建了又一个新的Jenkins项目来定时执行。

 

这些是我们目前项目的CI实践,简要的介绍一下,难以作为实际操作参考,但是可以作为一个思路上的参考,如果大家在配置过程中也遇到了问题,欢迎共同探讨。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值