軟件開發(fā)項目管理實踐之駐場研發(fā)
公司最近準備分出一套人馬去客戶那里做駐場研發(fā),這就涉及到代碼庫的統(tǒng)一管理。鑒于VSS在互聯(lián)網(wǎng)上表現(xiàn)不好,而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
這個選擇的優(yōu)缺點就不多表,其實是看具體的需要。
b).安全證書問題
安裝完成后,如果采用Https方式,默認訪問時會出現(xiàn)安全證書問題。這其實是因為默認使用的是“自簽名證書”。安全證書的原理,簡單來講就是采用兩個大素數(shù)A和B,用A加密的只能用B解密,用B加密的只能用A解密,此時稱A為密鑰,B為公鑰或者B為密鑰,A為公鑰。這是一種典型的不對稱加密。如果這對鑰匙的提供者是公認的認證機構(如Verisign),那么各種主流瀏覽器就會認為它是安全的證書,反之就是非安全證書。顯然,所謂“自簽名證書”,就是指這個鑰匙的提供者就是自己,在瀏覽器看來這當然就是典型的非安全證書了,會在最開始的頁面顯示一個警告。要想去除這個警告,有兩種方法,***種當然就是把你的相關信息發(fā)給那些認證機構,讓他們幫你生成安全證書。不過這個方案是需要花點銀子滴。第二種方法就是手工把當前的“自簽名證書”加入到受信任列表里去。這種方法簡單易行,具體的方法與說明請自行google或者參見本文結尾的參考文章。
c).使用“鎖定-編輯-解鎖”模型
這個其實也是仁者見仁,智者見智的問題。只是對于我們而言,這個模型更加適合我們。但是SVN默認是“拷貝-修改-合并”模型,那如何進行變更呢?這就用到了SVN的自定義屬性了。在SVN里是通過內置的屬性“svn:needs-lock”實現(xiàn)“鎖定-編輯-解鎖”模型的。在這里只提一下具體操作,找到config文件,我的路徑是:C:UsersljzforeverAppDataRoamingSubversionconfig。然后把enable-auto-props = yes前面的#號與空格刪掉,然后在[auto-props]下面加一行* = svn:needs-lock=x。更加具體的操作與說明請自行google或者參見本文結尾的參考文章。這樣,所有的文件在上傳到SVN上后就自動進入“鎖定-編輯-解鎖”模型了。
d).關于"steal lock"
這個選項的初衷是為了增強靈活性,當一個文件被其它人鎖定后,仍然可以用“偷”的方式將鎖強行拿過來。不過這也是引起代碼沖突的潛在原因之一,我們決定將其屏避掉。這里用到的技術就是hook script。hook script其實是一些腳本文件,在windows環(huán)境下就是一些bat腳本。每當svn做一些特定操作時,比如“鎖定”,“提交”時,就會到指定目錄下查找相關的hook script并執(zhí)行它,達到對相應命令的預處理。我們這里是需要在鎖定前檢查用戶在申請鎖定文件時是否勾選了"steal lock",如果勾選了,則中斷操作,提示用戶這個選項已被系統(tǒng)禁止。放置這個hook script的目錄是跟代碼庫路徑是相關的,我的目錄是:E:RepositoriesHWCHhooks。安裝后默認里面已經(jīng)有若干個模板,以tmpl為擴展名,比如pre-lock.tmpl就是鎖定前做的預操作,post-commit.tmpl就是提交后做的預操作。我們在里面新建一個文件:pre-lock.bat,然后在里面輸入以下內容:
- @echo off
 - REM [1] REPOS-PATH (the path to this repository)
 - REM [2] PATH (the path in the repository about to be locked)
 - REM [3] USER (the user creating the lock)
 - REM [4] COMMENT (the comment of the lock)
 - REM [5] STEAL-LOCK (1 if the user is trying to steal the lock, else 0)
 - setlocal
 - ::svn對代碼資源庫路徑與文件路徑里的右小括號敏感,需要對其轉義
 - ::代碼資源庫路徑
 - set repos=%1
 - set "repos=%repos:)=^)%"
 - ::當前文件路徑
 - set repPath=%2
 - set "repPath=%repPath:)=^)%"
 - set userName=%3
 - set isSteal=%5
 - rem NO_STEALING
 - ::如果沒有被鎖定,則直接跳走結束處理
 - if /I '1'=='%isSteal%' goto NO_STEALING
 - REM echo aaa >>d:\log.txt
 - REM echo repos = %repos% >>d:\log.txt
 - REM echo repPath = %repPath% >>d:\log.txt
 - REM echo userName = %userName% >>d:\log.txt
 - rem if the path has been locked, find the Owner.
 - ::這里是處理重點
 - ::通過svnlook lock %repos% %repPath%,命令獲取鎖信息,例如:
 - :: UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c
 - :: Owner: ljz
 - :: Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)
 - :: Expires:
 - :: Comment (1 line):
 - ::通過findstr /r /n ".",將所有行的前面加上行號,前返回所有行,例如:
 - :: 1:UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c
 - :: 2:Owner: ljz
 - :: 3:Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)
 - :: 4:Expires:
 - :: 5:Comment (1 line):
 - ::通過tokens=1,2,3 delims=: ,以:號與空格作為分隔符,將上述每一行分隔,并將前三段分別裝入變量%%i,%%j,%%k
 - ::通過if %%i == 2 set LockedName=%%k,把第二行分隔后的第三段裝入變量LockedName,在這里,就是ljz
 - for /f "tokens=1,2,3 delims=: " %%i in ('svnlook lock %repos% %repPath% ^|findstr /r /n "."') do (
 - if %%i == 2 set LockedName=%%k
 - )
 - rem If we get no result from svnlook, there's no lock, allow the lock to happen.
 - ::如果沒有獲取到鎖定信息,則直接跳走結束處理
 - if not defined LockedName goto OK_EXIT
 - rem If the person locking matches the lock's owner, allow the lock to happen.
 - rem But this one won't effect, the SVN don't care if the person matchs, they just don't allow relock.
 - REM echo userName = %userName% >>d:\log.txt
 - REM echo LockedName = %LockedName% >>d:\log.txt
 - ::如果鎖定人與當前用戶同名,則直接跳走結束處理
 - if /I '%LockedName%'=='%userName%' goto OK_EXIT
 - rem Otherwise, we've got an owner mismatch, so return failure:
 - :WRONG_PERSON
 - echo the path has been locked by %LockedName%, Pls contact %LockedName% to unlock it.>&2
 - goto ERROR_EXIT
 - :NO_STEALING
 - echo Stealing lock is not allowed at this server.>&2
 - :ERROR_EXIT
 - endlocal
 - exit 1
 - :OK_EXIT
 - endlocal
 - exit 0
 
