- 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
svn版本控制系統是集中式的數據管理,存在一箇中央版本庫,全部開發人員本地開發所使用的代碼都是來自於這個版本庫,提交代碼也都必須提交到這個中央版本庫。前端
svn版本控制系統工做流程以下:java
缺點:linux
當沒法鏈接到中央版本庫的環境下,你沒法提交代碼,將代碼加入版本控制;
你沒法查看代碼的歷史版本以及版本的變化過程。提交到版本控制系統中的代碼咱們都默認經過自測可運行的,若是某個模塊的代碼比較複雜,不能短期內實現爲可測試的功能,那麼你須要等很長的時間才能提交本身的代碼,因爲代碼庫集中管理,所以,須要對中央版本庫的存儲作備份。這點分佈式的版本控制系統要好一些。Svn的備份要備份全部代碼數據以及全部更改的版本記錄。ios
- git是由Linus開發的,因此很天然的git和Linux文件系統結合的比較緊密,以致於在windows上你必須使用cygwin才能使其完美的工做。
- 那git憑啥叫作分佈式的版本控制系統呢?仍是從其工做模式講起把。
- git中沒有了中央版本庫的說法了,可是爲了開發小組的代碼共享,咱們一般仍是會搭建一個遠程的git倉庫。
- 可是和svn不一樣的是,開發者本地也包含了一個完整的git倉庫,從某種程度上說本地的倉庫和遠程的倉庫在身份上是等價的,沒有主從之分。
- 若是你的項目是閉源項目,或者你習慣於以往的集中式的管理模式的話,那麼在git下你也能夠像svn那樣的工做,只是流程中可能會增長一些步驟。
從上面的描述咱們能夠看到,咱們每一個開發人員的本地都會有一個git庫,咱們能夠隨時進行commit而不須要聯網,能夠隨時查看歷史版本,當某一個功能點開發完了以後咱們能夠將commit後的內容push到遠程git庫了,若是遠程git庫的版本在你上次clone或者pull以後變化了,那麼你須要進行pull並處理衝突,提交以後,再push到遠程git庫。git
svn還是當前企業的主流。git正在發展,也許將來也會成爲主流,但如今還不是。若是同窗們有精力,能同時掌握更好。程序員
對於版本管理系統,運維人員須要掌握的技術點:web
svn服務常見的運行訪問方式有3種:shell
(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)
在這裏,主要給同窗們介紹第一種方式以及第二種方式中的CSVN web管理方式
SVN客戶端能夠經過多種方式訪問服務器端,例如:本地磁盤訪問,或各類各樣不一樣的網絡協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。
訪問方式 | 說明 |
---|---|
file:// | 直接經過本地磁盤或者網絡磁盤訪問版本庫 |
http:// | 經過WebDAV協議訪問支持Subversion的Apache服務器 |
https:// | 與http://類似,可是用SSL加密訪問 |
svn:// | 經過TCP/IP自定義協議訪問svnserve服務器 |
svn+ssh:// | 經過認證並加密的TCP/IP自定義協議訪問svnserve服務器 |
svn存儲版本數據有2種方式:BDB(一種事務安全型表類型)和FSFS(一種不須要數據庫的存儲系統)。由於BDB方式在服務器中斷時,有可能鎖住數據,因此仍是FSFS方式更安全一點。
伯克利DB(Berkeley DB),版本庫可使用的一種通過充分測試的後臺數據庫實現,不能在經過網絡共享的文件系統上使用,伯克利DB是Subversion 1.2版本之前的缺省版本庫格式
一個專用於Subversion版本庫的文件系統後端,可使用網絡文件系統(例如 NFS 或 SMBFS)。是1.2版本及其後的缺省版本庫格式。
Svn是一種集中式文件版本管理系統。集中式管理的工做流程以下圖:
集中式代碼管理的核心是SVN服務器,全部開發者在開始新一天的工做以前必須從服務器獲取代碼,而後進行開發,最後解決衝突,提交。全部的版本信息都放在SVN服務器上。所以若是脫離了服務器,開發者就沒法進行提交代碼工做。
下面舉例說明:
開始新一天的工做:
優勢:
#檢查環境 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@localhost ~]# uname -m x86_64 [root@localhost ~]# uname -r 2.6.32-431.el6.x86_64 #光盤安裝svn [root@localhost ~]# yum -y install subversion [root@localhost ~]# rpm -qa subversion subversion-1.6.11-9.el6_4.x86_64 #創建svn版本庫數據存儲根目錄(svndata)及用戶,密碼權限目錄(svnpasswd) mkdir -p /application/svndata #數據存儲根目錄 mkdir -p /application/svnpasswd #用戶,密碼權限目錄
建立一個新的Subversion項目yunjisuan,其實,相似yunjisuan這樣的項目能夠建立多個,每一個項目對應不一樣的代碼,這裏只是以建立一個項目爲例演示:
[root@localhost ~]# svnadmin create /application/svndata/yunjisuan [root@localhost ~]# tree /application/svndata/yunjisuan/ /application/svndata/yunjisuan/ |-- README.txt |-- conf | |-- authz | |-- passwd | `-- svnserve.conf |-- db | |-- current | |-- format | |-- fs-type | |-- fsfs.conf | |-- min-unpacked-rev | |-- rep-cache.db | |-- revprops | | `-- 0 | | `-- 0 | |-- revs | | `-- 0 | | `-- 0 | |-- transactions | |-- txn-current | |-- txn-current-lock | |-- txn-protorevs | |-- uuid | `-- write-lock |-- format |-- hooks | |-- post-commit.tmpl | |-- post-lock.tmpl | |-- post-revprop-change.tmpl | |-- post-unlock.tmpl | |-- pre-commit.tmpl | |-- pre-lock.tmpl | |-- pre-revprop-change.tmpl | |-- pre-unlock.tmpl | `-- start-commit.tmpl `-- locks |-- db-logs.lock `-- db.lock 10 directories, 28 files #提示:查看svnadmin命令幫助的方法
[root@localhost ~]# cd /application/svndata/yunjisuan/conf/ [root@localhost conf]# ll total 12 -rw-r--r--. 1 root root 1080 Sep 13 16:02 authz -rw-r--r--. 1 root root 309 Sep 13 16:02 passwd -rw-r--r--. 1 root root 2279 Sep 13 16:02 svnserve.conf [root@localhost conf]# cp svnserve.conf{,.bak} [root@localhost conf]# vim svnserve.conf #修改配置文件的以下信息 [root@localhost ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p' 12 # anon-access = read 13 # auth-access = write 20 # password-db = passwd 27 # authz-db = authz #將配置文件代碼修改成以下所示: [root@localhost ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p' 12 anon-access = none #禁止匿名訪問 13 auth-access = write #驗證訪問可寫 20 password-db = /application/svnpasswd/passwd #密碼文件位置 27 authz-db = /application/svnpasswd/authz #驗證文件位置 特別提示: 此配置文件裏的每條配置代碼必須頂格寫,不能有空格。
[root@localhost conf]# cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/ [root@localhost conf]# cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/ [root@localhost conf]# ll /application/svnpasswd/ total 8 -rw-r--r--. 1 root root 1080 Sep 13 17:07 authz -rw-r--r--. 1 root root 309 Sep 13 17:07 passwd
[root@localhost conf]# svnserve --help #svn啓動命令幫助 svnserve: warning: cannot set LC_CTYPE locale svnserve: warning: environment variable LANG is en svnserve: warning: please check that your locale name is correct usage: svnserve [-d | -i | -t | -X] [options] Valid options: -d [--daemon] : daemon mode #守護進程啓動(後臺) -i [--inetd] : inetd mode -t [--tunnel] : tunnel mode -X [--listen-once] : listen-once mode (useful for debugging) -r [--root] ARG : root of directory to serve #指定根目錄 -R [--read-only] : force read only, overriding repository config file --config-file ARG : read configuration from file ARG --listen-port ARG : listen port #監聽端口默認3690 [mode: daemon, listen-once] --listen-host ARG : listen hostname or IP address #監聽IP [mode: daemon, listen-once] -T [--threads] : use threads instead of fork [mode: daemon] --foreground : run in foreground (useful for debugging) [mode: daemon] --log-file ARG : svnserve log file --pid-file ARG : write server process ID to file ARG [mode: daemon, listen-once] --tunnel-user ARG : tunnel username (default is current uids name) [mode: tunnel] -h [--help] : display this help --version : show program version information #啓動svn服務 [root@localhost conf]# svnserve -d -r /application/svndata/ svnserve: warning: cannot set LC_CTYPE locale #警告能夠忽略 svnserve: warning: environment variable LANG is en #警告能夠忽略 svnserve: warning: please check that your locale name is correct ##警告能夠忽略 [root@localhost conf]# netstat -antup | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1256/svnserve
[root@localhost conf]# source /etc/sysconfig/i18n #啓用中文字符集 [root@localhost conf]# pkill svnserve [root@localhost conf]# svnserve -d -r /application/svndata/ [root@localhost conf]# netstat -antup | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1261/svnserve [root@localhost conf]# cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16"
#在/application/svnpasswd/passwd文件末尾追加以下內容: [root@localhost conf]# tail -4 /application/svnpasswd/passwd yunjisuan = 123123 #設置帳號密碼 benet = 123123 #設置帳號密碼 stu001 = 123 #設置帳號密碼 stu002 = 456 #設置帳號密碼
注意:
1,權限配置文件中出現的用戶名必須已在用戶配置文件中定義
2,對權限配置文件的修改當即生效,沒必要重啓svn
權限配置說明 #用戶組格式: 【groups】 =, 其中,1個用戶組能夠包含1個或多個用過戶,用戶間以逗號分隔。 例如:harry\_and\_sally = harry,sally #==>用戶組 = 用戶1,用戶2 #版本庫目錄格式: [<版本庫>:/項目/目錄] #例如:[repository:/baz/fuz] @<用戶組名> = <權限> #例如:@harry\_and\_sally = rw <用戶名> = <權限> #例如:harry = rw #其中,方框號內部分能夠有多種寫法: [/],表示根目錄及如下,根目錄是svnserve啓動時指定的,咱們指定爲/application/svndata,[/]就是表示對所有版本庫設置權限。 [repos:/],表示對版本庫repos設置權限。 [repos:/yunjisuan],表示對版本庫repos中的yunjisuan項目設置權限。 [repos:/yunjisuan/benet],表示對版本庫repos中的yunjisuan項目的benet目錄設置權限。 #權限主體能夠是用戶組,用戶或*,用戶組在前面加@,*表示所有用戶。 #權限能夠是w,r,wr和空,空表示沒有任何權限。 #authz中每一個參數都要頂格寫,開頭不能有空格。 #對於組,要以@開頭,用戶不須要@開頭。
#編輯authz配置文件進行受權,在authz末尾加入如下幾句代碼 [root@localhost conf]# egrep -v "#|^$" /application/svnpasswd/authz [aliases] [groups] sagroup = stu001,stu002 #新增本行,定義組名 [yunjisuan:/] #定義受權的範圍 yunjisuan = rw #用戶單獨受權 benet = r #用戶單獨受權 @sagroup = r #組用戶受權
[root@localhost conf]# ps -ef | grep svn | grep -v grep root 1261 1 0 17:16 ? 00:00:00 svnserve -d -r /application/svndata/ [root@localhost conf]# kill 1261 [root@localhost conf]# ps -ef | grep svn | grep -v grep [root@localhost conf]# svnserve -d -r /application/svndata/
推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
注意:32位系統要用32位軟件版本
一路yes便可
(1)先在本地建立一個目錄,起名任意,好比data
(2)鼠標右鍵點擊data目錄
選擇右鍵菜單裏的SVN Checkout,出現下圖:
特別提示:
若是鏈接不通,請檢查Linux虛擬機的iptables是否關閉。
點擊OK後,出現下圖:
再次點擊OK之後,結束。此時目錄裏多了一個隱藏的目錄,表示此目錄已經和svn服務器連通
命令說明:
(1)SVN Checkout:至關於下載,第一次鏈接svn服務器的時候須要和服務器的對應存儲目錄進行數據同步,若是服務器的對應目錄裏有數據文件,那麼就會下載到你的本地對應目錄裏。
(2)SVN Update:更新數據,檢查服務器端svn存儲目錄裏是否和本地svn存儲目錄數據不一致,若是不一致,那麼下載改變或新增的部分到本地svn目錄裏。(不會刪除本地目錄內容)
(3)SVN Commit:提交數據到svn服務器端存儲目錄。本地svn存儲目錄會和服務器端存儲目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至服務器端。
(1)向windows的svn存儲目錄data裏放一個空文件
(2)右鍵點擊data目錄,選擇SVN Commit
(3)打開本地data目錄裏的文件,隨便寫點內容後,再次進行SVN commit
(4)直接從本地查看服務器端的數據內容
右鍵點擊本地svn存儲目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖:
雙擊文件能夠直接遠程打開文件,能夠看到裏面剛剛被修改後的內容已經更新至服務器端。
(5)刪除本地svn存儲目錄data裏的文件,後選擇SVN Update
同窗們會發現,剛剛刪除的文件又從新下載回來了。
(6)繼續刪除本地svn存儲目錄data裏的文件,後選擇SVN Commit
(7)再次查看服務器端存儲目錄裏,發現文件已經被刪除了
[root@localhost ~]# svn --help usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.6.11. Type 'svn help <subcommand>' for help on a specific subcommand. Type 'svn --version' to see the program version and RA modules or 'svn --version --quiet' to see just the version number. Most subcommands take file and/or directory arguments, recursing on the directories. If no arguments are supplied to such a command, it recurses on the current directory (inclusive) by default. Available subcommands: add blame (praise, annotate, ann) cat changelist (cl) checkout (co) #下載數據 cleanup commit (ci) #提交數據 copy (cp) delete (del, remove, rm) diff (di) export help (?, h) import info list (ls) #顯示服務器端內容 lock log merge mergeinfo mkdir move (mv, rename, ren) propdel (pdel, pd) propedit (pedit, pe) propget (pget, pg) proplist (plist, pl) propset (pset, ps) resolve resolved revert status (stat, st) switch (sw) unlock update (up) #更新數據 Subversion is a tool for version control. For additional information, see http://subversion.tigris.org/
將文件checkout到本地目錄
svn checkout(co) remotepath localpath
[root@localhost ~]# mkdir yunjisuan [root@localhost ~]# cd yunjisuan/ [root@localhost yunjisuan]# pwd /root/yunjisuan #下載服務器端數據到Linux本地目錄 [root@localhost yunjisuan]# svn co svn://192.168.0.220/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123 Restored '/root/yunjisuan/ffff.txt' Checked out revision 6. [root@localhost yunjisuan]# ll total 4 -rw-r--r--. 1 root root 30 Sep 13 19:45 ffff.txt
svn list file:///application/svndata/yunjisuan
[root@localhost yunjisuan]# svn list file:///application/svndata/yunjisuan/ ffff.txt
(1)一次失敗的提交
[root@localhost yunjisuan]# pwd /root/yunjisuan [root@localhost yunjisuan]# mkdir {111..120} #建立目錄 [root@localhost yunjisuan]# ll total 44 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 111 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 112 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 113 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 114 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 115 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 116 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 117 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 118 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 119 drwxr-xr-x. 2 root root 4096 Sep 13 19:56 120 -rw-r--r--. 1 root root 30 Sep 13 19:45 ffff.txt -rw-r--r--. 1 root root 0 Sep 13 19:48 xxxx [root@localhost yunjisuan]# svn add * #提交前須要先把要提交的內容作標記A A 111 A 112 A 113 A 114 A 115 A 116 A 117 A 118 A 119 A 120 svn: warning: 'ffff.txt' is already under version control #這個文件已經標記過了 A xxxx [root@localhost yunjisuan]# svn ci -m "message" #提交時須要同時-m指定一段話做爲備註 Authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 Password for 'benet': #輸入benet用戶密碼(以前checkout時的帳號密碼已經記錄到了此目錄) ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes #是否記錄帳戶 svn: Commit failed (details follow): svn: Authorization failed #提交失敗,帳戶沒有寫權限,認證失敗
(2)換帳戶從新Checkout
[root@localhost yunjisuan]# svn co svn://192.168.0.220/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123123 #換擁有寫入權限的帳戶checkout ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes #是否做爲目錄的新帳戶和密碼 Checked out revision 6. [root@localhost yunjisuan]# ll total 44 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 111 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 112 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 113 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 114 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 115 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 116 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 117 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 118 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 119 drwxr-xr-x. 3 root root 4096 Sep 13 19:57 120 -rw-r--r--. 1 root root 30 Sep 13 19:45 ffff.txt -rw-r--r--. 1 root root 0 Sep 13 19:48 xxxx #從新提交 [root@localhost yunjisuan]# svn add * svn: warning: '111' is already under version control #文件或目錄已經歸入了版本控制(也就是作過標記了) svn: warning: '112' is already under version control svn: warning: '113' is already under version control svn: warning: '114' is already under version control svn: warning: '115' is already under version control svn: warning: '116' is already under version control svn: warning: '117' is already under version control svn: warning: '118' is already under version control svn: warning: '119' is already under version control svn: warning: '120' is already under version control svn: warning: 'ffff.txt' is already under version control svn: warning: 'xxxx' is already under version control [root@localhost yunjisuan]# svn ci -m "message" #從新提交 Adding 111 Adding 112 Adding 113 Adding 114 Adding 115 Adding 116 Adding 117 Adding 118 Adding 119 Adding 120 Adding xxxx Transmitting file data . Committed revision 7. #查看服務器端數據 [root@localhost yunjisuan]# svn list file:///application/svndata/yunjisuan/ 111/ 112/ 113/ 114/ 115/ 116/ 117/ 118/ 119/ 120/ ffff.txt xxxx
- 鉤子腳本的具體寫法就是操做系統中shell腳本程序的寫法,可根據本身的SVN所在的操做系統和shell程序進行相應的開發。
- 鉤子腳本就是被某些版本庫事件觸發的程序,例如:建立新版本或修改未被版本控制的屬性。每一個鉤子都能掌管足夠的信息來了解發生了什麼事件,操做對象是什麼以及觸發事件用戶的帳號。
- 根據鉤子的輸出或返回狀態,鉤子程序可以以某種方式控制該動做繼續執行,中止或掛起。
默認狀況下,鉤子的子目錄中包含各類版本庫鉤子模板
[root@localhost ~]# ls -l /application/svndata/yunjisuan/hooks/ total 36 -rw-r--r--. 1 root root 1977 Sep 13 16:02 post-commit.tmpl -rw-r--r--. 1 root root 1638 Sep 13 16:02 post-lock.tmpl -rw-r--r--. 1 root root 2289 Sep 13 16:02 post-revprop-change.tmpl -rw-r--r--. 1 root root 1567 Sep 13 16:02 post-unlock.tmpl -rw-r--r--. 1 root root 3426 Sep 13 16:02 pre-commit.tmpl -rw-r--r--. 1 root root 2410 Sep 13 16:02 pre-lock.tmpl -rw-r--r--. 1 root root 2786 Sep 13 16:02 pre-revprop-change.tmpl -rw-r--r--. 1 root root 2100 Sep 13 16:02 pre-unlock.tmpl -rw-r--r--. 1 root root 2780 Sep 13 16:02 start-commit.tmpl
- 對每種Subversion版本庫支持的鉤子都有一個模板,經過查看這些腳本的內容,你能看到是什麼事件觸發了腳本及如何給傳腳本傳遞數據。
- 同時,這些模板也是如何使用這些腳本,結合Subversion支持的工具來完成有用任務的例子。
- 要實際安裝一個可用的鉤子,你須要在repos/hooks目錄下安裝一些與鉤子同名(如start-commit或者post-commit)的可執行程序或腳本,注意,去掉模板的擴展名。
重要提示:
因爲安全緣由,Subversion版本庫在一個空環境中執行鉤子腳本就是沒有任何環境變量,甚至沒有$PATH或%PATH%。因爲這個緣由,許多管理員會感到很困惑,他們的鉤子腳本手工運行時正常,可在Subversion中卻不能運行。要注意,必須在你的鉤子中設置好環境變量或爲你的程序指定好絕對路徑。
鉤子腳本 | 說明 |
---|---|
post-commit | 在提交完成成功建立版本以後執行該鉤子,提交已經完成,不可更改,所以,本腳本的返回值被忽略。提交完成時觸發事務 |
pre-commit | 提交完成前觸發執行該腳本 |
start-commit | 在客戶端尚未向服務器提交數據以前,即尚未創建Subversion transaction以前,執行該腳本(提交前出發事務) |
(1)必定要定義變量,主要是用過的命令的路徑。由於SVN的考慮的安全問題,沒有調用系統變量,若是手動執行是沒有問題,但SVN自動執行就會沒法執行了。
(2)SVN的同步目錄在 update以前必定要先checkout一份出來,還有這裏必定要添加用戶和密碼。
(3)加上了對前一個命令的判斷,若是update的時候出了問題,程序沒有退出的話還會繼續同步代碼到Web服務器上,這樣會形成代碼有問題。
(4)建議最好記錄日誌,出錯的時候能夠很快的排錯
(5)最後是數據同步,rsync的相關參數必定要清楚。
限制上傳文件擴展名及大小,控制提交要輸入的信息等。
SVN更新自動周知,MSN,郵件或短信周知。
SVN更新觸發checkout程序,而後實時rsync推送到服務器等。
(1)創建同步WEB目錄
mkdir -p /data/www
(2)將SVN中內容checkout到WEB目錄一份。
[root@localhost yunjisuan]# mkdir -p /data/www [root@localhost yunjisuan]# svn checkout svn://192.168.0.220/yunjisuan /data/www --username=yunjisuan --password=123123 A /data/www/xxxx A /data/www/111 A /data/www/120 A /data/www/112 A /data/www/113 A /data/www/114 A /data/www/ffff.txt A /data/www/115 A /data/www/116 A /data/www/117 A /data/www/118 A /data/www/119 Checked out revision 7. [root@localhost yunjisuan]# ll /data/www/ total 44 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120 -rw-r--r--. 1 root root 30 Sep 13 21:32 ffff.txt -rw-r--r--. 1 root root 0 Sep 13 21:32 xxxx
(3)製做鉤子腳本,post-commit
root@localhost yunjisuan]# cd /application/svndata/yunjisuan/hooks/ [root@localhost hooks]# cp post-commit.tmpl post-commit #複製模板一份 [root@localhost hooks]# egrep -v "#|^$" post-commit #模板原始內容 REPOS="$1" REV="$2" mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf [root@localhost hooks]# vim post-commit #修改post-commit腳本 [root@localhost hooks]# egrep -v "#|^$" post-commit REPOS="$1" #傳參(未用上) REV="$2" #傳參(未用上) SvnIP="192.168.0.220" #svn服務端的IP地址 ProjectName="yunjisuan" #svn服務端的項目庫名稱 UserName="yunjisuan" #帳戶姓名 PassWord="123123" #帳戶密碼 LocalPath="/data/www" #位於svn本地的共享目錄 SVN=/usr/bin/svn #svn命令的絕對路徑 export LC_CTYPE="en_US.UTF-8" #中文字符集支持 export LC_ALL= if [ ! -d ${LocalPath} ];then mkdir -p ${LocalPaht} $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord} #新建立目錄須要先通過checkout才能update else $SVN update --username yunjisuan --password 123123 /data/www #更新共享目錄內容 fi if [ $? -eq 0 ];then /usr/bin/rsync -az --delete /data/www /tmp/ #數據同步推送到本地/tmp目錄下(生產環境能夠直接同步推送到Web測試服務器) fi
(4)進行鉤子腳本同步測試
#刪除以前的測試記錄 [root@localhost hooks]# rm -rf /data/www/ [root@localhost hooks]# ll -d /data/www ls: cannot access /data/www: No such file or directory [root@localhost hooks]# rm -rf /tmp/* [root@localhost hooks]# ll /tmp/ total 0 [root@localhost hooks]# chmod 700 post-commit #給鉤子腳本可執行權限
特別提示:
當用戶經過svn更新鉤子post-commit所在的項目庫時,在更新完畢以後會自動觸發鉤子腳本
模擬更新項目庫版本
#查看svn服務器端鉤子腳本執行狀況 [root@localhost hooks]# ll /data/www/ #svn服務器端本地共享目錄 total 28 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118 -rw-r--r--. 1 root root 0 Sep 13 23:07 test.txt -rw-r--r--. 1 root root 9 Sep 13 23:07 xxx.txt -rw-r--r--. 1 root root 0 Sep 13 23:07 xxxx [root@localhost hooks]# ll /tmp/www/ #推送後的數據目錄 total 28 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117 drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118 -rw-r--r--. 1 root root 0 Sep 13 23:07 test.txt -rw-r--r--. 1 root root 9 Sep 13 23:07 xxx.txt -rw-r--r--. 1 root root 0 Sep 13 23:07 xxxx
綜上,post-commit鉤子腳本測試成功。
由於並不經常使用,這部份內容,咱們略過
開發每次修改完代碼就直接提交,而後經過FTP直接更新到Web服務器網頁目錄;沒有專門的測試人員,徹底是由用戶來進行測試體驗。
小型企業現狀:
小型公司通常只有幾個開發人員,網站核心程序大多數都是PHP語言開發,爲了方便,會直接經過FTP直接上傳程序代碼到線上服務器,隨時隨地上線更新。
上述上線方案的特色和問題:
小型企業上線架構方案建議:
中型企業上線,通常是規範運維人員操做步驟,制定統一的上線操做腳本,備份文件名稱,備份文件路徑。使操做人性化,統一化,自動化。
Web代碼的上線流程演示圖:
大型企業上線通常制度和流程控制較多,比較嚴謹,下面是某大型企業上線解決方案架構:
SVN裏的內容:
1,程序代碼
2,服務的配置
3,項目文檔,設計文檔,運維部署優化文檔
門戶大型網站架構環境代碼上線具體方案:
IDC正式上線的過程對於JAVA程序,能夠是AB分組上線的思路,即平滑下線一半的服務器,而後發佈更新代碼測試,無問題後,掛上服務器,同時在平滑下線另外一半的服務器,而後發佈更新代碼測試(或者直接發佈後就掛上線)
PHP程序代碼上線的具體方案:
對於PHP上線方法:發佈代碼時(也須要測試流程)能夠直接發佈到正式線臨時目錄,而後mv或更改link的方式發佈到正式線目錄,不須要重啓http服務。這是sina,ganji的上線方案。
JAVA程序代碼上線的具體方案:
對於java上線方法:較大公司須要分組平滑上線,例如,首先從負載均衡器上摘掉一半的服務器,發佈代碼後,重啓服務器測試,沒問題後,掛上通過測試的這一半,再下另一半。若是前端有DNS智能解析,上線還能夠分地區上線若干服務器,逐漸普及到全國的服務器,這個被稱爲灰度發佈。
(1)SINA網的代碼發佈流程邏輯圖:
(2)和訊案例
ABCD 12:33:24 咱們這裏代碼發佈都不太標準,所有都是開發本身搞 Mr.chen 12:35:14 目前是什麼個方式呢 說下現狀便可。 ABCD 12:36:04 就是很傳統,開發有權限能夠上機器,咱們就把應用部署好,他們隨便折騰。 ABCD 12:41:05 源代碼是svn,靜態內容都是同步分發
(3)小米案例
XYZ 13:36:49 代碼上線都是開發上,咱們運維這邊沒有流程...若是代碼發佈致使了問題,就是開發的問題。 XYZ 13:37:55 服務器上面有一個客戶端,開發本身在頁面上點發布,客戶端就去拉代碼了。 就是這麼個額流程,就像你之前說的,項目責任制,誰的項目出問題了。找開發和運維 Mr.chen 13:49:08 不須要重啓服務器麼?還有直接拉到站點目錄麼? XYZ 13:49:17 嗯,都是自動的 他們有個管理系統 Mr.chen 13:49:49 如何保證不影響用戶呢? 還有怎麼回滾的。 XYZ 13:50:12 尚未作到這點把 那個管理系統能夠回滾的,好像 平時把客戶的部署上去,再把機器加入到那個系統中 他們就能夠發了。 XYZ 13:58:16 運維這邊就管添加機器和安裝客戶端,也有發佈權限,項目上線後不多發。一教就會沒有在這塊搞過太多,那個程序和版本管理結合的。實現原理應該就是客戶端收到服務器發來的clone命令和路徑,就去執行了。
什麼是配置管理員呢?
就是在開發和運維中間起一個鏈接紐帶的一個職位,這個職位通常在大公司裏會設置,負責SVN的管理,上線管理,申請,協調等工做。
對於門戶網站或重視規範或開發能力較強的公司也許會結合系統服務和WEB界面管理來更科學更自動的進行上線代碼管理,如開發一個自動化代碼上線部署平臺,其實就是一個web管理界面(界面底層調用相關腳本實現分發推送代碼以及重啓服務器),而後普通的初級上線人員就能夠在平臺裏實現僅僅點鼠標,敲回車,就能實現平滑上線和平滑回滾代碼了,固然,自動化和完善的程度也許沒咱們說的這麼好,可是,思路是這樣的。下面就是管理平臺的一個圖例:
開發自動化部署平臺的思路不少,例如:咱們能夠經過nagios的被動模式實現上線管理平臺原理思路:
實際上就是生成配置在分發服務器上執行命令請求,應用服務器,而後腳本在應用服務器處理完畢後回傳結果到web界面顯示:
例如:check_nrpe -h 10.0.0.178 -c check_load
業務變動管理平臺優勢: