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