2.CruiseControl.NET
我下載的版本是CruiseControl.NET-1.6.7981.1,安裝完成后,主要通過配置安裝目錄下的ccnet.config文件來達到自動化構建。
a).配置文件
我的配置文件如下:
- <cruisecontrol xmlns:cb="urn:ccnet.config.builder">
 - <!-- This is your CruiseControl.NET Server Configuration file. Add your projects below! -->
 - <!--
 - <project name="MyFirstProject" />
 - -->
 - <project name="SVNTest" >
 - <!--公有參數(shù)-->
 - <!--CC.net存放工作結果的目錄-->
 - <artifactDirectory>E:\project\SVNTest\artifactDir</artifactDirectory>
 - <!--需要進行持續(xù)集成的項目的目錄-->
 - <workingDirectory >E:\project\SVNTest\workingDir</workingDirectory>
 - <!--編譯報告的網(wǎng)址-->
 - <webURL>http://localhost/ccnet/server/local/ViewServerReport.aspx</webURL>
 - <!--編譯的版本號與日志文件名格式 -->
 - <labeller type="dateLabeller"></labeller>
 - <!--該觸發(fā)器控制周一到周五的8點到24點的時間段內進行編譯-->
 - <!--在時間段內每900秒檢查一次svn有無更新 ,如果有就取出并編譯-->
 - <!--在時間段內每晚上11點50分進行一次強制編譯-->
 - <!--但是目前有個問題,在周六與周日的23:59:59仍會編譯一次,原因是我的時間段的結束時間寫的是23:59:59。系統(tǒng)問題,無法解決-->
 - <triggers>
 - <multiTrigger operator="And">
 - <triggers>
 - <filterTrigger startTime="00:00:00" endTime="08:00:00">
 - <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59">
 - <trigger type="intervalTrigger" seconds="900" />
 - <weekDays>
 - <weekDay>Saturday</weekDay>
 - <weekDay>Sunday</weekDay>
 - </weekDays>
 - </trigger>
 - </filterTrigger>
 - <filterTrigger startTime="00:00:00" endTime="08:00:00">
 - <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59">
 - <trigger type="scheduleTrigger" time="23:50:00" buildCondition="ForceBuild" />
 - <weekDays>
 - <weekDay>Saturday</weekDay>
 - <weekDay>Sunday</weekDay>
 - </weekDays>
 - </trigger>
 - </filterTrigger>
 - </triggers>
 - </multiTrigger>
 - </triggers>
 - <!-- 版本控制系統(tǒng)的類型 -->
 - <sourcecontrol type="svn">
 - <!-- SVN的地址 -->
 - <trunkUrl>http://localhost:88/svn/HWCH/SVNTest/</trunkUrl>
 - <!-- 把源代碼檢出到該目錄 -->
 - <workingDirectory>E:\project\SVNTest</workingDirectory>
 - <!-- svn.exe所在路徑 -->
 - <executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
 - <!-- 登錄svn的用戶名和密碼 -->
 - <username>ljz</username>
 - <password>ljz</password>
 - </sourcecontrol>
 - <tasks>
 - <!--采用VS進行編譯-->
 - <devenv>
 - <solutionfile>E:\project\SVNTest\SVNTest.sln</solutionfile>
 - <configuration>Debug</configuration>
 - </devenv>
 - </tasks>
 - <publishers>
 - <!--編譯日志存放路徑-->
 - <!--<xmllogger logDir="E:\DailyBuild\Log\3\buildlogs" />-->
 - <!-- 下面設置編譯報告通過email通知相關人員 詳細信息參考cc.net的幫助-->
 - <!--<email from="admin@163.com" mailhost="smtp.163.com" mailhostUsername="admin" mailhostPassword="123" includeDetails="true">
 - <users>
 - <user name="dachuan" group="buildmaster" address="dachuan@163.com"/>
 - </users>
 - <groups>
 - <group name="buildmaster" notification="always"/>
 - </groups>
 - </email>-->
 - </publishers>
 - </project>
 - </cruisecontrol>
 
