SVN本地開發、測試環境版本控制-自動發布生產環境
發布系統
由于網站的結構是基于lnmp的,所以我們主要的代碼都是php代碼,之前在大網站的時候,一般會有比較嚴格的流程和比較嚴格的打包發布機制,比如 Yahoo的 yinst package, 但是對于初創團隊來說有些重了,這里我們直接使用svn進行代碼的管理和發布。
雖然系統環境不復雜,但是我們還是分為開發環境,測試環境(beta),和生產環境(線上),開發環境我們在自己的機器上搭建,我的是 Ubuntu的系統,everfly是MacOS的系統,測試環境在和svn服務同一臺服務器上,我們使用svnseve的post-commit 功能實現了一旦我們提交了代碼,服務器會自動將代碼部署到beta環境的web服務器上, 在生產環境則是直接使用svn export進行部署,整個流程還是非常簡單的。
注意,有的時候我們在生產環境和開發環境的時候需要執行不同的邏輯,比如針對html內部引用的javascript代碼,為了節省流量(當然 還有一個原因是代碼寫的太丑了,不想讓大家看到笑話),在生產環境上,我們使用了jsmin進行壓縮,但是在本機進行開發的時候,為了調試前端代碼方便, 不能對javascript代碼進行壓縮,所以我們通過設置環境變量,然后在代碼中檢測環境變量的方式解決了這個問題,由于環境變量是設置在web server或者php-fpm的配置中的,所以線上和開發環境可以保持同一份代碼,在代碼中判斷當前的系統執行不同的邏輯即可。
SVN自動發布系統實現
實現過程,是使用了svn的一個hook的功能,調用了 post-commit 來做一些當提交完成后的操作。
1、在版本庫的hooks目錄下面,有一些基于事件觸發的執行腳本,比如post-commit, 去掉后綴.tmpl
2、編輯svn代碼庫服務器上文件: svn/test/hooks/post-commit #!/bin/sh
REPOS="$1"
REV="$2"
export PATH="/usr/local/svn/bin:$PATH" #由于代碼是apache的進程用戶www運行,所以需要設置環境變量
export LC_CTYPE=en_US.UTF-8 #防止提交的文件名存在非字母字符。
if (svnlook log -r $REV /home/http/repository/svn/test | grep "auto_deploy" ) #當用戶提交時注釋中寫上"auto_deploy"的時候,就自動部署到apache目錄,否則不部署。
then
echo "`date` 'auto depoly command received" >> /tmp/test_svnautocommit.txt #這一行僅作調試使用
svn export "http://192.168.16.48/repo/svn/test/trunk/test_website" /home/http/html/test_website --force
fi
3、 在客戶端測試,并且要在comment中加入 auto_deploy,否則不會觸發自動部署的操作。
參考文章