1、hook簡單介紹html
爲了方便管理員控制提交的過程 ,Subversion提供了hook機制。當特定的事件發生時,相應的 hook會被調用,hook其實就至關於特定事件的處理函數。每一個hook會獲得與它所處理的事件相關的參數,根據hook的返回值,Subversion會決定是否繼續當前的提交過程
要實際安裝一個可用的鉤子,你須要在 repos/hooks目錄下安裝一些與鉤子同名(如 start-commit或者post-commit)的可執行程序或腳本。
2、本地機器SVN自動更新
1.export方式(備份)
在使用svn客戶端時,有可能須要對某一個版本進行本地備份,好比製做成壓縮包進行發佈,這時候須要從svn文件夾中提取出內容,去除.svn等隱藏的svn配置文件。最笨的方法拷貝一份出來,而後顯示隱藏文件,把全部.svn文件夾都刪掉。在svn菜單中,能夠找到export命令,這個命令能夠將當前svn目錄中的內容乾淨地導出到指定的目錄
例如你版本庫的svn訪問地址是http://192.168.15.132:36002/svn/project1,你想把這個版本庫下的/trunk/web文件夾發佈到tomcat上,發佈到tomcat的文件夾地址是/data/tomcat/web,svn的管理員用戶名是test,密碼是test2016,對應的命令:
svn export http://192.168.15.132:36002/svn/project1/trunk/web /data/tomcat/web --force --username test --password test2016 --no-auth-cache
注:
--force 強制覆蓋/data/tomcat/opt/web這個文件夾,避免這個文件夾不爲空時報錯
--username test --password test2016 自動將用戶名和密碼做爲參數傳送進去
--no-auth-cache 不緩存用戶名和密碼,這是出於安全考慮
2.update方式
修改hooks/post-commit
#!/bin/bash
REPOS="$1"
REV="$2"
DIR="/opt/webdir/assets" #注意權限問題
export LC_ALL=en_US.UTF-8
export LANG=zh_CN.UTF-8
CURDATE=`date`
echo "Code Deployed by at $CURDATE,$REPOS,$REV" >> /root/code_deploy.log
/usr/bin/svn update $DIR --username username --password password --no-auth-cache 2>1 /root/svn_look.log
#加上--no-auth-cache!!
默認使用的shell類型是sh,最好改爲bash,sh是bash的子集,centos中sh其實就是軟連接到bash
3.update和export比較
update會生成一個隱藏.svn文件夾,這個文件夾是咱們不須要的,固然了,若是整個發佈的內容不少的話,建議仍是用update,而不用export,由於update只更新有變化的部分,而export將從新導出全部內容,網絡消耗比update大。
3、svn實現遠程機器自動更新
首先實現A機器經過ssh
無密碼登錄
B機器, 修改A機器的post-commit文件
/usr/bin/ssh -l root 192.168.127.183 "/bin/bash /home/www/svnup.sh"
而後在B機器的/home/www/目錄建立svnup.sh可執行文件
/usr/bin/svn update /web/root/code
版本庫有提交請求的時候自動會執行post-commit腳本,post-commit腳本經過ssh讓遠程機器執行shell腳本自動更新svn。
###############################################################################
4、svn配置Hook實現自動更新
單項目庫管理
Svn安裝("yum install subversion -y")
新建版本庫
mkdir -p /home/svndata/webdev
svnadmin create /home/svndata/webdev
修改配置文件
配置過程:
svnserve.conf #配置版本庫信息和用戶文件和用戶密碼文件的路徑、版本庫路徑
anon-access = none #默認是隻讀read
auth-access = write #認證後有寫入權限
password-db = passwd #賬號密碼配置文件
authz-db = authz #權限配置文件
realm = My Projects #改爲本身的版本庫生效範圍
注意:svnserve的"realm"的值,在上面的設置下,應該保證全部的版本庫使用相同的realm值(這裏配置的爲單版本),這樣,對版本庫的密碼緩存能夠在多個版本庫之間共享,更多細節見客戶端憑證緩存。
authz #文件,建立svn組和組用戶的權限
[group]
admin = test1 #建立一個admin的組,並制定兩個用戶testl和test2
[/] #指定根目錄下的權限
* = r #其餘用戶只有讀權限
passwd #建立或修改用戶密碼
[users]
test1 = test12016
添加hook腳本文件
cd /home/svndata/webdev/hooks
複製一份
post-commit.tpl
文件改名爲post-commit,這是提交svn版本庫會觸發的腳本
配置鉤子觸發自動更新(
svn版本庫和更新地址都在同一臺服務器上
)
#!/bin/bash
export LANG=zh_CN.UTF-8
SVN=/usr/bin/svn
WEB=/usr/local/nginx/html/
CURDATE=`date`
$SVN update $WEB --username test --password test2016 --no-auth-cache
echo "Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
註釋最後一行
發郵件功能
添加腳本的執行權限
(
1.8
以上默認777權限,不然鉤子不生效)
啓動
svnserve -d -r /home/svndata/webdev/
--listen-port 3690 #經過"--listen-port"指定運行端口,這裏使用默認端口,可省略
lsof -i:3690
實現SVN與WEB同步,能夠checkout一個出來,也可直接配在倉庫中
設置WEB服務器根目錄爲/home/webroot,進入/home/webroot目錄
svn checkout svn://{您的服務器地址}:{端口號}/dir1 .
#注意目錄後面還有一個點
注意:此處的/dir1可不須要添加
(添加的目的是爲了實現多個項目)
svn checkout svn://192.168.15.132:3690 .
#注意目錄後面還有一個點
可使用TortoiseSVN對測試,並實現自動更新了。
多項目庫管理
mkdir -p /home/svndata/{conf,dir1,dir2,dir3}
svnadmin create /home/svndata/dir1
svnadmin create /home/svndata/dir2
svnadmin create /home/svndata/dir3
分別建立了三個項目的版本庫,各版本庫目錄conf中存在passwd/authz/svnserve.conf文件
將第一個項目下passwd/authz文件
mv
到/home/svndata/conf中,其他2個項目下conf目錄中的passwd和authz文件
刪除
,同時修改三個項目中conf目錄下的svnserve.conf文件
svnserve.conf配置以下
[general]
anon-access = none
auth-access = write
password-db =/home/svndata/conf/passwd
authz-db = /home/svndata/conf/authz
realm = My Project1
#後兩個修改成對應的Project2/Project3
修改版本庫中的conf目錄下的authz文件
以配置dir1版本庫爲例:
passwd
[users]
admin = admin2016
a1 = a12016
b2 = b22016
c3 = c32016
authz
[groups]
admin_group = admin
user = a1,b2,c3
[dir1:/]
@admin_group = rw
[dir2:/]
@admin_group = rw
b2 = rw
* = r
[dir3:/]
@admin_group = rw
c3 = rw
* = r
修改對應的hook文件
cd /home/svndata/dir*/hooks
複製一份
post-commit.tpl
文件改名爲post-commit,這是提交svn版本庫會觸發的腳本
配置鉤子觸發自動更新(
svn版本庫和更新地址都在同一臺服務器上
)
#!/bin/bash
export LANG=zh_CN.UTF-8
SVN=/usr/bin/svn
DEV1=/dev/dir1/
#DEV2=/test/dir2
#DEV3=/www/dir3/
#對應的Project的文件夾
CURDATE=`date`
$SVN update $WEB --username a1 --password a12016 --no-auth-cache
#$SVN update $WEB --username b2 --password b22016 --no-auth-cache
#$SVN update $WEB --username c3 --password c32016 --no-auth-cache
echo "$DEV1 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
#echo "$DEV2 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
#echo "$DEV3 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
註釋最後一行
發郵件功能
添加腳本的執行權限
(
1.8
以上默認777權限,不然鉤子不生效)
SVN版本庫起動方式,如今svndata下面有dir一、dir二、dir3三個項目版本庫
svnserve -d -r /home/svndata/
#注意注:"-d"參數效果同於"-daemon ","-r"參數效果同於"-root",關注"-r"參數後對應的目錄,"-root"設置根位置來限制服務器的訪問目錄,從而增長安全性和節約輸入svnserve URL的時間
實現SVN與對應dir*同步,能夠checkout一個出來,也可直接配在倉庫中
設置Project服務器對應根目錄以下,進入各自目錄
DEV1=/dev/dir1
DEV2=/test/dir2
DEV3=/www/dir3
進入各自目錄DEV1/DEV2/DEV3,分別執行
svn checkout svn://{您的服務器地址}:{端口號}/dir* .
注意:
此處的/dir1須要添加
svn checkout svn://192.168.15.132:3690/dir* .
接下來,可使用
TortoiseSVN對測試環境文件進行管理,並實現自動更新了。
常見錯誤
#255錯誤:post-commit沒有給執行權限或者頭部沒有執行用sh執行,就是沒有#!/bin/bash
#提示跳過目錄:服務器目錄沒有checkout代碼,記得必定要先checkout一次,才能同步(!,每次新建項目都須要)
#什麼提示也沒有:這種狀況出如今用工具commit的時候,成功了,可是就是沒有同步,建議你到linux下,使用./post-commit手動執行看報什麼錯誤。若是亂碼,請將文件內編碼格式修改成GBK
#提示**** is a direcitory:/usr/bin/svn你把這個搞錯了,他不是一個目錄,是svn的路徑