Svn結合hook實現自動發布及多Project管理更新
阿新 • • 發佈:2018-04-19
Svn結合hook實現自動發布 svn自動部署發布WEB項目 項目目的
出於管理需要,也需要在公司內部實現自動發布流程。當開發機提交SVN代碼之後,自動同步到測試服務器進行測試。
系統平臺:
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服務器中。
hook簡單介紹
為了方便管理員控制提交的過程 ,Subversion提供了hook機制。
當特定的事件發生時,相應的 hook會被調用,hook其實就相當於特定事件的處理函數。
每個hook會得到與它所處理的事件相關的參數,根據hook的返回值,Subversion會決定是否繼續當前的提交過程
配置svnserve
創建多項目代碼倉庫
# 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
這裏是賬戶密碼設定
# vim /mnt/svn/svnconf/passwd
[users]
A = 123456
B = 123456
C = 123456
authz簡要說明
[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
SVN啟動與關閉指令
# svnserve -d -r /mnt/svn
-d 表示以守護進程方式運行
-r 表示svn的根目錄,如果有多個倉庫,應該指向包含所有倉庫的上層目錄,否則其他倉庫不能使用。
默認使用的端口是3690
停止SVN命令
# killall svnserve
開機啟動
# vim /etc/rc.local
svnserve -d -r /mnt/svn
# chmod +x /etc/rc.local
WEB服務器發布目錄
創建不同的web子目錄
mkdir -pv /mnt/web/front/A
mkdir -pv /mnt/web/front/B
mkdir -pv /mnt/web/back/motao_platform_dev
SVN hooks設置
創建不同版本庫的hooks
# 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
實現SVN提交與同步
Web服務器A目錄的內容
開發代碼機
先checkout至本機,添加2個文件,並修改index.html.txt
Web服務器上面的同步日誌
更新之後的Web目錄
發布成功
Svn結合hook實現自動發布及多Project管理更新