1. 程式人生 > >企業級SVN版本管理與大型程式碼上線方案

企業級SVN版本管理與大型程式碼上線方案

一,SVN服務實戰應用指南

  1.1 SVN介紹

  1)Svn(subversion)是近年來崛起的非常優秀的版本管理工具,與CVS管理工具一樣,SVN是一個跨平臺的開源的版本控制系統。Svn版本管理工具管理著隨時間改變的各種資料。這些資料放置在一箇中央資料檔案庫(repository)中,這個檔案庫很像一個普通的檔案伺服器或者FTP伺服器,但是,與其他伺服器不同的是,SVN會備份並記錄每個檔案每一次的修改更新變動。這樣我們就可以把任意一個時間點的檔案恢復到想要的某一箇舊的版本,當然也可以直接瀏覽指定檔案的更新歷史記錄;  

  2)SVN是一個非常通用的軟體系統,它常被用來管理程式原始碼,但是它也可以管理任何型別的檔案,如文字,視訊,圖片等等。

  1.2 運維人員掌握版本管理

  對於版本管理系統,運維人員需要掌握的技術點:

  1)安裝,部署,維護,排障

  2)簡單的使用,很多公司都是由開發來管理,包括創立新倉庫和新增刪除賬號

  3)對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務的。

二,搭建SVN服務端

  2.1 安裝配置SVN服務

1 #檢查環境
2 [[email protected] ~]# cat /etc/redhat-release
3 CentOS release 6.5 (Final)
4 [[email protected] ~]# uname -m
5 x86_64 6 [[email protected] ~]# uname -r 7 2.6.32-431.el6.x86_64 8 [[email protected] ~]#
 1 #光碟安裝SVN
 2 [[email protected] ~]# yum -y install subversion
 3 以下省略。。。
 4 Dependency Installed:
 5   apr.x86_64 0:1.3.9-5.el6_2                            apr-util.x86_64 0:1.3.9-3.el6_0.1
6 libproxy.x86_64 0:0.3.0-4.el6_3 libproxy-bin.x86_64 0:0.3.0-4.el6_3 7 libproxy-python.x86_64 0:0.3.0-4.el6_3 neon.x86_64 0:0.29.3-3.el6_4 8 pakchois.x86_64 0:0.4-3.2.el6 perl-URI.noarch 0:1.40-2.el6 9 10 Complete! 11 #安裝成功 12 [[email protected] ~]# rpm -qa subversion 13 subversion-1.6.11-9.el6_4.x86_64
1 #建立svn版本庫資料儲存根目錄(svndata)及使用者,密碼許可權目錄(svnpasswd)
2 [[email protected] ~]# mkdir -p /application/svndata  #資料儲存根目錄
3 [[email protected] ~]# mkdir -p /application/svnpasswd  #使用者密碼許可權目錄

  2.2 建立專案版本庫

  ###建立一個新的Subversion專案yunjisuan,其實,類似yunjisuan這樣的專案可以建立多個,每個專案對應不同的程式碼,這裡只是以建立一個專案為例演示:

 1 [[email protected]-gaowei ~]# svnadmin create /application/svndata/yunjisuan
 2 [[email protected] ~]# tree /application/svndata/yunjisuan/
 3 /application/svndata/yunjisuan/
 4 ├── conf
 5 │   ├── authz
 6 │   ├── passwd
 7 │   └── svnserve.conf
 8 ├── db
 9 │   ├── current
10 │   ├── format
11 │   ├── fsfs.conf
12 │   ├── fs-type
13 │   ├── min-unpacked-rev
14 │   ├── rep-cache.db
15 │   ├── revprops
16 │   │   └── 0
17 │   │       └── 0
18 │   ├── revs
19 │   │   └── 0
20 │   │       └── 0
21 │   ├── transactions
22 │   ├── txn-current
23 │   ├── txn-current-lock
24 │   ├── txn-protorevs

25 │   ├── uuid
26 │   └── write-lock
27 ├── format
28 ├── hooks
29 │   ├── post-commit.tmpl
30 │   ├── post-lock.tmpl
31 │   ├── post-revprop-change.tmpl
32 │   ├── post-unlock.tmpl
33 │   ├── pre-commit.tmpl
34 │   ├── pre-lock.tmpl
35 │   ├── pre-revprop-change.tmpl
36 │   ├── pre-unlock.tmpl
37 │   └── start-commit.tmpl
38 ├── locks
39 │   ├── db.lock
40 │   └── db-logs.lock
41 └── README.txt
42 
43 10 directories, 28 files

  2.3 編輯SVN配置檔案

1 [[email protected] ~]# cd /application/svndata/yunjisuan/conf/
 2 [[email protected]gaowei conf]# ll
 3 total 12
 4 -rw-r--r--. 1 root root 1080 Nov 26 07:34 authz
 5 -rw-r--r--. 1 root root  309 Nov 26 07:34 passwd
 6 -rw-r--r--. 1 root root 2279 Nov 26 07:34 svnserve.conf
 7 [[email protected]gaowei conf]# cp svnserve.conf{,.bak}
 8 [[email protected]gaowei conf]# vim svnserve.conf
 9 #修改配置檔案的如下資訊
