1. 程式人生 > >Svn結合hook實現自動發布及多Project管理更新

Svn結合hook實現自動發布及多Project管理更新

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管理更新