软件开发项目管理实践之驻场研发

开发 项目管理
本文将为大家介绍一个驻场研发的项目实例,包括SVN和代码库的统一管理等等。希望能帮助大家按图索骥的做好项目开发。

  公司最近准备分出一套人马去客户那里做驻场研发,这就涉及到代码库的统一管理。鉴于VSS在互联网上表现不好,而TFS配置又过于复杂,我们选择了SVN。考虑到代码的安全性及性能,我们决定在本地布署自己的SVN服务器,然后每个人安装TortoiseSVN作为客户端,并安装AnkhSVN插件配合Visual Studio使用,安装CruiseControl.NET进行自动化的每日构建,安装Redmine进行项目管理,安装BugFree进行bug管理。

  1.VisualSVN,TortoiseSVN,AnkhSVN

  我安装的版本是:VisualSVN2.1.9,TortoiseSVN-1.6.16.21511,AnkhSvn-2.1.10129。他们的安装过程都是傻瓜式的,无需多表,主要是安装好后需要进行几个位置的配置。

  a).采用Http还是Https

  这个选择的优缺点就不多表,其实是看具体的需要。

  b).安全证书问题

  安装完成后,如果采用Https方式,默认访问时会出现安全证书问题。这其实是因为默认使用的是“自签名证书”。安全证书的原理,简单来讲就是采用两个大素数A和B,用A加密的只能用B解密,用B加密的只能用A解密,此时称A为密钥,B为公钥或者B为密钥,A为公钥。这是一种典型的不对称加密。如果这对钥匙的提供者是公认的认证机构(如Verisign),那么各种主流浏览器就会认为它是安全的证书,反之就是非安全证书。显然,所谓“自签名证书”,就是指这个钥匙的提供者就是自己,在浏览器看来这当然就是典型的非安全证书了,会在最开始的页面显示一个警告。要想去除这个警告,有两种方法,***种当然就是把你的相关信息发给那些认证机构,让他们帮你生成安全证书。不过这个方案是需要花点银子滴。第二种方法就是手工把当前的“自签名证书”加入到受信任列表里去。这种方法简单易行,具体的方法与说明请自行google或者参见本文结尾的参考文章。

  c).使用“锁定-编辑-解锁”模型

  这个其实也是仁者见仁,智者见智的问题。只是对于我们而言,这个模型更加适合我们。但是SVN默认是“拷贝-修改-合并”模型,那如何进行变更呢?这就用到了SVN的自定义属性了。在SVN里是通过内置的属性“svn:needs-lock”实现“锁定-编辑-解锁”模型的。在这里只提一下具体操作,找到config文件,我的路径是:C:UsersljzforeverAppDataRoamingSubversionconfig。然后把enable-auto-props = yes前面的#号与空格删掉,然后在[auto-props]下面加一行* = svn:needs-lock=x。更加具体的操作与说明请自行google或者参见本文结尾的参考文章。这样,所有的文件在上传到SVN上后就自动进入“锁定-编辑-解锁”模型了。

  d).关于"steal lock"

  这个选项的初衷是为了增强灵活性,当一个文件被其它人锁定后,仍然可以用“偷”的方式将锁强行拿过来。不过这也是引起代码冲突的潜在原因之一,我们决定将其屏避掉。这里用到的技术就是hook script。hook script其实是一些脚本文件,在windows环境下就是一些bat脚本。每当svn做一些特定操作时,比如“锁定”,“提交”时,就会到指定目录下查找相关的hook script并执行它,达到对相应命令的预处理。我们这里是需要在锁定前检查用户在申请锁定文件时是否勾选了"steal lock",如果勾选了,则中断操作,提示用户这个选项已被系统禁止。放置这个hook script的目录是跟代码库路径是相关的,我的目录是:E:RepositoriesHWCHhooks。安装后默认里面已经有若干个模板,以tmpl为扩展名,比如pre-lock.tmpl就是锁定前做的预操作,post-commit.tmpl就是提交后做的预操作。我们在里面新建一个文件:pre-lock.bat,然后在里面输入以下内容:

  1. @echo off  
  2.  
  3. REM [1] REPOS-PATH   (the path to this repository)  
  4. REM [2] PATH         (the path in the repository about to be locked)  
  5. REM [3] USER         (the user creating the lock)  
  6. REM [4] COMMENT      (the comment of the lock)  
  7. REM [5] STEAL-LOCK   (1 if the user is trying to steal the lock, else 0)  
  8.  
  9. setlocal  
  10. ::svn对代码资源库路径与文件路径里的右小括号敏感,需要对其转义  
  11. ::代码资源库路径  
  12. set repos=%1   
  13. set "repos=%repos:)=^)%"  
  14. ::当前文件路径  
  15. set repPath=%2  
  16. set "repPath=%repPath:)=^)%"  
  17. set userName=%3  
  18. set isSteal=%5  
  19.  
  20. rem NO_STEALING  
  21. ::如果没有被锁定,则直接跳走结束处理  
  22. if /I '1'=='%isSteal%' goto NO_STEALING  
  23. REM echo aaa >>d:\log.txt  
  24. REM echo repos = %repos% >>d:\log.txt  
  25. REM echo repPath = %repPath% >>d:\log.txt  
  26. REM echo userName = %userName% >>d:\log.txt  
  27. rem if the path has been locked, find the Owner.  
  28. ::这里是处理重点  
  29. ::通过svnlook lock %repos% %repPath%,命令获取锁信息,例如:  
  30. ::  UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c  
  31. ::  Owner: ljz  
  32. ::  Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)  
  33. ::  Expires:  
  34. ::  Comment (1 line):  
  35. ::通过findstr /r /n ".",将所有行的前面加上行号,前返回所有行,例如:  
  36. ::  1:UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c  
  37. ::  2:Owner: ljz  
  38. ::  3:Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)  
  39. ::  4:Expires:  
  40. ::  5:Comment (1 line):  
  41. ::通过tokens=1,2,3 delims=: ,以:号与空格作为分隔符,将上述每一行分隔,并将前三段分别装入变量%%i,%%j,%%k  
  42. ::通过if %%i == 2 set LockedName=%%k,把第二行分隔后的第三段装入变量LockedName,在这里,就是ljz  
  43. for /f "tokens=1,2,3 delims=: " %%i in ('svnlook lock %repos% %repPath% ^|findstr /r /n "."') do (  
  44.         if %%i == 2 set LockedName=%%k  
  45.         )  
  46.  
  47. rem If we get no result from svnlook, there's no lock, allow the lock to happen.  
  48. ::如果没有获取到锁定信息,则直接跳走结束处理  
  49. if not defined LockedName goto OK_EXIT  
  50.  
  51. rem If the person locking matches the lock's owner, allow the lock to happen.  
  52. rem But this one won't effect, the SVN don't care if the person matchs, they just don't allow relock.  
  53. REM echo userName = %userName% >>d:\log.txt  
  54. REM echo LockedName = %LockedName% >>d:\log.txt  
  55. ::如果锁定人与当前用户同名,则直接跳走结束处理  
  56. if /I '%LockedName%'=='%userName%' goto OK_EXIT  
  57.  
  58. rem Otherwise, we've got an owner mismatch, so return failure:  
  59. :WRONG_PERSON  
  60. echo the path has been locked by %LockedName%, Pls contact %LockedName% to unlock it.>&2   
  61. goto ERROR_EXIT   
  62. :NO_STEALING  
  63. echo Stealing lock is not allowed at this server.>&2  
  64. :ERROR_EXIT  
  65. endlocal  
  66. exit 1  
  67. :OK_EXIT  
  68. endlocal  
  69. exit 0 

  2.CruiseControl.NET

  我下载的版本是CruiseControl.NET-1.6.7981.1,安装完成后,主要通过配置安装目录下的ccnet.config文件来达到自动化构建。

  a).配置文件

  我的配置文件如下:

  1. <cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 
  2.     <!-- This is your CruiseControl.NET Server Configuration file. Add your projects below! --> 
  3.     <!--  
  4.         <project name="MyFirstProject" />  
  5.     --> 
  6.     <project name="SVNTest" > 
  7.         <!--公有参数--> 
  8.         <!--CC.net存放工作结果的目录--> 
  9.         <artifactDirectory>E:\project\SVNTest\artifactDir</artifactDirectory> 
  10.         <!--需要进行持续集成的项目的目录--> 
  11.         <workingDirectory >E:\project\SVNTest\workingDir</workingDirectory> 
  12.         <!--编译报告的网址--> 
  13.         <webURL>http://localhost/ccnet/server/local/ViewServerReport.aspx</webURL> 
  14.         <!--编译的版本号与日志文件名格式 --> 
  15.         <labeller type="dateLabeller"></labeller> 
  16.  
  17.         <!--该触发器控制周一到周五的8点到24点的时间段内进行编译--> 
  18.         <!--在时间段内每900秒检查一次svn有无更新 ,如果有就取出并编译--> 
  19.         <!--在时间段内每晚上11点50分进行一次强制编译--> 
  20.         <!--但是目前有个问题,在周六与周日的23:59:59仍会编译一次,原因是我的时间段的结束时间写的是23:59:59。系统问题,无法解决--> 
  21.         <triggers> 
  22.             <multiTrigger operator="And"> 
  23.                 <triggers> 
  24.                     <filterTrigger startTime="00:00:00" endTime="08:00:00"> 
  25.                         <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59"> 
  26.                             <trigger type="intervalTrigger" seconds="900" /> 
  27.                             <weekDays> 
  28.                                 <weekDay>Saturday</weekDay> 
  29.                                 <weekDay>Sunday</weekDay> 
  30.                             </weekDays> 
  31.                         </trigger> 
  32.                     </filterTrigger> 
  33.                     <filterTrigger startTime="00:00:00" endTime="08:00:00"> 
  34.                         <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59"> 
  35.                             <trigger type="scheduleTrigger" time="23:50:00" buildCondition="ForceBuild" /> 
  36.                             <weekDays> 
  37.                                 <weekDay>Saturday</weekDay> 
  38.                                 <weekDay>Sunday</weekDay> 
  39.                             </weekDays> 
  40.                         </trigger> 
  41.                     </filterTrigger> 
  42.                 </triggers> 
  43.             </multiTrigger>    
  44.         </triggers> 
  45.           
  46.         <!-- 版本控制系统的类型 --> 
  47.         <sourcecontrol type="svn"> 
  48.             <!-- SVN的地址 --> 
  49.             <trunkUrl>http://localhost:88/svn/HWCH/SVNTest/</trunkUrl> 
  50.             <!-- 把源代码检出到该目录 --> 
  51.             <workingDirectory>E:\project\SVNTest</workingDirectory> 
  52.             <!-- svn.exe所在路径 --> 
  53.             <executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable> 
  54.             <!-- 登录svn的用户名和密码 --> 
  55.             <username>ljz</username> 
  56.             <password>ljz</password> 
  57.         </sourcecontrol> 
  58.           
  59.         <tasks> 
  60.             <!--采用VS进行编译--> 
  61.             <devenv> 
  62.                 <solutionfile>E:\project\SVNTest\SVNTest.sln</solutionfile> 
  63.                 <configuration>Debug</configuration> 
  64.             </devenv> 
  65.         </tasks> 
  66.           
  67.         <publishers> 
  68.             <!--编译日志存放路径--> 
  69.             <!--<xmllogger logDir="E:\DailyBuild\Log\3\buildlogs" />--> 
  70.             <!-- 下面设置编译报告通过email通知相关人员 详细信息参考cc.net的帮助--> 
  71.             <!--<email from="admin@163.com" mailhost="smtp.163.com" mailhostUsername="admin" mailhostPassword="123" includeDetails="true"> 
  72.                 <users> 
  73.                     <user name="dachuan" group="buildmaster" address="dachuan@163.com"/> 
  74.                 </users> 
  75.                 <groups> 
  76.                     <group name="buildmaster" notification="always"/> 
  77.                 </groups> 
  78.             </email>--> 
  79.         </publishers> 
  80.     </project> 
  81. </cruisecontrol> 

  基本上照葫芦画瓢,就能把配置搞定。

  b).服务器时间

  我在测试cc.net从svn获取代码的时候,出现了一个这样子的错:failed:svn Check for modification。找了很久都没有找到原因,后来无意中改系统时间的时候才发现,原来我在测试triggers节点时,把系统时间改到昨天了,所以一定要记得,下一次获取代码的时间一定要晚于上一次获取代码的时间,不然cc.net就再也无法从svn获取***的代码了。

  3.redmine

  这是个著名的开源项目管理软件,这个就不多讲了,具体的请参看我之前的博文:项目管理软件之易度1.5,禅道2.0,redmine1.2(附redmine1.2的安装)

  4.bugfree

  这也是个著名的开源bug管理软件,下载***的Wamp环境,我的是WampServer2.1e,解压安装,然后下载***的bugfree,我的是bugfree2.1.3,解压后放在Wamp安装目录的www目录下,然后在浏览器地址栏里输入指定网址,按提示生成数据库,稍等几秒钟后就可以开始使用了。更详细的操作与说明请自行google或者参见本文结尾的参考文章。

  ***,下载个花生壳, 将域名动态绑定下,全世界就都可以使用公司本部的代码了~~~

  参考的文章:

  网站的安全证书有问题

  将自签名证书用于Web服务安全性

  命令行 Subversion 入门

  TortoiseSVN有没有对资源的独占签出功能

  AnkhSVN的自动加锁

  用Hook Script阻止空日志信息提交到Subversion

  分享Visual SVN Hook Script——检查提交时必须填写大于N个字符的日志信息

  Hook Script to disable Break Lock in Tortoise SVN

  SVN hooks(钩子)-禁止break lock及steal lock。(Windows dos-batch版)

  bat set命令详解

  BAT 批处理脚本 教程

  DOS命令大全:Findstr命令详解

  安装 VisualSVN-Server 和 TortoiseSVN 和 AnkhSVN 体会