10 [[email protected] conf]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p'
11     12    # anon-access = read
12     13    # auth-access = write
13     20    # password-db = passwd
14     27    # authz-db = authz
15 #將配置檔案程式碼修改為如下所示:
16 [[email protected] conf]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p'    
17     12    anon-access = none             #禁止匿名訪問
18     13    auth-access = write              #驗證訪問可寫
19     20    password-db = /application/svnpasswd/passwd     #密碼檔案位置
20     27    authz-db = /application/svnpasswd/authz             #驗證檔案位置
21     注:此配置檔案裡的每條配置程式碼必須頂格寫,不能有空格。

  2.4 將authz檔案和passwd檔案拷貝到/application/svnpasswd下

1 [[email protected] conf]# cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/
2 [[email protected] conf]# cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/
3 [[email protected] conf]# ll /application/svnpasswd/
4 total 8
5 -rw-r--r--. 1 root root 1080 Nov 26 07:46 authz
6 -rw-r--r--. 1 root root  309 Nov 26 07:46 passwd

  2.5 啟動svn服務

 1 [[email protected] conf]# svnserve --help      #svn啟動命令幫助
 2 usage: svnserve [-d | -i | -t | -X] [options]
 3 
 4 Valid options:
 5   -d [--daemon]            : daemon mode     #守護程序啟動(後臺)
 6   -i [--inetd]             : inetd mode
 7   -t [--tunnel]            : tunnel mode
 8   -X [--listen-once]       : listen-once mode (useful for debugging)
 9   -r [--root] ARG          : root of directory to serve   #指定根目錄
10   -R [--read-only]         : force read only, overriding repository config file
11   --config-file ARG        : read configuration from file ARG
12   --listen-port ARG        : listen port      #監聽埠預設3690
13                              [mode: daemon, listen-once]
14   --listen-host ARG        : listen hostname or IP address   #監聽IP
15                              [mode: daemon, listen-once]
16   -T [--threads]           : use threads instead of fork [mode: daemon]
17   --foreground             : run in foreground (useful for debugging)
18                              [mode: daemon]
19   --log-file ARG           : svnserve log file
20   --pid-file ARG           : write server process ID to file ARG
21                              [mode: daemon, listen-once]
22   --tunnel-user ARG        : tunnel username (default is current uid's name)
23                              [mode: tunnel]
24   -h [--help]              : display this help
25   --version                : show program version information
1 #啟動svn服務
2 [[email protected] conf]# svnserve -d -r /application/svndata/
3 [[email protected] conf]# netstat -antup | grep 3690
4 tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      1065/svnserve       

  2.6 passwd檔案及密碼設定

1 #在/application/svnpasswd/passwd檔案末尾追加如下內容:
2 [[email protected] conf]# vim /application/svnpasswd/passwd 
3 [[email protected] conf]# tail -4 /application/svnpasswd/passwd
4 yunjisuan = 123123
5 benet = 123123
6 stu001 = 123
7 stu002 = 456

  2.7 authz的授權

 1 #編輯authz配置檔案進行授權,在authz末尾加入以下幾句程式碼
 2 [[email protected] conf]# vim /application/svnpasswd/authz 
 3 [[email protected] conf]# egrep -v "#|^$" /application/svnpasswd/authz
 4 [aliases]
 5 [groups]
 6 sagroup = stu001,stu002         #新增本行,定義組名
 7 [yunjisuan:/]                          #定義授權的範圍
 8 yunjisuan = rw                        #使用者單獨授權
 9 benet = r                                #使用者單獨授權
10 @sagroup =r                           #組使用者授權

  2.8 重新啟動svnserve

1 [[email protected] conf]# ps -ef | grep svn | grep -v grep
2 root       1065      1  0 07:49 ?        00:00:00 svnserve -d -r /application/svndata/
3 [[email protected] conf]# kill 1065
4 [[email protected] conf]# ps -ef | grep svn | grep -v grep
5 [[email protected] conf]# svnserve -d -r /application/svndata/
6 [[email protected] conf]# ps -ef | grep svn | grep -v grep
7 root       1099      1  0 08:01 ?        00:00:00 svnserve -d -r /application/svndata/

三,搭建SVN客戶端

  3.1 使用svn客戶端(Windows版)

  3.1.1 軟體版本選擇

    推薦TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

  3.1.2 svn客戶端安裝

    和windows安裝其他軟體流程一樣

  3.1.3 svn客戶端使用

  1)現在本地建立一個目錄,名字任意,比如date

  

  2)滑鼠右鍵點選date目錄

  選擇右鍵選單裡的SVN Checkout,出現下圖

  

  點選ok,出現下圖

  

  再次點選OK以後,結束。此時目錄裡多了一個隱藏的目錄,表示此目錄已經和svn伺服器連通

  

  ###命令說明:

  1)SVN Checkout:相當於下載,第一次連線svn伺服器的時候需要和伺服器的對應儲存目錄進行資料同步,如果伺服器的對應目錄裡有資料檔案,那麼就會下載到你的本地對應目錄裡。
