軟件開發項目管理實踐之駐場研發
公司最近準備分出一套人馬去客戶那里做駐場研發,這就涉及到代碼庫的統一管理。鑒于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,然后在里面輸入以下內容:
- @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" >
- <!--公有參數-->
- <!--CC.net存放工作結果的目錄-->
- <artifactDirectory>E:\project\SVNTest\artifactDir</artifactDirectory>
- <!--需要進行持續集成的項目的目錄-->
- <workingDirectory >E:\project\SVNTest\workingDir</workingDirectory>
- <!--編譯報告的網址-->
- <webURL>http://localhost/ccnet/server/local/ViewServerReport.aspx</webURL>
- <!--編譯的版本號與日志文件名格式 -->
- <labeller type="dateLabeller"></labeller>
- <!--該觸發器控制周一到周五的8點到24點的時間段內進行編譯-->
- <!--在時間段內每900秒檢查一次svn有無更新 ,如果有就取出并編譯-->
- <!--在時間段內每晚上11點50分進行一次強制編譯-->
- <!--但是目前有個問題,在周六與周日的23:59:59仍會編譯一次,原因是我的時間段的結束時間寫的是23:59:59。系統問題,無法解決-->
- <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>
- <!-- 版本控制系統的類型 -->
- <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獲取代碼的時候,出現了一個這樣子的錯: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
【編輯推薦】