1.SVN服務實戰php
1) 什麼是SVN(Subversion)?css
2) svn與git的區別前端
svn版本控制系統是集中式的數據管理,存在一箇中央版本庫,全部開發人員本地開發所使用的代碼都是來自於這個版本庫,提交代碼也都必須提交到這個中央版本庫。java
svn版本控制系統工做流程以下:git
缺點:程序員
當沒法鏈接到中央版本庫的環境下,你沒法提交代碼,將代碼加入版本控制; 你沒法查看代碼的歷史版本以及版本的變化過程。提交到版本控制系統中的代碼咱們都默認經過自測可運行的,若是某個模塊的代碼比較複雜,不能短期內實現爲可測試的功能,那麼你須要等很長的時間才能提交本身的代碼,因爲代碼庫集中管理,所以,須要對中央版本庫的存儲作備份。這點分佈式的版本控制系統要好一些。Svn的備份要備份全部代碼數據以及全部更改的版本記錄。web
從上面的描述咱們能夠看到,咱們每一個開發人員的本地都會有一個git庫,咱們能夠隨時進行commit而不須要聯網,能夠隨時查看歷史版本,當某一個功能點開發完了以後咱們能夠將commit後的內容push到遠程git庫了,若是遠程git庫的版本在你上次clone或者pull以後變化了,那麼你須要進行pull並處理衝突,提交以後,再push到遠程git庫。apache
運維人員掌握版本管理vim
對於版本管理系統,運維人員須要掌握的技術點:windows
3)SVN服務端運行方式
svn服務常見的運行訪問方式有3種:
(1)獨立服務器訪問
訪問地址如:svn://svn.yunjisuan.org/sadoc;
(2)藉助apache等http服務
訪問地址如:http://svn.yunjisuan.com/sadoc;
a,單獨安裝apache+svn(不要用) b,CSVN(apache+svn)是一個單獨的整合的軟件,帶web界面管理的SVN軟件
(3)本地直接訪問(例如:file://application/svndata/sadoc)
2.搭建SVN服務端
yum -y install subversion
mkdir -p /application/svndata #數據存儲根目錄
建立一個新的Subversion項目test,其實,相似yunjisuan這樣的項目能夠建立多個,每一個項目對應不一樣的代碼,這裏只是以建立一個項目爲例演示:
svnadmin create /application/svndata/test
tree /application/svndata/test 查看項目目錄結構
cd /application/svndata/test/conf/
cp svnserve.conf{,.bak}
vim svnserve.conf 修改配置文件
anon-access = none #禁止匿名訪問
auth-access = write #驗證訪問可寫
password-db = passwd #密碼文件位置
authz-db = authz #驗證文件位置
此配置文件裏的每條配置代碼必須頂格寫,不能有空格。
啓動svn服務
svnserve -d -r /application/svndata/ 啓動服務
netstat -antup | grep 3690 查看服務
vim /application/svndata/test/conf/passwd
test= 123123 #設置帳號密碼
yst = 123123 #設置帳號密碼
權限配置說明
vim /application/svndata/test/conf/authz
[groups]
yun= test,yst #新增本行,定義組名
[test:/] #定義受權的範圍
yunjisuan = rw #用戶單獨受權
benet = r #用戶單獨受權
@sagroup = r #組用戶受權
重啓動svnserve
3.搭建SVN客戶端
使用svn客戶端(windows版)
推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
一路 下一步,安裝成功
先在本地建立一個目錄,起名任意,好比data
選擇右鍵菜單裏的SVN Checkout,輸入svn地址, 本例爲svn://192.168.1.11/test
點ok,輸入前面建立的用戶名和密碼test,123123,從版本庫中取得代碼
在本地修改,後要提交到版本庫,右鍵點commit,提交生成初版本,其餘程序員修改會生成不一樣版本,咱們本地要下載代碼,右鍵點 update,下載最新的代碼版本
4.SVN鉤子腳本
1)經常使用鉤子腳本
post-commit:在提交完成成功建立版本以後執行該鉤子,提交已經完成,不可更改,所以,本腳本的返回值被忽略。提交完成時觸發事務
pre-commit提交完成前觸發執行該腳本
start-commit在客戶端尚未向服務器提交數據以前,即尚未創建Subversion transaction以前,執行該腳本(提交前出發事務)
利用鉤子腳本觸發同步數據的注意事項
(1)必定要定義變量,主要是用過的命令的路徑。由於SVN的考慮的安全問題,沒有調用系統變量,若是手動執行是沒有問題,但SVN自動執行就會沒法執行了。
(2)SVN的同步目錄在 update以前必定要先checkout一份出來,還有這裏必定要添加用戶和密碼。
(3)加上了對前一個命令的判斷,若是update的時候出了問題,程序沒有退出的話還會繼續同步代碼到Web服務器上,這樣會形成代碼有問題。
(4)建議最好記錄日誌,出錯的時候能夠很快的排錯
(5)最後是數據同步,rsync的相關參數必定要清楚。
svn鉤子生產應用場景舉例
2)svn鉤子生產應用實戰
(1)創建同步WEB目錄
mkdir -p /data/www
(2)將SVN中內容checkout到WEB目錄一份。
svn checkout svn://192.168.1.13/test /data/www --username=test --password=123123
3)製做鉤子腳本,post-commit
root@localhost yunjisuan]# cd /application/svndata/test/hooks/ [root@localhost hooks]# cp post-commit.tmpl post-commit #複製模板一份 [root@localhost hooks]# egrep -v "#|^$" post-commit #模板原始內容 REPOS="$1" REV="$2" mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf [root@localhost hooks]# vim post-commit #修改post-commit腳本 [root@localhost hooks]# egrep -v "#|^$" post-commit REPOS="$1" #傳參(未用上) REV="$2" #傳參(未用上) SvnIP="192.168.1.13" #svn服務端的IP地址 ProjectName="test" #svn服務端的項目庫名稱 UserName="test" #帳戶姓名 PassWord="123123" #帳戶密碼 LocalPath="/data/www" #位於svn本地的共享目錄 SVN=/usr/bin/svn #svn命令的絕對路徑 export LC_CTYPE="en_US.UTF-8" #中文字符集支持 export LC_ALL= if [ ! -d ${LocalPath} ];then mkdir -p ${LocalPath} $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord} #新建立目錄須要先通過checkout才能update else $SVN update --username $UserName --password $PassWord /data/www #更新共享目錄內容 fi if [ $? -eq 0 ];then /usr/bin/rsync -az --delete /data/www /tmp/ #數據同步推送到本地/tmp目錄下(生產環境能夠直接同步推送到Web測試服務器) fi
chmod 700 post-commit
特別提示:
當用戶經過svn更新鉤子post-commit所在的項目庫時,在更新完畢以後會自動觸發鉤子腳本
模擬更新項目庫版本
在windows系統中的data目錄中添加代碼文件,而後右鍵點commit,成功後觸發鉤子腳本
ll /tmp/www/ #推送後的數據目錄
顯示所有提交後的代碼文件
綜上,post-commit鉤子腳本測試成功。
5.大中小型企業上線解決方案
1)小型公司代碼上線案例(十幾臺服務器)
開發每次修改完代碼就直接提交,而後經過FTP直接更新到Web服務器網頁目錄;沒有專門的測試人員,徹底是由用戶來進行測試體驗。
小型公司通常只有幾個開發人員,網站核心程序大多數都是PHP語言開發,爲了方便,會直接經過FTP直接上傳程序代碼到線上服務器,隨時隨地上線更新。
小型企業上線架構方案建議:
2)中型企業上線解決方案
中型企業上線,通常是規範運維人員操做步驟,制定統一的上線操做腳本,備份文件名稱,備份文件路徑。使操做人性化,統一化,自動化。
3)大型企業上線解決方案
大型企業上線通常制度和流程控制較多,比較嚴謹,下面是某大型企業上線解決方案架構:
SVN裏的內容:
1,程序代碼
2,服務的配置
3,項目文檔,設計文檔,運維部署優化文檔
門戶大型網站架構環境代碼上線具體方案:
IDC正式上線的過程對於JAVA程序,能夠是AB分組上線的思路,即平滑下線一半的服務器,而後發佈更新代碼測試,無問題後,掛上服務器,同時在平滑下線另外一半的服務器,而後發佈更新代碼測試(或者直接發佈後就掛上線)
PHP程序代碼上線的具體方案:
對於PHP上線方法:發佈代碼時(也須要測試流程)能夠直接發佈到正式線臨時目錄,而後mv或更改link的方式發佈到正式線目錄,不須要重啓http服務。這是sina,ganji的上線方案。
JAVA程序代碼上線的具體方案:
對於java上線方法:較大公司須要分組平滑上線,例如,首先從負載均衡器上摘掉一半的服務器,發佈代碼後,重啓服務器測試,沒問題後,掛上通過測試的這一半,再下另一半。若是前端有DNS智能解析,上線還能夠分地區上線若干服務器,逐漸普及到全國的服務器,這個被稱爲灰度發佈。
和訊案例
ABCD 12:33:24 咱們這裏代碼發佈都不太標準,所有都是開發本身搞 12:35:14 目前是什麼個方式呢 說下現狀便可。 ABCD 12:36:04 就是很傳統,開發有權限能夠上機器,咱們就把應用部署好,他們隨便折騰。 ABCD 12:41:05 源代碼是svn,靜態內容都是同步分發
(3)小米案例
XYZ 13:36:49 代碼上線都是開發上,咱們運維這邊沒有流程...若是代碼發佈致使了問題,就是開發的問題。 XYZ 13:37:55 服務器上面有一個客戶端,開發本身在頁面上點發布,客戶端就去拉代碼了。 就是這麼個額流程,就像你之前說的,項目責任制,誰的項目出問題了。找開發和運維 13:49:08 不須要重啓服務器麼?還有直接拉到站點目錄麼? XYZ 13:49:17 嗯,都是自動的 他們有個管理系統 13:49:49 如何保證不影響用戶呢? 還有怎麼回滾的。 XYZ 13:50:12 尚未作到這點把 那個管理系統能夠回滾的,好像 平時把客戶的部署上去,再把機器加入到那個系統中 他們就能夠發了。 XYZ 13:58:16 運維這邊就管添加機器和安裝客戶端,也有發佈權限,項目上線後不多發。一教就會沒有在這塊搞過太多,那個程序和版本管理結合的。實現原理應該就是客戶端收到服務器發來的clone命令和路徑,就去執行了。
什麼是配置管理員呢?
就是在開發和運維中間起一個鏈接紐帶的一個職位,這個職位通常在大公司裏會設置,負責SVN的管理,上線管理,申請,協調等工做。
自動化部署和上線代碼管理
對於門戶網站或重視規範或開發能力較強的公司也許會結合系統服務和WEB界面管理來更科學更自動的進行上線代碼管理,如開發一個自動化代碼上線部署平臺,其實就是一個web管理界面(界面底層調用相關腳本實現分發推送代碼以及重啓服務器),而後普通的初級上線人員就能夠在平臺裏實現僅僅點鼠標,敲回車,就能實現平滑上線和平滑回滾代碼了,固然,自動化和完善的程度也許沒咱們說的這麼好,可是,思路是這樣的。