(2)SVN Update:更新資料,檢查伺服器端svn儲存目錄裡是否和本地svn儲存目錄資料不一致,如果不一致,那麼下載改變或新增的部分到本地svn目錄裡。(不會刪除本地目錄內容)
(3)SVN Commit:提交資料到svn伺服器端儲存目錄。本地svn儲存目錄會和伺服器端儲存目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至伺服器端。

  3.1.4 svn客戶端使用測試

  (1)向windows的svn儲存目錄date裡放一個空檔案

  

  (2)右鍵點選date目錄,選擇SVN Commit

  

  

  (3)開啟本地date目錄裡的檔案,隨便寫點內容後,再次進行SVN commit

  

  

  (4)直接從本地檢視伺服器端的資料內容

    右鍵點選本地svn儲存目錄date,選擇TortoiseSVN ===>Repo-browser後出現下圖:

  

  雙擊檔案可以直接遠端開啟檔案,可以看到裡面剛剛被修改後的內容已經更新至伺服器端。

  (5)刪除本地svn儲存目錄date裡的檔案,後選擇SVN Update

    我們會發現,剛剛刪除的檔案又重新下載回來了

  (6)繼續刪除本地svn儲存目錄data裡的檔案,後選擇SVN Commit

  

  (7)再次檢視伺服器端儲存目錄裡,發現檔案已經被刪除了

  

  3.2 SVN的管理命令(linux)

 1 [[email protected] conf]# svn --help
 2 usage: svn <subcommand> [options] [args]
 3 Subversion command-line client, version 1.6.11.
 4 Type 'svn help <subcommand>' for help on a specific subcommand.
 5 Type 'svn --version' to see the program version and RA modules
 6   or 'svn --version --quiet' to see just the version number.
 7 
 8 Most subcommands take file and/or directory arguments, recursing
 9 on the directories.  If no arguments are supplied to such a
10 command, it recurses on the current directory (inclusive) by default.
11 
12 Available subcommands:
13    add
14    blame (praise, annotate, ann)
15    cat
16    changelist (cl)
17    checkout (co)                   #下載資料
18    cleanup           
19    commit (ci)                       #提交資料
20    copy (cp)
21    delete (del, remove, rm)
22    diff (di)
23    export
24    help (?, h)
25    import
26    info
27    list (ls)                              #顯示伺服器端內容
28    lock
29    log
30    merge
31    mergeinfo
32    mkdir
33    move (mv, rename, ren)
34    propdel (pdel, pd)
35    propedit (pedit, pe)
36    propget (pget, pg)
37    proplist (plist, pl)
38    propset (pset, ps)
39    resolve
40    resolved
41    revert
42    status (stat, st)
43    switch (sw)
44    unlock
45    update (up)                           #更新資料
46 
47 Subversion is a tool for version control.
48 For additional information, see http://subversion.tigris.org/

  3.2.1 從SVN庫提取資料

 1 [[email protected] ~]# mkdir yunjisuan
 2 [[email protected] ~]# cd yunjisuan/
 3 [[email protected]gaowei yunjisuan]# pwd
 4 /root/yunjisuan
 5 
 6 #下載伺服器端資料到Linux本地目錄
 7 [[email protected] yunjisuan]# svn co svn://192.168.200.130/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123
 8 A    /root/yunjisuan/gaowei11.txt.txt
 9 Checked out revision 4.
10 [[email protected]gaowei yunjisuan]# ll
11 total 0
12 -rw-r--r--. 1 root root 0 Nov 26 09:10 gaowei11.txt.txt

  3.2.2 檢視SVN版本庫中的資料

1 [[email protected] yunjisuan]# svn list file:///application/svndata/yunjisuan/
2 gaowei11.txt.txt

 四,大中小型企業上線解決方案

  4.1 小型公司程式碼上線案例(20臺伺服器以下)

  

  特點與問題: 

  1. 釋出快,及時,隨時隨地就可以釋出程式碼。
  2. 開發人員釋出的程式碼不經過測試人員的測試,且使用者訪問頁面重新整理後頁面即改變,也可能重新整理瞬間程式在更新,到時無法訪問,對網站使用者的體驗比較差,如果開發寫錯了程式碼,造成的影響就更大了,這是拿使用者作為測試的上線方案。
  3. 據統計,網站中大概50%以上的故障是和開發程式程式碼有關的,(比如:開發寫錯了一個迴圈程式碼,導致了死迴圈,此時大量使用者訪問這個程式,就能把伺服器資源耗盡,搞死伺服器)
  4. 在中小公司網站出了問題一般是運維人員的問題(例如網站宕機),但這種情況下,問題大多可能由開發人員或程式碼引起的,這裡比較好的策略是開發專案負責制思想

  4.2 中型企業上線解決方案

  中型企業上線,一般是規範運維人員操作步驟,制定統一的上線操作指令碼,備份檔名稱,備份檔案路徑。使操作人性化,統一化,自動化。

  

  4.3 大型企業上線解決方案

  大型企業上線一般制度和流程控制較多,比較嚴謹,下面是某大型企業上線解決方案架構: