大概瞭解了一下鉤子,發現這個功能也是蠻實用,能夠對svn代碼更新前後自動做一些操作,而且比較有意思的是可以合shell無縫對接。通常有一些場景下我們做這個比較多,我們公司的svn做一些限制,比如svn不允許上傳.mp4的文件,比如在更新代碼比較頻繁的情況下我們需要對上傳的沒一個版本強制要求做一個Message信息,還有比如代碼更新完以後我們希望能夠自動上傳到/var/www/html下並給我發送一封郵件進行告知,這些是比較常規的做
官方文檔:http://shouce.jb51.net/svnbook/1.4/index.html
首先熟悉下鉤子的配置文件:
路徑:/data1/svndata/www/hooks/
[root@localhost ~]# cd /data1/svndata/www/hooks/
[root@localhost hooks]# tree -L 1 .
.
├── post-commit ## 真正被執行的鉤子文件
├── post-commit.tmpl ## .tmpl的文件是鉤子的模板文件
├── post-lock.tmpl
├── post-revprop-change.tmpl
├── post-unlock.tmpl
├── pre-commit
├── pre-commit.tmpl
├── pre-lock.tmpl
├── pre-revprop-change.tmpl
├── pre-unlock.tmpl
└── start-commit.tmpl
0 directories, 11 files
那麼對於這麼多的不同類型的鉤子的具體應用場景我們可以參考http://shouce.jb51.net/svnbook/1.4/index.html
官方的文檔做一些理解
案例一:將開發人員官網代碼更新提交到SVN(www中心庫)後立即更新到本機的Apache(/var/www/html)下併發送郵件告知我(post-commit):
[root@CentOS6-1 ~]# cd /data1/svndata/www/hooks/
[root@CentOS6-1 hooks]# chmod 700 post-commit
[root@CentOS6-1 hooks]# vim post-commit
#!/bin/sh
export LANG=en_US.UTF-8 ##設置語言,防止亂碼
REPOS="$1" ##這裏變量代表着中心庫位置我的是/data1/svndata/www
REV="$2" ##這裏是修訂號
SVNLOOK=/usr/bin/svnlook
AUTHOR=$($SVNLOOK author -r $REV "$REPOS")
MESSAGE=$($SVNLOOK info $REPOS|awk "NR==4") ##獲取註釋信息
PROJECT="/var/www/html/" ##我項目的目錄
SVN="/usr/bin/svn"
##同步
$SVN update $REPOS $PROJECT --username a1 --password 123 --no-auth-cache
##當然我這是同步到本機,如果其他主機也需要的話在這後面跟rsync也可以,靈活變通一下
if [ $? -eq 0 ]
then
echo "
作者:$AUTHOR
事件:$REPOS update OK
版本:$REV 請悉知
註釋:$MESSAGE
時間:`date +%Y-%m-%d-%H:%M:%S`"| mail -s "$AUTHOR 代碼更新OK" [email protected]
fi
對於SVN來說我們有時候需要開發人員對自己上傳的每一個版本都清楚修正了哪些東西,但是如果一旦最新的版本有問題,那麼回退起來很困難,對於我們而言只知道修訂號和一個簡單的日期,其餘的真的是靠記性了,但是時間久了就尷尬了,所以說我們要求開發人員在代碼更新的時候強制編寫Message信息
案例二:強制開發人員填寫Message信息,要求輸入最少8個字符(pre-commit)
[root@CentOS6-1 ~]# cd /data1/svndata/www/hooks/
[root@CentOS6-1 hooks]# chmod 700 post-commit
[root@CentOS6-1 hooks]# vim pre-commit
#!/bin/sh
REPOS="$1"
TXN="$2"
export LANG=en_US.UTF-8
SVNLOOK=/usr/bin/svnlook
MESSAGE=$($SVNLOOK info -t "$TXN" "$REPOS"|awk 'NR==4'|xargs echo -n|wc -m)
#獲取提交者輸入的Message信息,echo -n去除輸出的\n,wc -m統計字符個數非字節數
#echo "$MESSAGE" >> /tmp/svnlog ##用來調試查看輸出的字符數,這裏僅想表達echo的排錯方法
if [ $MESSAGE -lt 8 ] ##根據自己的需要來修改
then
echo -e "\n錯誤信息:Message信息必須不少於8個字符\n" 1>&2
##1>&2這個很關鍵哦,別寫錯了,表示標準輸出返回值輸入到錯誤返回值通道
exit 1
fi
exit 0
其實鉤子大家可以看得到有很多的模板文件,其實鉤子還可以做很多事,比如常見的限制上傳文件大小,限制文件類型之類的,由於它是shell解釋器,主要依靠svnlook配合shell取值,再進行流程判斷,那麼在編寫的時候是相當容易的了