基本上照葫蘆畫瓢,就能把配置搞定。
b).服務器時間
我在測試cc.net從svn獲取代碼的時候,出現(xiàn)了一個這樣子的錯:failed:svn Check for modification。找了很久都沒有找到原因,后來無意中改系統(tǒng)時間的時候才發(fā)現(xiàn),原來我在測試triggers節(jié)點時,把系統(tǒng)時間改到昨天了,所以一定要記得,下一次獲取代碼的時間一定要晚于上一次獲取代碼的時間,不然cc.net就再也無法從svn獲取***的代碼了。
3.redmine
這是個著名的開源項目管理軟件,這個就不多講了,具體的請參看我之前的博文:項目管理軟件之易度1.5,禪道2.0,redmine1.2(附redmine1.2的安裝)
4.bugfree
這也是個著名的開源bug管理軟件,下載***的Wamp環(huán)境,我的是WampServer2.1e,解壓安裝,然后下載***的bugfree,我的是bugfree2.1.3,解壓后放在Wamp安裝目錄的www目錄下,然后在瀏覽器地址欄里輸入指定網(wǎng)址,按提示生成數(shù)據(jù)庫,稍等幾秒鐘后就可以開始使用了。更詳細的操作與說明請自行google或者參見本文結尾的參考文章。
***,下載個花生殼, 將域名動態(tài)綁定下,全世界就都可以使用公司本部的代碼了~~~
參考的文章:
網(wǎng)站的安全證書有問題
將自簽名證書用于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
【編輯推薦】















 
 
 






 
 
 
 