svn利用鉤子post-commit自動更新到線上測試服務器

使用svnadmin create 創建一個版本庫:

svnadmin create cqzn_server

每個版本庫的目錄下有一個hooks目錄:

# ls /home/svn/cqzn_server/
conf dav db format hooks locks README.txt

在每個版本庫下有hooks文件夾,裏面有很多鉤子程序:

# ls -l hooks/
total 40
-rwxr-xr-x 1 www-data www-data 332 2010-05-30 16:47 post-commit
-rw-r–r– 1 www-data www-data 2000 2010-05-30 15:22 post-commit.tmpl
-rw-r–r– 1 www-data www-data 1663 2010-05-29 23:28 post-lock.tmpl
-rw-r–r– 1 www-data www-data 2322 2010-05-29 23:28 post-revprop-change.tmpl
-rw-r–r– 1 www-data www-data 1592 2010-05-29 23:28 post-unlock.tmpl
-rw-r–r– 1 www-data www-data 3488 2010-05-29 23:28 pre-commit.tmpl
-rw-r–r– 1 www-data www-data 2410 2010-05-29 23:28 pre-lock.tmpl
-rw-r–r– 1 www-data www-data 2796 2010-05-29 23:28 pre-revprop-change.tmpl
-rw-r–r– 1 www-data www-data 2100 2010-05-29 23:28 pre-unlock.tmpl
-rw-r–r– 1 www-data www-data 2830 2010-05-29 23:28 start-commit.tmpl

注:

  1. # start-commit 提交前觸發事務  

  2. # pre-commit 提交完成前觸發事務  

  3. # post-commit 提交完成時觸發事務  

  4. # pre-revprop-change 版本屬性修改前觸發事務  

  5. # post-revprop-change 版本屬性修改後觸發事務

在執行commit操作之後會自動執行post-commit這個鉤子程序。
因此可以設置post-commit來自動更新到線上服務器:
操作步驟如下:

1. 新建立一個工作副本。

mkdir /yin/

2、授權:--否則提交會報權限錯誤。

chmod 777 -R /yin/

3、進入該目錄後,checkout出一個副本,用於同步上線上服務器的路徑。

cd  /yin/

svn co svn://192.168.1.250/cqzn_server

注:此副本不能爲空:此時該路徑爲:/yin/cqzn_server  --後面同步時候所需的路徑

4、設置post-commit腳本以便同步到線上服務器。

cd  /home/svn/cqzn_server/hooks

mv post-commit.tmpl post-commit

並且修改這個文件:如下內容

vim post-commit

#Set variable  

SVN=/usr/bin/svn  

WEB=/yin/cqzn_server

#/yin/這個目錄是上面創建出來做副本同步的目錄。

RSYNC=/usr/bin/rsync  

LOG=/tmp/rsync_cqzn_server.log  

WEBIP="192.168.1.222"

#這個ip是線上web服務器的ip.

export LANG=en_US.UTF-8  

$SVN update $WEB --username yinliang --password yinliang

if [ $? == 0 ]  

then  

  echo ""     >> $LOG  

  echo `date` >> $LOG  

  echo "##############################" >> $LOG  

  chown -R nobody:nobody /yin/    

  $RSYNC -vaztpH  --timeout=90--exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG  

fi  

#--exclude-from 可不要根據需求不同步的排除

5、修改完上面腳本後授執行權限。

chmod +x post-commit


綜上所述:便可實現自動上傳代碼到線上服務器。


注:

注意幾個場景:

這裏的環境是SVN服務器與WEB服務器是開的

把SVN服務器定義爲源服務器 WEB服務器爲目的服務器

場景一、如果目的WEB服務器爲綜合的混雜的,像只有一個WEB靜態資源,用戶提交的,自動生成的都在WEB的一個目錄下,建議不要用–delete這個參數

上面這個程序就是這樣,實現的是源服務器到目的服務器的更新和添加,而沒有刪除操作,WEB服務器的內容會多於源SVN的服務器的

場景二、實現鏡像,即目的WEB服務器與源SVN服務器一樣的數據,SVN上任何變化WEB上一樣的變化,就需要–delete參數

場景三、不需要同步某些子目錄,可能有些目錄是緩存的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數

注意:這個參數的使用不用寫絕對路徑,只要目錄名稱就行 aa代表文件 aa/ 代表目錄 ,缺點就是如果有多個子目錄都是一樣的名稱那麼這些名稱就都不會被同步

建議用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和刪除

exclude.list


.svn/

.DS_Store

p_w_picpaths/


利用SVN的鉤子還可以寫出很多的程序來控制SVN 如代碼提交前查看是否有寫日誌,是否有tab,有將換成空格,是否有不允許上傳的文件,是否有超過限制大小的文件等等。

注:

export LANG=en_US.UTF-8    ------這是爲了解決svn post commit 中文亂碼,設置本地化編碼,也防止此腳本不能執行。

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