SVN利用Hooks自動發佈網站

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

網絡的拓撲簡化爲:centos

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。服務器

基本的操做流程以下:網絡

1、建立版本庫:ssh

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

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

2、目錄、權限設置:測試

自動發佈的原理,其實只是在於:當開發機提交更新以後,腳本會自動執行某段代碼,將代碼更新到某個副本中。若是svn服務器和wen服務器在一臺電腦中,這步操做已經完成自動發佈(準備下面的1,2步);如過svn服務器和web服務器不在一臺電腦中,則還須要使用其餘辦法將更新文件,同步到web服務器中。spa

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

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

三、在web服務器中,建立"/web/assistant/"目錄;

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

五、建議將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

3、複製並修改"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

一、指定svn路徑的緣由在於,通常的centos經過yum安裝的svn,是1.6.x版本,而edge是1.8.x版本,會致使更新時提示版本不一致,所以直接指定爲edge自帶的svn命令;

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

.svn/
.DS_Store
images/

三、目前的使用,僅限於提交後觸發的post-commit腳本,實際上,當你查看版本庫的hooks目錄時,會發現其餘不少事件的腳本,只是對於咱們的應用場景來講,還不須要那麼嚴謹,其他的,遇到再說吧;

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

相關文章
相關標籤/搜索