服務器已經搭建好,網站也開始運行了。那么如何方便地部署代碼呢?
最基本的方式,就是使用 SFTP 向網站目錄直接部署。這種方法的缺點是版本控制不便,在上傳時也無法方便的比較代碼變化。
用SVN來部署是一個很好的選擇。
SVN 本身是一個服務,我的選擇是使用 Apache 的 SVN 模塊來訪問,不必單獨啟用SVN服務。
第一步:確保 Apache 正確安裝和配置
詳情參見前文,這里假定 Apache 服務已正確安裝,運行無誤
第二步:安裝 subversion
// 安裝 subversion
yum install subversion
// 安裝 apache subversion 模塊
yum install mod_dav_svn
// 檢查 svn 安裝
svn --version
第三步: 配置 apache 上的 subversion
Apache 中 subversion 配置文件: /etc/httpd/conf.d/subversion.conf
用 vi 打開該文件,找到如下被注釋掉的部分,打開
<Location /repos>
DAV svn
SVNParentPath /var/www/svn/repos
AuthType Basic
AuthName "Authorizion realm"
AuthUserFile /etc/svn-auth-conf
Require valid-user
</Location>
這一行:
SVNParentPath /var/www/svn
改成:
SVNPath /var/www/svn/repos
“/var/www/svn/repos”是你SVN庫的存放位置,可根據情況修改。
<Location /repos>表示在url地址是 http://<hostname>/repos 時訪問的就是庫 /var/www/svn/repos 。
AuthUserFile /etc/svn-auth-conf指明了svn帳戶文件是/etc/svn-auth-conf 。
注意:在默認的 subversion.conf 文件中,以上代碼段是包含在如下標簽中的。這個標簽表示,僅對“寫”操作進行權限控制。這里的SVN服務是用於內部部署代碼而不是用於開源項目,顯然,應該對“讀”操作做同樣的限制。因此,這個標簽行的注釋開關應保持關閉。
<LimitExcept GET PROPFIND OPTIONS REPORT>
</LimitExcept>
第四步:建立subversion帳戶
subversion自己對帳戶進行管理,所以要客戶端要訪問它必須使用subversion帳戶進行登錄。
// 創建第一個帳戶
htpasswd -cm /etc/svn-auth-conf <username1>
// 創建更多其它帳戶(注意參數)
htpasswd -m /etc/svn-auth-conf <username2>
第五步:建立subversion倉庫
cd /var/www/svn
svnadmin create repos
chown -R apache.apache repos
第六步:測試Subversion工作
// 重啟 apache:
service httpd restart
任何時候,改動過配置文件,均需重啟服務使改變生效。
在瀏覽器中輸入 http://<hostname>/repos 應該可以看到(會提示身份驗證):
repos - Revision 0: /
--------------------------------------------------------------
Powered by Apache Subversion version 1.7.10 (r1485443).
打開本地SVN客戶端(我這里用的是tortoiseSVN),輸入地址,提示用戶名密碼時按之前的設定輸入,一切無誤的話應該可以列出代碼庫。至此Subversion服務配置完畢
第七步:配置SVN自動部署最新代碼至網站目錄
Subversion 的鈎子腳本是一種事件觸發機制,當SVN系統執行到某些預定義事件時,觸發一些預定義動作。其中,post-commit 事件就可用於自動部署。簡單來說,在 Web 目錄 checkout 特定代碼庫,然后設定當 svn 提交完成時,自動更新 web 目錄。我們可以這樣來設置 svn 庫:首先建立工作分支和發布分支,工作分支穩定后,合並最新代碼至發布分支(提交前核對更改),代碼提交完成后,server端的post-commit腳本從發布分支自動更新web目錄。
具體來說,比如我們的網站目錄在 /var/www/html/MyWeb, 首先,用如下命令 checkout 代碼庫:
svn checkout <repos url> /var/www/html/MyWeb --username <username> --password <password>
然后,創建腳本
cd /var/www/svn/repos/hooks
cp post-commit.tmpl post-commit
vi post-commit
將 post-commit 的內容改為:
export LANG=en_US.UTF-8
SVN=/usr/bin/svn
WEB=/var/www/html/MyWeb
${SVN} update ${WEB} --username <username> --password <password>
第一行 export … 是為了避免編碼錯誤,可根據服務器設置調整,保持和服務器編碼一致即可。
第二行是svn命令行位置
第三行是checkout的代碼庫位置,需要用chown將該目錄權限授予apache用戶
第四行是實際執行的命令。
保存post-commit, chmod a+x 使其可執行。然后手工執行進行測試。如果出現保存密碼的提示,則需要修改設置避免該提示出現,否則客戶端提交代碼會失敗(因為客戶端沒有當提示出現選擇yes/no的機會)。首先將配置文件拷貝至apache的home目錄,然后修改:
cp -r /root/.subversion/ /var/www/
vi /var/www/.subversion/servers
修改如下字段即可:
store-plaintext-passwords = no
store-passwords = no
現在一切就緒,使用客戶端工具提交代碼測試,檢查Web目錄是否同步了更改。
至此,配置工作完畢。
參考資料:
1. http://www.worldhello.net/doc/svn_hooks/svn_hooks.mm.htm
2. http://blog.csdn.net/niu_gao/article/details/7502326
3. http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/index.html