SVN利用Hooks自動發布網站


出於管理需要,也需要在公司內部實現自動發布流程。當開發機提交SVN代碼之后,自動同步到測試服務器進行測試。

網絡的拓撲簡化為:

1台核心SVN服務器,使用的svn管理軟件為Subversion Edge3.2版本,Subversion核心版本為1.8.x,內網IP為:xx.xx.xx.54;

1台Web服務器,CentOS6.5 x64,內網IP為:xx.xx.xx.53。

基本的操作流程如下:

一、創建版本庫:

在Subversion Edge中創建版本是比較簡單的。假設創建好的版本庫為:http://xx.xx.xx.54/svn/assistant/

權限設置等,可參見其他相關文章。

二、目錄、權限設置:

自動發布的原理,其實只是在於:當開發機提交更新之后,腳本會自動執行某段代碼,將代碼更新到某個副本中。如果svn服務器和wen服務器在一台電腦中,這步操作已經完成自動發布(准備下面的1,2步);如過svn服務器和web服務器不在一台電腦中,則還需要使用其他辦法將更新文件,同步到web服務器中。

1、在 svn服務器中,創建 "/data/assistant/"目錄;

2、將版本庫代碼,"checkout"至該目錄;

3、在web服務器中,創建"/web/assistant/"目錄;

4、設置ssh權限,在使用rsync時,不需要手工錄入密碼;

5、建議將web服務器的web用戶權限,在svn種也創建一份,這樣一來,rsync可以直接將權限傳遞過去,無需再次操作(假設"webgroup:webuser")。

#1、創建svn副本
mkdir /data/assistant/
#2、簽出代碼
/csvn/bin/svn checkout http://xx.xx.xx.54/svn/assistant/ /data/assistant/ 
#4、設置安全同步密鑰,建議操作完之后,先執行一下rsync輸入一次密碼,則不需要再次輸入了
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub xx.xx.xx.53
#5、設置權限
chown webuser:webgroup -R /data/assistant

三、復制並修改"post-commit"腳本:

Edge操作鈎子比較簡單,根本不需要考慮權限問題,只需要在"Hook Scripts"中,選中'post-commit.tmpl",再點擊"copy",復制為"post-commit"文件即可。

編輯內容如下:

#!/bin/sh

REPOS $1
REV $2

#指定命令路徑
SVNPATH=/data/csvn/bin/svn
SVNLOOKPATH=/data/csvn/bin/svnlook
RSYNC=/usr/bin/rsync

#定義環境變量
LOCALCOPY=/data/assistant/
REMOTEIP=/web/assistant/
REMOTEIP="172.16.6.53"
EXCLUED=/data/csvn/exclude.list
LOG=/tmp/rsync_web_server.log
CHANGE=$($SVNLOOKPATH changed -r $REV $REPOS)

#設置輸出字符集,避免亂碼
export LANG=en_US.UTF-8

#更新本地副本
$SVNPATH update $LOCALCOPY --username publisher --password Q1w2e3r4t5 

if [ $? == 0 ] && [ $CHANGE =~ "branches"]; then
  echo `date` >> $LOG  
  echo "##############################" >> $LOG
  echo $CHANGE >> $LOG
  #修改更新文件的權限
  chown -R webuser:webgroup $LOCALCOPY
  $RSYNC -vaztpH  --timeout=90 --exclude-from=$EXCLUED  $LOCALCOPY/ root@$REMOTEIP:$REMOTEIP >> $LOG
else
  echo "no update file." >> $LOG
fi

1、指定svn路徑的原因在於,一般的centos通過yum安裝的svn,是1.6.x版本,而edge是1.8.x版本,會導致更新時提示版本不一致,因此直接指定為edge自帶的svn命令;

2、EXCLUED是設置的排除文件,包含在rsync同步時無需同步的文件或者目錄,基本內容如下:

.svn/
.DS_Store
images/

3、目前的使用,僅限於提交后觸發的post-commit腳本,實際上,當你查看版本庫的hooks目錄時,會發現其他很多事件的腳本,只是對於我們的應用場景來說,還不需要那么嚴謹,其余的,遇到再說吧;

4、理論上,目前的方式,當集中管理的項目較多時,會在svn上產生較多的svn副本,這對svn服務器也是一個壓力。更優的方案,應該在於當觸發提交時,請求對應web服務器的某個腳本,主動去拉取代碼至對應web服務器,應該是更優的做法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM