出於管理須要,也須要在公司內部實現自動發佈流程。當開發機提交SVN代碼以後,自動同步到測試服務器進行測試。html
系統平臺: CentOS release 6.5 (Final) 內核 2.6.32-431.23.3.el6.x86_64 svnserve, version 1.6.11 (r934486)
當開發機提交更新以後,腳本會自動執行某段代碼,將代碼更新到某個副本中。若是svn服務器和WEB服務器在一臺電腦中,這步操做已經完成自動發佈; 若是svn服務器和web服務器不在一臺電腦中,則還須要使用其餘辦法更新文件,同步到web服務器中。
爲了方便管理員控制提交的過程 ,Subversion提供了hook機制。 當特定的事件發生時,相應的 hook會被調用,hook其實就至關於特定事件的處理函數。 每一個hook會獲得與它所處理的事件相關的參數,根據hook的返回值,Subversion會決定是否繼續當前的提交過程
# mkdir -pv /mnt/svn/{back/motao_platform_dev,front/{A,B}} # mkdir /mnt/svn/svnconf # svnadmin create /mnt/svn/front/A # svnadmin create /mnt/svn/front/B # svnadmin create /mnt/svn/back/motao_platform_dev
# mv /mnt/svn/front/A/conf/{authz,passwd} /mnt/svn/svnconf/ # rm -f /mnt/svn/front/B/conf/{authz,passwd} # rm -f /mnt/svn/back/motao_platform_dev/conf/{authz,passwd} # vim /mnt/svn/front/A/conf/svnserve.conf [general] anon-access = none auth-access = write password-db = /mnt/svn/svnconf/passwd authz-db = /mnt/svn/svnconf/authz realm = share 參數realm用於指明倉庫所屬的認證域,默認狀況下每一個倉庫位於不一樣的域(每一個倉庫有一個惟一的uuid),所以咱們能夠不設置該項,除非多個倉庫須要共用同一份passwd配置。
# vim /mnt/svn/front/B/conf/svnserve.conf [general] anon-access = none auth-access = write password-db = /mnt/svn/svnconf/passwd authz-db = /mnt/svn/svnconf/authz realm = share
# vim /mnt/svn/back/motao_platform_dev/conf/svnserve.conf [general] anon-access = none auth-access = write password-db = /mnt/svn/svnconf/passwd authz-db = /mnt/svn/svnconf/authz realm = share
這裏是帳戶密碼設定web
# vim /mnt/svn/svnconf/passwd [users] A = 123456 B = 123456 C = 123456
[groups]定義用戶組 組名=用戶1,用戶2 [/] * = r @groups = rw [/project1] * = harry = rw sally = r [/project1/foo] sally = [/project2] @groups1 = rw guest = r /表示倉庫根目錄,*表示全部用戶,用戶組前面需加上@符號,r表示可讀,w表示可寫,等號=右邊爲空則表示沒有權限。 注意對於目錄結構,當用戶訪問某個資源時,SVN會先看有沒有直接針對該資源的訪問控制,若是沒有找到,則會繼承上一級目錄的訪問權限,如此遞推。 當咱們有多個倉庫時,咱們會發現這些倉庫的用戶賬號在大多數狀況下都是相同的, 所以,咱們能夠將passwd文件放到公共的地方,而後將全部倉庫的password-db配置都指向該文件。 相應的,authz-db也能夠共用一個文件,不過須要在配置具體的訪問控制時指明所屬的倉庫,以下: [/] * = r 全部人對全部倉庫的根目錄都有讀權限 [repos1:/project1] * = r harry = rw 只有harry對倉庫repos1裏的dir1有讀寫權限 [repos2:/project1] * = r sally = rw 只有sally對倉庫repos2裏的project1有讀寫權限。
# vim /mnt/svn/svnconf/authz [aliases] [groups] [front/A:/] A = rw [front/B:/] B = rw [back/motao_platform_dev:/] C = rw
# svnserve -d -r /mnt/svn -d 表示以守護進程方式運行 -r 表示svn的根目錄,若是有多個倉庫,應該指向包含全部倉庫的上層目錄,不然其餘倉庫不能使用。 默認使用的端口是3690
# killall svnserve
# vim /etc/rc.local svnserve -d -r /mnt/svn # chmod +x /etc/rc.local
mkdir -pv /mnt/web/front/A mkdir -pv /mnt/web/front/B mkdir -pv /mnt/web/back/motao_platform_dev
# cd /mnt/svn/front/A/hooks # cp post-commit.tmpl post-commit # vim /mnt/svn/front/A/hooks/post-commit #!/bin/bash REPOS="$1" REV="$2" export LANG=en_US.UTF-8 SVN=/usr/bin/svn WEB=/mnt/web/front/A SVN_USER=A SVN_PASS=A123456 CURDATE=`date +%F-%T` LOG_PATH=/var/log/svn_hook_front_A.log $SVN update ${WEB} --username ${SVN_USER} --password ${SVN_PASS} --no-auth-cache || exit1 echo "${WEB} Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> ${LOG_PATH} exit 0 # chmod 777 /mnt/svn/front/A/hooks/post-commit 第二個項目 # cp post-commit /mnt/svn/front/B/hooks/post-commit # vim /mnt/svn/front/B/hooks/post-commit #!/bin/bash REPOS="$1" REV="$2" export LANG=en_US.UTF-8 SVN=/usr/bin/svn WEB=/mnt/web/front/B SVN_USER=B SVN_PASS=A123456 CURDATE=`date +%F-%T` LOG_PATH=/var/log/svn_hook_front_B.log $SVN update $WEB --username ${SVN_USER} --password ${SVN_PASS} --no-auth-cache echo "$WEB Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> ${LOG_PATH} # chmod 777 /mnt/svn/front/B/hooks/post-commit 若是svn update 出現skipped '.' 或skipped '目錄名稱',嘗試在服務器checkout一次後,從新提交便可 # svn checkout svn://127.0.0.1/front/B /mnt/web/front/B/ --username B --password A123456 第三個項目 # cp post-commit /mnt/svn/back/motao_platform_dev/hooks/post-commit # vim /mnt/svn/back/motao_platform_dev/hooks/post-commit #!/bin/bash REPOS="$1" REV="$2" export LANG=en_US.UTF-8 SVN=/usr/bin/svn WEB=/mnt/web/back/motao_platform_dev SVN_USER=C SVN_PASS=A123456 CURDATE=`date +%F-%T` LOG_PATH=/var/log/svn_hook_motao_platform_dev.log $SVN update ${WEB} --username ${SVN_USER} --password ${SVN_PASS} --no-auth-cache || exit 1 echo "${WEB} Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> ${LOG_PATH} exit 0 # chmod 777 /mnt/svn/back/motao_platform_dev/hooks/post-commit 若是svn update 出現skipped '.' 或skipped '目錄名稱',嘗試在服務器checkout一次後,從新提交便可 # svn checkout svn://127.0.0.1/back/motao_platform_dev /mnt/web/back/motao_platform_dev/ --username C --password A123456
Web服務器A目錄的內容vim
先checkout至本機,添加2個文件,並修改index.html.txtbash
Web服務器上面的同步日誌服務器
更新以後的Web目錄ide
發佈成功svn