SVN版本管理與大型代碼上線方案

第1章 SVN服務實戰應用指南

 

1.1 SVN介紹

 

1.1.1 什麼是SVN(Subversion)?

  • Svn(subversion)是近年來崛起的很是優秀的版本管理工具,與CVS管理工具同樣,SVN是一個跨平臺的開源的版本控制系統。Svn版本管理工具管理着隨時間改變的各類數據。這些數據放置在一箇中央資料檔案庫(repository)中,這個檔案庫很像一個普通的文件服務器或者FTP服務器,可是,與其餘服務器不一樣的是,SVN會備份並記錄每一個文件每一次的修改更新變更。這樣咱們就能夠把任意一個時間點的檔案恢復到想要的某一箇舊的版本,固然也能夠直接瀏覽指定文件的更新歷史記錄。
  • 爲何會有svn這樣一個項目?
  • 官方解釋:爲了接管CVS的用戶基礎,確切的說,咱們寫了一個新的版本控制系統,它和CVS很類似,可是它修正了之前CVS所沒有解決的許多問題。問題見SVN官方首頁。
  • SVN是一個很是通用的軟件系統,它常被用來管理程序源碼,可是它也能夠管理任何類型的文件,如文本,視頻,圖片等等。

SVN相關站點:php

Subversion官網: 
http://subversion.tigris.org/ 
http://subversion.apache.org/ 
svn客戶端:http://toroisesvn.net/ 
svn中文網站:http://www.iusesvn.com/ 
中文常見問題解答FAQ:http://subversion.apache.org/faq.zh.html 
官方手冊:http://svnbook.red-bean.com/ 中英都有
html

 

1.2 svn與git的區別

 

1.2.1 svn集中式版本控制系統

svn版本控制系統是集中式的數據管理,存在一箇中央版本庫,全部開發人員本地開發所使用的代碼都是來自於這個版本庫,提交代碼也都必須提交到這個中央版本庫。前端

svn版本控制系統工做流程以下:vue

  1. 在中央庫上建立或從主幹複製一個分支java

  2. 從中央庫check out 下這個分支的代碼linux

  3. 增長本身的代碼文件,修改現存的代碼或刪除代碼文件ios

  4. commit(提交)代碼,假設有人在剛剛的分支上提交了代碼,你就會被提示代碼過時,你得先up你的代碼後再提交。up代碼的時候若是出現衝突,須要解決好衝突後再進行提交。git

缺點程序員

當沒法鏈接到中央版本庫的環境下,你沒法提交代碼,將代碼加入版本控制; 
你沒法查看代碼的歷史版本以及版本的變化過程。提交到版本控制系統中的代碼咱們都默認經過自測可運行的,若是某個模塊的代碼比較複雜,不能短期內實現爲可測試的功能,那麼你須要等很長的時間才能提交本身的代碼,因爲代碼庫集中管理,所以,須要對中央版本庫的存儲作備份。這點分佈式的版本控制系統要好一些。Svn的備份要備份全部代碼數據以及全部更改的版本記錄。
web

 

1.2.2 git分佈式的版本控制

  • git是由Linus開發的,因此很天然的git和Linux文件系統結合的比較緊密,以致於在windows上你必須使用cygwin才能使其完美的工做。
  • 那git憑啥叫作分佈式的版本控制系統呢?仍是從其工做模式講起把。
  • git中沒有了中央版本庫的說法了,可是爲了開發小組的代碼共享,咱們一般仍是會搭建一個遠程的git倉庫。
  • 可是和svn不一樣的是,開發者本地也包含了一個完整的git倉庫,從某種程度上說本地的倉庫和遠程的倉庫在身份上是等價的,沒有主從之分。
  • 若是你的項目是閉源項目,或者你習慣於以往的集中式的管理模式的話,那麼在git下你也能夠像svn那樣的工做,只是流程中可能會增長一些步驟。

    1. 你本地建立一個git庫,並將其add到遠程git庫中。

    2. 你在本地添加或者刪除文件,而後commit,固然commit操做都是提交到本地的git庫中了。(嗯,實際上是提交到git目錄下的objects目錄中去了)

    3. 將本地git庫的分支push到遠程git庫的分支,若是這個時候遠程git庫中已經有別人push過,那麼遠程git庫將不容許你push,這時候你須要先pull,而後若是有衝突,處理好衝突,commit到本地git庫後,再push到遠程git庫。

從上面的描述咱們能夠看到,咱們每一個開發人員的本地都會有一個git庫,咱們能夠隨時進行commit而不須要聯網,能夠隨時查看歷史版本,當某一個功能點開發完了以後咱們能夠將commit後的內容push到遠程git庫了,若是遠程git庫的版本在你上次clone或者pull以後變化了,那麼你須要進行pull並處理衝突,提交以後,再push到遠程git庫。

 

1.3 企業應用場景

svn還是當前企業的主流。git正在發展,也許將來也會成爲主流,但如今還不是。若是有精力,能同時掌握更好。

 

1.4 運維人員掌握版本管理

 

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

  1. 安裝,部署,維護,排障。

  2. 簡單使用,不少公司都是由開發來管理,包括創建新倉庫和添加刪除帳號

  3. 對於版本控制系統,運維人員至關於開發商,開發人員是業主,運維搭建的系統爲開發人員服務的。

 

1.5 SVN服務運行模式與訪問方式

 

1.5.1 SVN服務端運行方式

svn服務常見的運行訪問方式有3種:

