出於管理須要,也須要在公司內部實現自動發佈流程。當開發機提交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服務器,應該是更優的作法。