原文链接:http://www.cnblogs.com/ljzforever/archive/2011/08/09/2132799.html

【编辑推荐】

  1. 新手软件项目经理该如何入门
  2. 项目经理的力量应该从哪里来?
  3. 当你从程序员变为项目经理
  4. 软件测试项目为什么会失败
  5. 项目管理之CVS与SVN日常使用总结
责任编辑:彭凡 来源: 博客园
相关推荐

2011-07-11 09:31:34

软件项目管理

2023-06-08 16:47:09

软件开发工具

2011-07-08 08:37:05

软件开发

2023-06-09 19:01:03

软件开发

2011-01-19 10:45:34

信息系统项目管理师

2014-07-10 09:44:10

软件项目开发项目

2013-03-01 09:53:40

软件开发

2022-08-29 14:56:39

物联网软件开发设备

2011-12-15 01:01:48

ibmdw软件开发

2023-02-20 15:29:46

异步编码多线程

2011-07-14 09:03:41

软件开发项目

2011-11-29 09:29:35

项目经理

2022-10-12 14:17:39

物联网软件开发

2015-09-24 16:09:45

软件开发项目原因

2013-07-24 10:11:50

软件工程师

2012-02-20 09:58:38

ibmdw

2023-01-09 16:08:19

2011-05-19 08:57:41

软件开发项目

2011-07-26 10:44:32

开发项目

2020-06-12 07:00:00

Web开发项目
点赞
收藏

51CTO技术栈公众号