(1)獨立服務器訪問 
訪問地址如:svn://svn.yunjisuan.org/sadoc;

(2)藉助apache等http服務 
訪問地址如:http://svn.yunjisuan.com/sadoc;

a,單獨安裝apache+svn(不要用) 
b,CSVN(apache+svn)是一個單獨的整合的軟件,帶web界面管理的SVN軟件

(3)本地直接訪問(例如:file://application/svndata/sadoc)

image_1cri3b2ur6rv17vp1mkd1q855k1p.png-101.4kB

在這裏,主要介紹第一種方式以及第二種方式中的CSVN web管理方式

 

1.5.2 SVN客戶端訪問方式

SVN客戶端能夠經過多種方式訪問服務器端,例如:本地磁盤訪問,或各類各樣不一樣的網絡協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。

image_1cri3cjpfrju1361php1ih07s346.png-28.3kB

 

1.6 SVN檔案庫數據格式

svn存儲版本數據有2種方式:BDB(一種事務安全型表類型)和FSFS(一種不須要數據庫的存儲系統)。由於BDB方式在服務器中斷時,有可能鎖住數據,因此仍是FSFS方式更安全一點。

  • BDB:

    伯克利DB(Berkeley DB),版本庫可使用的一種通過充分測試的後臺數據庫實現,不能在經過網絡共享的文件系統上使用,伯克利DB是Subversion 1.2版本之前的缺省版本庫格式

  • FSFS:

    一個專用於Subversion版本庫的文件系統後端,可使用網絡文件系統(例如 NFS 或 SMBFS)。是1.2版本及其後的缺省版本庫格式。

 

1.7.1 SVN 集中式版本管理系統

Svn是一種集中式文件版本管理系統。集中式管理的工做流程以下圖:

image_1d9jcv77ijkdul91q5lbvs9p.png-299.5kB

集中式代碼管理的核心是SVN服務器,全部開發者在開始新一天的工做以前必須從服務器獲取代碼,而後進行開發,最後解決衝突,提交。全部的版本信息都放在SVN服務器上。所以若是脫離了服務器,開發者就沒法進行提交代碼工做。

 

1.7.2 開發者利用SVN版本管理系統工做過程

下面舉例說明:

開始新一天的工做:

  1. 首先從SVN服務器下載項目組最新代碼。

  2. 進入本身的分支,進行開發工做,每隔一小時向服務器上本身的分支提交一次代碼(不少程序員都有這個習慣。由於有時候本身對代碼改來改去,最後又想還原到新一個小時的版本,或者看看前一個小時本身修改了哪些代碼,就須要這樣作了)。

  3. 下班時間快到了,把本身的分支合併到服務器主分支上,一天的工做完成,並反映給服務器。

優勢:

  1. 管理方便,邏輯清晰明確,符合通常人思惟習慣。

  2. 易於管理,集中式svn服務器更能保證數據安全性。

  3. 代碼一致性很是高。

  4. 適合開發人數很少的項目開發。

  5. 普及度高,大部分軟件配置管理的大學教材都是使用svn和vss。

 

第2章 搭建SVN服務端

 

2.1 安裝配置SVN服務

 

檢查環境

cat /etc/redhat-release

uname -r

image_1ct2ro5j856817hr98h1fml13h59.png-16.8kB

 

光盤yum安裝svn

yum -y install subversion

rpm -qa subversion

image_1ct2rqqa6sfkvt10g7vp1l0rm.png-33kB

 

創建svn版本庫數據存儲根目錄(svndata)及用戶,密碼權限目錄(svnpasswd)

mkdir -p /application/svndata --->數據存儲根目錄

mkdir -p /application/svnpasswd --->用戶,密碼權限目錄

image_1ct2rs3ip1ie810q4v988dr1gm813.png-28.6kB

 

2.2 創建項目版本庫

建立一個新的Subversion項目yunjisuan,其實,相似yunjisuan這樣的項目能夠建立多個,每一個項目對應不一樣的代碼,這裏只是以建立一個項目爲例演示:

svnadmin create /application/svndata/yunjisuan

tree /application/svndata/yunjisuan/ --->沒有tree則須要yum安裝

 
  1. /application/svndata/yunjisuan/
  2. |-- README.txt
  3. |-- conf
  4. | |-- authz
  5. | |-- passwd
  6. | `-- svnserve.conf
  7. |-- db
  8. | |-- current
  9. | |-- format
  10. | |-- fs-type
  11. | |-- fsfs.conf
  12. | |-- min-unpacked-rev
  13. | |-- rep-cache.db
  14. | |-- revprops
  15. | | `-- 0
  16. | | `-- 0
  17. | |-- revs
  18. | | `-- 0
  19. | | `-- 0
  20. | |-- transactions
  21. | |-- txn-current
  22. | |-- txn-current-lock
  23. | |-- txn-protorevs
  24. | |-- uuid
  25. | `-- write-lock
  26. |-- format
  27. |-- hooks
  28. | |-- post-commit.tmpl
  29. | |-- post-lock.tmpl
  30. | |-- post-revprop-change.tmpl
  31. | |-- post-unlock.tmpl
  32. | |-- pre-commit.tmpl
  33. | |-- pre-lock.tmpl
  34. | |-- pre-revprop-change.tmpl
  35. | |-- pre-unlock.tmpl
  36. | `-- start-commit.tmpl
  37. `-- locks
  38. |-- db-logs.lock
  39. `-- db.lock
  40. 10 directories, 28 files
  41. 目錄詳解
  42. conf --->配置文件目錄
  43. authz --->用戶認證
  44. db --->數據目錄
  45. hooks --->鉤子腳本目錄
  46. locks --->代碼鎖目錄

image_1ct2s1mfvumavfn1iv91f9itg21g.png-56.1kB

 

2.3 編輯svn配置文件

cd /application/svndata/yunjisuan/conf/

ls

cp svnserve.conf{,.bak}

vim svnserve.conf

image_1ct2svfs1od91bp4um412361q071t.png-18.6kB

 

修改配置文件的以下信息

cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p'

 
  1. 12 # anon-access = read
  2. 13 # auth-access = write
  3. 20 # password-db = passwd
  4. 27 # authz-db = authz

image_1ct2t263nguvko71s0r1qmu9v02a.png-20.4kB

 

將配置文件代碼修改成以下所示:

cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p'

 
  1. 12 anon-access = none #禁止匿名訪問
  2. 13 auth-access = write #驗證訪問可寫
  3. 20 password-db = /application/svnpasswd/passwd #密碼文件位置
  4. 27 authz-db = /application/svnpasswd/authz #驗證文件位置

image_1ct2t59aicc7r7h2cs1po012oh3n.png-24.3kB

 

特別提示:

此配置文件裏的每條配置代碼必須頂格寫,不能有空格。

 

2.4 將authz文件和passwd文件拷貝到/application/svnpasswd下

cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/

cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/

ll /application/svnpasswd/

image_1ct2tsmul1gmk1ctc1dve150v162p44.png-20.3kB

 

2.5 svn啓動命令幫助

svnserve --help --->svn啓動命令幫助

 
  1. svnserve: warning: cannot set LC_CTYPE locale
  2. svnserve: warning: environment variable LANG is en
  3. svnserve: warning: please check that your locale name is correct
  4. usage: svnserve [-d | -i | -t | -X] [options]
  5. Valid options:
  6. -d [--daemon] : daemon mode #守護進程啓動(後臺)
  7. -i [--inetd] : inetd mode
  8. -t [--tunnel] : tunnel mode
  9. -X [--listen-once] : listen-once mode (useful for debugging)
  10. -r [--root] ARG : root of directory to serve #指定根目錄
  11. -R [--read-only] : force read only, overriding repository config file
  12. --config-file ARG : read configuration from file ARG
  13. --listen-port ARG : listen port #監聽端口默認3690
  14. [mode: daemon, listen-once]
  15. --listen-host ARG : listen hostname or IP address #監聽IP
  16. [mode: daemon, listen-once]
  17. -T [--threads] : use threads instead of fork [mode: daemon]
  18. --foreground : run in foreground (useful for debugging)
  19. [mode: daemon]
  20. --log-file ARG : svnserve log file
  21. --pid-file ARG : write server process ID to file ARG
  22. [mode: daemon, listen-once]
  23. --tunnel-user ARG : tunnel username (default is current uids name)
  24. [mode: tunnel]
  25. -h [--help] : display this help
  26. --version : show program version information

image_1ct2tt8n8j3me42bqj5pm1iho4h.png-61.6kB

 

啓動svn服務

svnserve -d -r /application/svndata/

netstat -antup | grep 3690

image_1ct2tu9o5kov1d9o12qrer31f704u.png-17kB

 

2.6 解決svnserve啓動時的警告問題

source /etc/sysconfig/i18n --->啓用中文字符集

cat /etc/sysconfig/i18n

svnserve -d -r /application/svndata/ --->有中文字符集啓動沒有警告了

image_1ct2u56t91tjs6mfom110ls1bvi68.png-11.8kB

 

2.7 passwd文件及密碼設置

vim /application/svnpasswd/passwd

在/application/svnpasswd/passwd文件末尾追加內容

tail -4 /application/svnpasswd/passwd

 
  1. yunjisuan = 123123 #設置帳號密碼
  2. benet = 123123 #設置帳號密碼
  3. stu001 = 123 #設置帳號密碼
  4. stu002 = 456 #設置帳號密碼

image_1ct2ujgudvpa17oc1gh4rpp15f675.png-17.7kB

 

2.8 authz的受權

注意

1,權限配置文件中出現的用戶名必須已在用戶配置文件中定義

2,對權限配置文件的修改當即生效,沒必要重啓svn

 

權限配置說明

 

用戶組格式

 
  1. groups
  2. =,
  3. 其中,1個用戶組能夠包含1個或多個用過戶,用戶間以逗號分隔。
  4. 例如:harry\_and\_sally = harry,sally #==>用戶組 = 用戶1,用戶2
 

版本庫目錄格式

 
  1. [<版本庫>:/項目/目錄] #例如:[repository:/baz/fuz]
  2. @<用戶組名> = <權限> #例如:@harry\_and\_sally = rw
  3. <用戶名> = <權限> #例如:harry = rw
  4. 其中,方框號內部分能夠有多種寫法:
  5. [/],表示根目錄及如下,根目錄是svnserve啓動時指定的,咱們指定爲/application/svndata,[/]就是表示對所有版本庫設置權限。
  6. [repos:/],表示對版本庫repos設置權限。
  7. [repos:/yunjisuan],表示對版本庫repos中的yunjisuan項目設置權限。
  8. [repos:/yunjisuan/benet],表示對版本庫repos中的yunjisuan項目的benet目錄設置權限。

權限主體能夠是用戶組,用戶或*,用戶組在前面加@,*表示所有用戶。

權限能夠是w,r,wr和空,空表示沒有任何權限。

authz中每一個參數都要頂格寫,開頭不能有空格。

對於組,要以@開頭,用戶不須要@開頭。

 

編輯authz配置文件進行受權,在authz末尾加入如下幾句代碼

vim /application/svnpasswd/authz

egrep -v "#|^$" /application/svnpasswd/authz

 
  1. [aliases]
  2. [groups]
  3. sagroup = stu001,stu002 #新增本行,定義組名
  4. [yunjisuan:/] #定義受權的範圍
  5. yunjisuan = rw #用戶單獨受權
  6. benet = r #用戶單獨受權
  7. @sagroup = r #組用戶受權

image_1ct2vhaofkq94no3bqat4171c7i.png-22.7kB

 

authz配置文件

 
  1. [game:/server]
  2. @server=rw
  3. 這個含義是server用戶能夠多svngame下面的server目錄有讀寫權限
  4. [groups]
  5. #管理組
  6. manager = boss
  7. #服務端用戶組
  8. server = server1,server2
  9. #客戶端用戶組
  10. client = client1,client2
  11. #美術組
  12. art = art1,art2
  13. #策劃組
  14. design=design1,design2
  15. [game:/]
  16. @manager=rw
  17. [game:/server]
  18. @server=rw
  19. [game:/client]
  20. @client=rw
  21. @design=r
  22. @art=r
  23. [game:/art]
  24. @design=rw
  25. @art=rw
  26. @client=r
  27. [game:/design]
  28. @design=rw
  29. @server=r
  30. @client=r
  31. @art=r
 

2.9 重啓動svnserve(能夠不用重啓)

ps -ef | grep svn | grep -v grep

kill 1062

ps -ef | grep svn | grep -v grep

svnserve -d -r /application/svndata/

image_1ct2vjseji8j1765jlv10d01jmn7v.png-29.6kB

 

centos7開機自啓動svn

vim /etc/sysconfig/svnserve 
--->修改爲svn倉庫的路徑

systemctl enable svnserve.service 
--->開機啓動

systemctl status svnserve 
---->查看狀態

image_1dbjnr8vg1iullg21e7fbm9gpv9.png-13.9kB

 

第3章 搭建SVN客戶端

 

3.1 使用svn客戶端(windows版)

 

3.1.1 軟件版本選擇

推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7 
注意:32位系統要用32位軟件版本

下載連接 
連接:https://pan.baidu.com/s/1dKq_JVJN3tFxY_AvMKKTcA 
提取碼:kn9z

 

3.1.2 svn客戶端軟件安裝

一路yes便可

 

3.1.3 svn客戶端軟件的使用

 

(1)先在本地建立一個目錄,起名任意,好比data

image_1ct30pf5c1e638qu69pthpqbe8c.png-42.4kB

 

(2)鼠標右鍵點擊data目錄

svn://192.168.200.69/yunjisuan

選擇右鍵菜單裏的SVN Checkout,出現下圖:

image_1ct30s4n63ma1k9rkup15medsl8p.png-25.3kB

 

特別提示

若是鏈接不通,請檢查Linux虛擬機的iptables是否關閉

點擊OK後,出現下圖:

image_1ct30u16gpss1a9eoi5hhh1agn96.png-35.6kB

再次點擊OK之後,結束。此時目錄裏多了一個隱藏的目錄,表示此目錄已經和svn服務器連通

image_1ct311diq1kfc8i65ul117k1nr59j.png-51.4kB

 

命令說明

(1)SVN Checkout:至關於下載,第一次鏈接svn服務器的時候須要和服務器的對應存儲目錄進行數據同步,若是服務器的對應目錄裏有數據文件,那麼就會下載到你的本地對應目錄裏。

(2)SVN Update:更新數據,檢查服務器端svn存儲目錄裏是否和本地svn存儲目錄數據不一致,若是不一致,那麼下載改變或新增的部分到本地svn目錄裏。(不會刪除本地目錄內容)

(3)SVN Commit:提交數據到svn服務器端存儲目錄。本地svn存儲目錄會和服務器端存儲目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至服務器端。

 

3.1.4 svn客戶端使用測試

 

(1)向windows的svn存儲目錄data裏放一個空文件

image_1ct31345op61griri7i710moa0.png-41.3kB


 

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

image_1ct316ok116pln8crerbti13p2ad.png-49.3kB

image_1ct31784h1k3386oph42nfa6caq.png-36.2kB


 

(3)打開本地data目錄裏的文件,隨便寫點內容後,再次進行SVN commit

image_1ct31fc0oueq7ubj6010pv1d1eb7.png-53.8kB

image_1ct31fs1b86auensuk98b34obk.png-34.6kB


 

(4)直接從本地查看服務器端的數據內容

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

image_1ct31ksme1afr6s5nv9egthq6c1.png-59.9kB

雙擊文件能夠直接遠程打開文件,能夠看到裏面剛剛被修改後的內容已經更新至服務器端。

 

(5)刪除本地svn存儲目錄data裏的文件,後選擇SVN Update

會發現,剛剛刪除的文件又從新下載回來了。

 

(6)繼續刪除本地svn存儲目錄data裏的文件,後選擇SVN Commit

image_1ct31r8rhme8mihkvf10sb17mhce.png-58.9kB

 

(7)再次查看服務器端存儲目錄裏,發現文件已經被刪除了

image_1ct31smed1a3vvia1bh718bv1578cr.png-56.5kB

 

3.2 SVN的管理命令(Linux)

svn --help

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

image_1ct31ts1r1nad15kua661kk315ved8.png-53.2kB

 

3.2.1 從SVN庫提取數據

將文件checkout到本地目錄 
svn checkout(co) remotepath localpath

mkdir yunjisuan

cd yunjisuan/

pwd

image_1ct3226kl1g8o16ot4031nfm1rk8dl.png-10.3kB

 

下載服務器端數據到Linux本地目錄

svn co svn://192.168.200.69/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123

ll

image_1ct325t3l1bgafuvo6e90rlie2.png-24.4kB

 

3.2.2 查看SVN版本庫中的數據

svn list file:///application/svndata/yunjisuan

image_1ct327l8f7qmio6jf1dimal6ef.png-10.2kB

 

3.2.3 提交數據到SVN版本庫

 

(1)一次失敗的提交

pwd

mkdir [1..5]

ll

svn add * --->提交前須要先把要提交的內容作標記A(至關於windows上勾對號)

svn ci -m "message" --->提交時須要同時-m指定一段話做爲備註

 
  1. A 1
  2. A 2
  3. A 3
  4. A 4
  5. A 5
  6. svn: warning: '666.txt.txt' is already under version control --->這個文件已經標記過了
 
  1. svn: Commit failed (details follow):
  2. svn: Authorization failed #提交失敗,帳戶沒有寫權限,認證失敗

image_1ct32o0521vjcdhc1576d191i4kes.png-53.5kB

 

(2)換帳戶從新Checkout

svn co svn://192.168.200.69/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123123 
換擁有寫入權限的帳戶checkout

Store password unencrypted (yes/no)? yes --->是否做爲目錄的新帳戶和密碼

ll

image_1ct330onc1khn1bbo1meiuj21p3mf9.png-75.3kB

 

從新提交

svn add *

 
  1. svn: warning: '1' is already under version control
  2. svn: warning: '2' is already under version control
  3. svn: warning: '3' is already under version control
  4. svn: warning: '4' is already under version control
  5. svn: warning: '5' is already under version control
  6. svn: warning: '666.txt.txt' is already under version control --->這些文件已經標記過了

svn ci -m "message" --->從新提交

image_1ct3327iu1ff4oqj1mils271p4ifm.png-37.6kB

 

查看服務器端數據

svn list file:///application/svndata/yunjisuan/

image_1ct333plk1v5cosgscjo31luvg3.png-13.8kB

 

第4章 SVN鉤子腳本

 

4.1 鉤子腳本簡介

  • 鉤子腳本的具體寫法就是操做系統中shell腳本程序的寫法,可根據本身的SVN所在的操做系統和shell程序進行相應的開發。

  • 鉤子腳本就是被某些版本庫事件觸發的程序,例如:建立新版本或修改未被版本控制的屬性。每一個鉤子都能掌管足夠的信息來了解發生了什麼事件,操做對象是什麼以及觸發事件用戶的帳號。

  • 根據鉤子的輸出或返回狀態,鉤子程序可以以某種方式控制該動做繼續執行,中止或掛起。

 

默認狀況下,鉤子的子目錄中包含各類版本庫鉤子模板

ls -l /application/svndata/yunjisuan/hooks/

  • 對每種Subversion版本庫支持的鉤子都有一個模板,經過查看這些腳本的內容,你能看到是什麼事件觸發了腳本及如何給傳腳本傳遞數據。

  • 同時,這些模板也是如何使用這些腳本,結合Subversion支持的工具來完成有用任務的例子。

  • 要實際安裝一個可用的鉤子,你須要在repos/hooks目錄下安裝一些與鉤子同名(如start-commit或者post-commit)的可執行程序或腳本,注意,去掉模板的擴展名。

image_1ct33gcri1ma7boo20n1k6m124qgg.png-41.8kB

 

重要提示

因爲安全緣由,Subversion版本庫在一個空環境中執行鉤子腳本就是沒有任何環境變量,甚至沒有$PATH或%PATH%。因爲這個緣由,許多管理員會感到很困惑,他們的鉤子腳本手工運行時正常,可在Subversion中卻不能運行。要注意,必須在你的鉤子中設置好環境變量或爲你的程序指定好絕對路徑。

 

4.2 SVN的hooks模板

 

4.2.1 經常使用鉤子腳本

image_1crjn8s8lkqc14mlr3fo441t7q62.png-29.9kB

 

4.2.2 很是用鉤子腳本

  1. pre-revprop-change:在修改revision屬性以前,執行該腳本

  2. post-revprop-change:在修改revision屬性以後,執行該腳本。由於修改稿已經完成,不可更改,所以本腳本的返回值被忽略(不過實際上的實現彷佛是該腳本的正確執行與否影響屬性修改)

  3. pre-unlock:對文件進行解鎖操做以前執行該腳本

  4. post-unlock:對文件進行解鎖操做以後執行該腳本

  5. pre-lock:對文件進行加鎖操做以前執行該腳本

  6. post-lock:對文件進行加鎖操做以後執行該腳本。

 

4.2.3 利用鉤子腳本觸發同步數據的注意事項

(1)必定要定義變量,主要是用過的命令的路徑。由於SVN的考慮的安全問題,沒有調用系統變量,若是手動執行是沒有問題,但SVN自動執行就會沒法執行了。

(2)SVN的同步目錄在 update以前必定要先checkout一份出來,還有這裏必定要添加用戶和密碼。

(3)加上了對前一個命令的判斷,若是update的時候出了問題,程序沒有退出的話還會繼續同步代碼到Web服務器上,這樣會形成代碼有問題。

(4)建議最好記錄日誌,出錯的時候能夠很快的排錯

(5)最後是數據同步,rsync的相關參數必定要清楚。

 

4.3 svn鉤子生產應用場景舉例

  • pre-commit: 
    限制上傳文件擴展名及大小,控制提交要輸入的信息等。

  • post-commit: 
    SVN更新自動通知,MSN,郵件或短信通知。 
    SVN更新觸發checkout程序,而後實時rsync推送到服務器等。

 

4.4 svn鉤子生產應用實戰

 

4.4.1 rsync與svn鉤子結合實現數據實時同步某企業小案例

 

(1)創建同步WEB目錄

mkdir -p /data/www

 

(2)將SVN中內容checkout到WEB目錄一份。

 
  1. [root@localhost yunjisuan]# mkdir -p /data/www
  2. [root@localhost yunjisuan]# svn checkout svn://192.168.0.220/yunjisuan /data/www --username=yunjisuan --password=123123
  3. A /data/www/xxxx
  4. A /data/www/111
  5. A /data/www/120
  6. A /data/www/112
  7. A /data/www/113
  8. A /data/www/114
  9. A /data/www/ffff.txt
  10. A /data/www/115
  11. A /data/www/116
  12. A /data/www/117
  13. A /data/www/118
  14. A /data/www/119
  15. Checked out revision 7.
  16. [root@localhost yunjisuan]# ll /data/www/
  17. total 44
  18. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111
  19. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112
  20. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113
  21. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114
  22. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115
  23. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116
  24. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117
  25. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118
  26. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119
  27. drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120
  28. -rw-r--r--. 1 root root 30 Sep 13 21:32 ffff.txt
  29. -rw-r--r--. 1 root root 0 Sep 13 21:32 xxxx
 

(3)製做鉤子腳本,post-commit

 
  1. root@localhost yunjisuan]# cd /application/svndata/yunjisuan/hooks/
  2. [root@localhost hooks]# cp post-commit.tmpl post-commit #複製模板一份
  3. [root@localhost hooks]# egrep -v "#|^$" post-commit #模板原始內容
  4. REPOS="$1"
  5. REV="$2"
  6. mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
  7. [root@localhost hooks]# vim post-commit #修改post-commit腳本
  8. [root@localhost hooks]# egrep -v "#|^$" post-commit
  9. REPOS="$1" #傳參(未用上)
  10. REV="$2" #傳參(未用上)
  11. SvnIP="192.168.200.69" #svn服務端的IP地址
  12. ProjectName="yunjisuan" #svn服務端的項目庫名稱
  13. UserName="yunjisuan" #帳戶姓名
  14. PassWord="123123" #帳戶密碼
  15. LocalPath="/data/www" #位於svn本地的共享目錄
  16. SVN=/usr/bin/svn #svn命令的絕對路徑
  17. export LC_CTYPE="en_US.UTF-8" #中文字符集支持
  18. export LC_ALL=
  19. if [ ! -d ${LocalPath} ];then
  20. mkdir -p ${LocalPaht}
  21. $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord} #新建立目錄須要先通過checkout才能update
  22. else
  23. $SVN update --username yunjisuan --password 123123 /data/www #更新共享目錄內容
  24. fi
  25. if [ $? -eq 0 ];then
  26. /usr/bin/rsync -az --delete /data/www /tmp/ #數據同步推送到本地/tmp目錄下(生產環境能夠直接同步推送到Web測試服務器)
  27. fi
 

(4)進行鉤子腳本同步測試

 
  1. #刪除以前的測試記錄
  2. [root@localhost hooks]# rm -rf /data/www/
  3. [root@localhost hooks]# ll -d /data/www
  4. ls: cannot access /data/www: No such file or directory
  5. [root@localhost hooks]# rm -rf /tmp/*
  6. [root@localhost hooks]# ll /tmp/
  7. total 0
  8. [root@localhost hooks]# chmod 700 post-commit #給鉤子腳本可執行權限
 

特別提示

當用戶經過svn更新鉤子post-commit所在的項目庫時,在更新完畢以後會自動觸發鉤子腳本

 

模擬更新項目庫版本

image_1crjndtsv1ld9jru1lnc1tq517pk6v.png-46.1kB


image_1crjne5m61gah1d0j3e711od16av7c.png-37.7kB

 

查看svn服務器端鉤子腳本執行狀況

 
  1. [root@localhost hooks]# ll /data/www/ #svn服務器端本地共享目錄
  2. total 28
  3. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111
  4. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112
  5. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113
  6. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116
  7. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117
  8. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118
  9. -rw-r--r--. 1 root root 0 Sep 13 23:07 test.txt
  10. -rw-r--r--. 1 root root 9 Sep 13 23:07 xxx.txt
  11. -rw-r--r--. 1 root root 0 Sep 13 23:07 xxxx
  12. [root@localhost hooks]# ll /tmp/www/ #推送後的數據目錄
  13. total 28
  14. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111
  15. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112
  16. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113
  17. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116
  18. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117
  19. drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118
  20. -rw-r--r--. 1 root root 0 Sep 13 23:07 test.txt
  21. -rw-r--r--. 1 root root 9 Sep 13 23:07 xxx.txt
  22. -rw-r--r--. 1 root root 0 Sep 13 23:07 xxxx
  23. > 綜上,post-commit鉤子腳本測試成功。
 

4.4.2 經過pre-commit的鉤子腳本還能夠對用戶上傳的內容進行大小和擴展名的限制

由於並不經常使用,這部份內容,咱們略過

 

第5章 大中小型企業上線解決方案

 

5.1 SVN 上線解決方案說明

 

5.1.1 小型公司代碼上線案例(十幾臺服務器)

image_1crjnfpf41l2a1ces5at1j741bi67p.png-163.1kB

開發每次修改完代碼就直接提交,而後經過FTP直接更新到Web服務器網頁目錄;沒有專門的測試人員,徹底是由用戶來進行測試體驗。

 

小型企業現狀

小型公司通常只有幾個開發人員,網站核心程序大多數都是PHP語言開發,爲了方便,會直接經過FTP直接上傳程序代碼到線上服務器,隨時隨地上線更新。

 

上述上線方案的特色和問題

  1. 發佈快,及時,隨時隨地就能夠發佈代碼。

  2. 開發人員發佈的代碼不通過測試人員的測試,且用戶訪問頁面刷新後頁面即改變,也可能刷新瞬間程序在更新,到時沒法訪問,對網站用戶的體驗比較差,若是開發寫錯了代碼,形成的影響就更大了,這是拿用戶做爲測試的上線方案。

  3. 據統計,網站中大概50%以上的故障是和開發程序代碼有關的,(好比:開發寫錯了一個循環代碼,致使了死循環,此時大量用戶訪問這個程序,就能把服務器資源耗盡,搞死服務器)

  4. 在中小公司網站出了問題通常是運維人員的問題(例如網站宕機),但這種狀況下,問題大多可能由開發人員或代碼引發的,這裏比較好的策略是開發項目負責制思想。

 

小型企業上線架構方案建議

  1. 開發人員需在我的電腦搭建LAMP環境測試開發好的網站代碼,而且在辦公室或IDC機房的測試環境測試經過,最好有專職測試人員。

  2. 程序代碼上線規定時間,例如,三天上線一次,如網站需常常更新可天天下午17點上線,這個看網站業務性質而定,原則就是影響用戶體驗最小。

  3. 代碼上線以前需備份,網站程序出了問題方便回退,另外,網站程序出了問題方便回退,另外,從上線技巧上講,上傳代碼時儘量先傳到服務器網站臨時目錄,傳完整後一步mv過去,或者經過ln作軟鏈接。(線上更新代碼思路)

  4. 務必由運維人員管理上線,對於代碼的功能性,開發人員更在乎,而對於代碼的性能和服務的穩定,運維更在乎,所以,若是網站問題歸運維管,就要讓運維上線這樣更規範科學。不然,開發隨意更新,出了問題運維負責,這樣就錯了。

 

5.1.2 中型企業上線解決方案

中型企業上線,通常是規範運維人員操做步驟,制定統一的上線操做腳本,備份文件名稱,備份文件路徑。使操做人性化,統一化,自動化。

 

Web代碼的上線流程演示圖

image_1crjniail1gdttrp1ptoi2svq886.png-38.6kB

 

5.1.3 大型企業上線解決方案

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

image_1d9jh8btrni1io811qu1so71glc1c.png-502.8kB

SVN裏的內容: 
1,程序代碼 
2,服務的配置 
3,項目文檔,設計文檔,運維部署優化文檔

 

門戶大型網站架構環境代碼上線具體方案

  1. 本地開發人員從SVN中取代碼。當天上線的提交到trunk,不然,長期項目單開分支開發,而後在合併主線(trunk)

  2. 辦公內網開發測試時,由開發人員或配置管理員經過部署平臺jenkins實現統一部署,(即在部署平臺上控制開發機器從SVN取代碼,編譯,打包,發佈到開發機器,包名如idc_dep.war)

  3. 開發人員通知或和測試人員一塊兒測試程序,沒有問題後,打上新的tag標記。

  4. 配置管理員,根據上步的tag標記,checkout出上線代碼,並配置好IDC測試環境的全部配置,執行編譯,打包(mvn,ant)(php不須要),而後發佈到IDC內的統一分發服務器,這裏要注意,不一樣環境的配置文件是隨代碼同時發佈的。

  5. 配置管理員或SA上線人員,把分發的程序代碼內容推送到相關測試服務器(包名如idc_test.war),而後通知開發及測試人員進行測試。若是有問題向上回退,繼續修改。

  6. 若是測試沒有問題,繼續打好tag標記,此時,配置管理員,根據上步的tag標記,checkout出測試好的代碼,並配置好IDC正式環境的全部配置,執行編譯,打包(mvn,ant)(php不須要),而後發佈到IDC內的統一分發服務器主機,準備批量發佈。

  7. 配置管理員或SA上線人員,把分發的內容推送到相關正式服務器(包名如idc_product.war),而後通知開發及測試人員進行測試。若是有問題直接發佈回滾指令。

IDC正式上線的過程對於JAVA程序,能夠是AB分組上線的思路,即平滑下線一半的服務器,而後發佈更新代碼測試,無問題後,掛上服務器,同時在平滑下線另外一半的服務器,而後發佈更新代碼測試(或者直接發佈後就掛上線)

 

PHP程序代碼上線的具體方案

對於PHP上線方法:發佈代碼時(也須要測試流程)能夠直接發佈到正式線臨時目錄,而後mv或更改link的方式發佈到正式線目錄,不須要重啓http服務。這是sina,ganji的上線方案。

 

JAVA程序代碼上線的具體方案

對於java上線方法:較大公司須要分組平滑上線,例如,首先從負載均衡器上摘掉一半的服務器,發佈代碼後,重啓服務器測試,沒問題後,掛上通過測試的這一半,再下另一半。若是前端有DNS智能解析,上線還能夠分地區上線若干服務器,逐漸普及到全國的服務器,這個被稱爲灰度發佈。

 

5.1.4 更多大型代碼上線解決方案案例

 

SINA網的代碼發佈流程邏輯圖

image_1crjnlp8b13ch1o9i1n6rj3sgb9g.png-73kB

 

(2)和訊案例

 
  1. ABCD 12:33:24
  2. 咱們這裏代碼發佈都不太標準,所有都是開發本身搞
  3. Mr.chen 123514
  4. 目前是什麼個方式呢
  5. 說下現狀便可。
  6. ABCD 12:36:04
  7. 就是很傳統,開發有權限能夠上機器,咱們就把應用部署好,他們隨便折騰。
  8. ABCD 12:41:05
  9. 源代碼是svn,靜態內容都是同步分發
 

(3)小米案例

 
  1. XYZ 13:36:49
  2. 代碼上線都是開發上,咱們運維這邊沒有流程...若是代碼發佈致使了問題,就是開發的問題。
  3. XYZ 13:37:55
  4. 服務器上面有一個客戶端,開發本身在頁面上點發布,客戶端就去拉代碼了。
  5. 就是這麼個額流程,就像你之前說的,項目責任制,誰的項目出問題了。找開發和運維
  6. Mr.chen 13:49:08
  7. 不須要重啓服務器麼?還有直接拉到站點目錄麼?
  8. XYZ 13:49:17
  9. 嗯,都是自動的
  10. 他們有個管理系統
  11. Mr.chen 13:49:49
  12. 如何保證不影響用戶呢?
  13. 還有怎麼回滾的。
  14. XYZ 13:50:12
  15. 尚未作到這點把
  16. 那個管理系統能夠回滾的,好像
  17. 平時把客戶的部署上去,再把機器加入到那個系統中
  18. 他們就能夠發了。
  19. XYZ 13:58:16
  20. 運維這邊就管添加機器和安裝客戶端,也有發佈權限,項目上線後不多發。一教就會沒有在這塊搞過太多,那個程序和版本管理結合的。實現原理應該就是客戶端收到服務器發來的clone命令和路徑,就去執行了。
 

什麼是配置管理員呢

就是在開發和運維中間起一個鏈接紐帶的一個職位,這個職位通常在大公司裏會設置,負責SVN的管理,上線管理,申請,協調等工做。

 

5.2 自動化部署和上線代碼管理

對於門戶網站或重視規範或開發能力較強的公司也許會結合系統服務和WEB界面管理來更科學更自動的進行上線代碼管理,如開發一個自動化代碼上線部署平臺,其實就是一個web管理界面(界面底層調用相關腳本實現分發推送代碼以及重啓服務器),而後普通的初級上線人員就能夠在平臺裏實現僅僅點鼠標,敲回車,就能實現平滑上線和平滑回滾代碼了,固然,自動化和完善的程度也許沒咱們說的這麼好,可是,思路是這樣的。下面就是管理平臺的一個圖例:

image_1crjnn859g1a13evhv7dia18sjad.png-102.1kB

 

開發自動化部署平臺的思路不少,例如:咱們能夠經過nagios的被動模式實現上線管理平臺原理思路

實際上就是生成配置在分發服務器上執行命令請求,應用服務器,而後腳本在應用服務器處理完畢後回傳結果到web界面顯示:

例如:check_nrpe -h 10.0.0.178 -c check_load

 

5.3 開發人員和運維人員業務變動管理平臺

 

業務變動管理平臺優勢

(1)變動管理制度流程有利於業務穩定。

(2)保留變動業務歷史,便於覈查發現的問題。

(3)故障跟蹤平臺,有利於跟蹤問題的解決進度,而不是半途而廢。

(4)相關經常使用軟件(有時間最好研究一下) 
JIRA 用於缺陷跟蹤,客戶服務,需求收集,流程審批,任務跟蹤,項目跟蹤和敏捷管理等工做領域。 Mantis是一款PHP開源Bug跟蹤系統,比較適合中小型項目的管理及跟蹤,具備多特性。包括:易於安裝,易於操做,基於Web,支持任何可運行PHP的平臺(Windows,Linux,Mac,Solaris,AS400/i5等),已經被翻譯成68種語言,支持多個項目,爲每個項目設置不一樣的用戶訪問級別,跟蹤缺陷變動歷史,定製個人視圖頁面,提供全文搜索功能,內置報表生成功能(包括圖形報表),經過Email報告缺陷,用戶能夠監視特殊的Bug,附件能夠保存在web服務器上或數據庫中(還能夠備份到FTP服務器上),自定義缺陷處理工做流,支持輸出格式包括csv,MicrosoftExcel,MicrosoftWord,集成源代碼控制(SVN與CVS),集成wiki知識庫與聊天工具(可選/可不選),支持多種數據庫(MySQL,MSSQL,PostgreSQ,Oracle,DB2),提供WebService(SOAP)接口,提供Wap訪問。

相關文章
相關標籤/搜索