svn鉤子的使用案例

svn鉤子的使用案例


我在這一篇博文http://lidaxia.blog.51cto.com/11588738/1928773中提到,svn鉤子腳本是svn非常實用重要的功能,在工作中,會經常需要用到svn鉤子腳本以實現除了svn自帶功能之外的附加功能,那麼這一篇博文,我們就舉例演示一下,svn鉤子是用來做什麼的,以及怎麼用。


svn鉤子的功能:

svn鉤子是一個腳本,它的具體寫法和linux操作系統中shell腳本的寫法並沒有什麼不同,通俗來說,svn鉤子的功能就是當某種版本庫事件(刪除文件、上傳文件、修改文件名稱等等)被觸發,以腳本定義的方式繼續該事件的執行。


鉤子的類型:

常用的鉤子腳本

鉤子腳本說明
post-commit在提交完成成功創建版本之後執行該鉤子,提交已經完成,不可更改,本腳本的返回值被忽略,提交完成時觸發事件
pre-commit提交完成前觸發執行該腳本
start-commit在客戶端還沒有向服務器提交數據之前,即還沒有建立subversion transaction(縮寫爲txn)之前,執行該腳本(提交前觸發事務)

非常用的鉤子腳本

鉤子腳本說明
pre-revprop-change在修改revision屬性之前,執行該腳本
post-revprop-change在修改revision屬性之後,執行該腳本,因爲修改稿已經完成,不可更改,因此本腳本的返回值被忽略(不過實際上的實現似乎是該腳本的正確執行與否影響屬性修改)
pre-unlock對文件進行解鎖操作之前執行腳本
post-unlock對文件進行解鎖操作之後執行腳本
pre-lock對文件進行加鎖操作之前執行腳本
post-lock對文件進行教唆操作之後執行腳本


注意事項:

在使用svn鉤子的時候,必須要在鉤子腳本中設置好環境變量和命令的絕對路徑,因爲svn是在一個沒有任何環境變量的環境中運行的,甚至都沒有$PATH這個變量。


下面通過兩個小實驗來演示svn鉤子的功能,搭建過程可以看我的這篇博文http://lidaxia.blog.51cto.com/11588738/1928773


hooks一般放置在如下目錄,有許多的模板

wKioL1k-Q6ihbjfjAABWgyekbV4656.png


第一個鉤子:自動同步項目庫文件到另外一臺主機


從源碼庫下載一個項目庫

[root@svn-server data]# svn co svn://192.168.83.131/dir /data


寫一個鉤子腳本

[root@svn-server hooks]# cat post-commit
#!/bin/bash
REPOS="$1"
REV="$2"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL=
LOGPATH="/var/log"
[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
SVN=/usr/bin/svn
$SVN update --username lhx --password 1 /data/
if [ $? -eq 0 ]
   then
     /usr/bin/rsync -az --delete /data/ [email protected]:/tmp/
fi


賦予執行權限

[root@svn-server hooks]# chmod +x post-commit


配置免密碼認證
[root@svn-server hooks]# ssh-keygen
[root@svn-server hooks]# ssh-copy-id
[email protected]


上傳一個測試文件測試

wKiom1k-USSTbTKFAACpcR3c0ZQ096.png

如果腳本有報錯會直接在svn軟件上顯示出來

wKiom1k-UTmz9QoWAABVcEmsH5s719.png

在client上驗證是否已經同步文件

wKioL1k-UV3z9B31AAAUwJsvxvI612.png


第二個鉤子:限制文件大小以及文件的類型,上傳需要輸入備註

 

[root@svn-server hooks]# vim pre-commit

#!/bin/bash

REPOS="$1"

TXN="$2"

MAX_SIZE=10240000

FILTER='\.(zip|rar|o|obj|tar|gz)$'

SVNLOOK=/usr/bin/svnlook

#LOGMSG=`$SVNLOOK log -t "$TXN""$REPOS" |grep "[a-zA-Z0-9]" | wc -c`

LOGMSG=`$SVNLOOK log -t "$TXN""$REPOS" | wc -c`

 

if [ "$LOGMSG" -lt 9 ]

then

   echo -e"error:can not be empty,you must enter at least 8 characters"1>&2

   exit 1

fi

 

files=$($SVNLOOK changed -t $TXN $REPOS |awk '{print$2}')

 

for f in $files

do

#check file type

if echo $f|tr A-Z a-z|grep -Eq $FILTER

then

   echo"File $f is not allow ($FILTER) file" >&2

   exit 1

fi

#check file size

filesize=$($SVNLOOK cat -t $TXN $REPOS $f|wc -c)

if [ "$filesize" -gt "$MAX_SIZE" ]

then

   echo"file $f is too large(must <=$MAX_SIZE)" >&2

   exit 1

fi

done

 

#all checks passed,so allow commit

exit 0


賦予執行權限
[root@svn-server hooks]# chmod +x pre-commit


測試


一開始沒有輸入備註

wKiom1k-VSXQs6fdAAD0Xkl9Vak781.png

輸入備註之後提示不允許的文件類型

wKioL1k-VSbwpEwsAADHnzpSyJY699.png

更改文件類型並且輸入備註,提示大小超出限制

wKiom1k-VSihcwuOAADRfC5qqjo559.png



最近正在找工作,加上又在學習mysql,比較忙,博客更新慢,但是我的博文儘量力求裏面的內容大家看到會有收穫,而不是簡單的把命令歷史貼上去。喜歡交流技術的朋友可以私信我,留下qq,微信等聯繫方式,大家一起交流交流。

如有紕漏,歡迎指正。

 









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章