svn版本管理
?
代碼發布方案:
1,安裝,優化 軟件環境,(nginx,lvs) ?《-------運維工程師
2,程序代碼(不斷更新)。 ? 《--------開發工程師,(開發,運維都可以發布)
3,配置變更(不斷變更)。 ? 《--------運維工程師。
?
一、版本控制管理工具SVN詳解
1.1 什么是SVN(subversion) ?
? ?SVN是近年來非常優秀的版本管理工具,與CSV管理工具一樣,SVN是一個跨平臺開元版本控制系統,但是SVN與眾不同的是,SVN會備份并記錄每個文件每一次的修改更新變動。這樣我們可以把任意一個時間點檔案恢復到想要的某一個舊版本,當然也可以直接瀏覽指定文件的更新歷史記錄
SVN的相關站點:
| 1 2 3 4 | http://subversion.tigris.org/ http://subversion.apache.org/ SVN客戶端:http://tortoisesvn.net/ SVN中文網站:http://svndoc.iusesvn.com/ |
?
?
目前為止:常見的版本管理軟件有:vss,CVS,SVN,git
1.1.2 SVN 與git的區別 ?
SVN是一個集中式數據管理中心,存在一個中央版本庫,所有開發人員所使用的代碼都是來源于版本庫,提交代碼也是這個中央版本庫。
SVN版本控制系統工作流程:
a,在中央庫上創建或者從主干復制一個分支
b,從中央庫check out下這個分支代碼
c,增加自己的代碼,修改,刪除代碼文件
d, commit 代碼。假設有人剛剛在分支提交了代碼,你就會被提醒代碼過期
? 你需要先update你的代碼,然后在提交。
?
優缺點:
?
當無法連接到中央版本庫的環境下,你無法提交代碼,將代碼加入版本控制。
你無法查看代碼的歷史版本以及版本的變化過程。提交到版本控制系統的代碼我們都默認通過自測可運行。如果某個模塊的代碼比較復雜,不能短時間內實現可測試的功能,那么需要更長時間提交自己的代碼,因此需要備份存儲做備份。這點分布式的版本控制系統比較好點
SVN的備份要備份所有代碼數據以及所有更改的新版本記錄
1.1.2.2 git分布式版本控制
git中沒有了中央分布式,但是為了開發小組的代碼共享,我們通常還是會搭建一個遠程git倉庫,從某種意義上說,本地的git和遠程的git倉庫沒有主從之分.
?
a.如果你本地創建一個git庫,并將其add到遠程git庫中
b,你在本地添加或者刪除文件,然后commit,當然commit操作都是提交到本地的git庫中了,(也就是提交到了本地git目錄的object目錄中去了)
c,將本地的git庫的分支push到遠程git庫的分支,如果這時候遠程git庫中,以及分別有了別人的push,那么遠程git的分支不允許你push,到這個時候需要先pull,然后如果有沖突處理好沖突,commit到本地git,在push到遠程git庫
?
1.1.3 運維需要掌握的技術點:
a,安裝,部署,維護,排障?
b,簡單應用,很多公司由開發來管理,包括建立新倉庫,添加,刪除賬號
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 1.2.0?svn服務運行方式與訪問方式 1.2.1?SVN服務端運行方式 ??????SVN服務常見的運行訪問方式有3種: ?????a,獨立服務器訪問 ???????訪問地址:SVN://svn.etiantian.org/sadoc ?????b,借助Apache等http服務 ???????訪問地址如:?http://svn.etiantian.org/sadoc ???????b1,單獨安裝Apache+svn???不推薦,比較土 ???????b2,csvn(apache+svn)是一個單獨的整合軟件,帶web界面管理的SVN軟件. ?????c,本地直接訪問 ?????????訪問方式file://application/svndata/sadoc??一般在SVN服務器本地使用 我們主要以第一種和第二種的CSVN?web?管理方式? ?? 1.2.1.1?SVN客戶端訪問方式 file://???????????直接本地磁盤或者網絡磁盤訪問版本庫 http://???????????通過webDAV?協議訪問subversion的Apache服務器 https://??????????與http://相似,但是用ssl加密訪問 SVN://????????????通過頭tcp/ip自定義協議訪問SVNsever svn+ssh???????????通過認證加密tcp/ip自動以協議訪問SVNserver服務器, |
?
1.3.1 SVN檔案庫數據格式
SVN存儲版本數據有2種方式:BDB(一種事務安全型表類型 berkley DB) ,FSFS(一種不需要數據庫的存儲系統)BDB方式在服務器中斷時候,可能鎖住數據,所以還是FSFS方式更安全
?
FSFS 一個專門用于subversion版本庫的文件系統后端,可以使用網絡文件 系統(NFS,SMBFS)
?
?
SVN是一個基于關系型數據庫BDB或者一系列二進制文件的FSFS
?
?
1.4.1 SVN集中式版本管理系統
SVN是一種集中式文件系統版本管理系統,集中式管理的工作流程如下圖
?
?
?
?
?
?
?
?
?
?
集中式代碼管理的核心是svn服務器,所有開發者新來的第一天必須從服務器獲取代碼,然后開發,最后解決沖突,提交,所有信息都放在svn服務器上。
?
1.4.2 開發者利用svn版本管理系統工作過程
?
舉例說明:
a,從svn服務器下載項目最新代碼。
b,進入自己的 分支,進行開發工作,每隔一段時間,提交一次,
c,下班時間,把自己的分支合并到服務器主分支上,一天的工作完成,并反映給服務器
缺點:
a,由于每次提交都會有一個原始副本,因此svn數據庫容量會暴增
b,如果不能連接到svn服務器上,基本上不可以工作
c,不適合開源系統開發,開發人數較多,但是集中式管理非常明確權限管理機制,可以分層次管理
?
優點:
a,管理方便,邏輯清晰,明確。
b,易于管理,集中式svn服務器更容易保證數據安全性
c,代碼一致性非常高
d,適合開發人數不多的項目開發
?
?
2.0安裝配置svn服務
?
2.0.1準備操作系統并查看系統環境
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | [root@localhost?~]#?cat?/etc/redhat-release? CentOS?release?6.5?(Final) [root@localhost?~]#?uname?-r 2.6.32-431.el6.x86_64 [root@localhost?~]#?yum?install?subversion?-y? [root@localhost?~]#?rpm?-qa?|?grep?subversion? subversion-1.6.11-15.el6_7.x86_64 [root@localhost?~]#?sed??-i?'s#keepcache=0#keepcache=1#g'?/etc/yum.conf? [root@localhost?~]#?grep?keepcache??/etc/yum.conf? keepcache=1???rpm包安裝后不清除 2.0.2配置并啟動svn 建立svn版本數據存儲根目錄svndata,用戶,密碼,權限目錄 [root@localhost?~]#?mkdir?-p?/application/svndata/???--數據存儲的根目錄 [root@localhost?~]#?mkdir?-p?/application/svnpasswd??--用戶,密碼權限目錄 啟動svn服務,指定svn服務的根目錄 [root@localhost?~]#?svnserve?-d?-r?/application/svndata/? [root@localhost?~]#?ps?-ef?|?grep?svn root??????1838?????1??0?16:56??????????00:00:00?svnserve?-d?-r?/application/svndata/ 2.0.3?建立項目版本庫,并且配置版本庫 創建一個新的subversion項目sadoc,類似的這樣顯目可以創建多個,并對于不同的代碼、 [root@localhost?~]#?svnadmin?create?/application/svndata/sadoc????-創建一個新的項目 2.0.4?修改,調整svn配置文件以及權限文件 配置允許用戶wyb讀寫訪問 cd??/application/svndata/sadoc/conf [root@localhost?conf]#?cp?svnserve.conf?svnserve.conf.bak? [root@localhost?conf]#?vim?svnserve.conf 修改完之后如下 [root@localhost?conf]#?grep?-Ev?"^#|^$"?svnserve.conf [general] anon-access?=?none auth-access?=?write password-db?=?/application/svnpasswd/passwd authz-db?=??/application/svnpasswd/authz [sasl] 把密碼認證文件模塊復制到相關的目錄,這樣方便同意管理 [root@localhost?conf]#?ls?/application/svnpasswd/ [root@localhost?conf]#?cp?passwd??authz??/application/svnpasswd/ [root@localhost?conf]#?ls?/application/svnpasswd/ authz??passwd [root@localhost?conf]#?ll?/application/svnpasswd/ total?8 -rw-r--r--?1?root?root?1080?Oct?22?17:19?authz -rw-r--r--?1?root?root??309?Oct?22?17:19?passwd [root@localhost?conf]#?chmod?700?/application/svnpasswd/* [root@localhost?conf]#?ll?/application/svnpasswd/ total?8 -rwx------?1?root?root?1080?Oct?22?17:19?authz -rwx------?1?root?root??309?Oct?22?17:19?passwd [root@localhost?conf]#? 新增用戶,密碼 提示: 1,等號前為SVN賬號,等好后為密碼,密碼是明晚,注意密碼權限700 2,更改svnserve.conf時候,需要重啟svn,更改authz,passwd文件時候不需要重啟svn ?[root@localhost?svnpasswd]#vim?passwd [root@localhost?svnpasswd]#?cat?passwd? ?? [users] #?harry?=?harryssecret #?sally?=?sallyssecret wyb?=?123456? zhiyan?=?zhiyan? [root@localhost?svnpasswd]#? [root@localhost?svnpasswd]#?vim?authz???權限配置文件 格式說明 版本庫目錄格式: [<版本庫>:/項目/目錄] @<用戶組名>=<權限> <用戶名>=<權限> [/]?表示根目錄。根目錄就是svnserver啟動時候,我們制定的/application/svndata?[/]就表示對全部版本庫設置權限 [repos:/]???表示對版本庫repository設置權限 [repos:/sadoc]?表示對版本庫repo中sadoc項目設置權限 [repos:/sadoc/wyb]?表示對版本庫repos中的sadoc項目的wyb目錄設置權限 權限主體可以是用戶組,用戶,*?,用戶組前面加@,*表示全部用戶 權限可以是w?,r,wr和?空表示沒有任何權限 authz?中每個參數都要定格寫,開頭不能有空格 對于組,要以開頭@開頭,用戶不需要@開頭 [root@localhost?svnpasswd]#cat?authz? 新增部分 sagroup?=?wyb,zhiyan [sadoc:/] wyb?=?rw zhiyan?=?r @sagroup?=?r ?? 注意: *?權限配置文件中出現的用戶名必須是用戶配置文件中定義 *?對權限配置文件的修改立即生效,不必重啟svn 用戶格式 [groups] 其中,1個用戶組可以包含1個或者多個用戶,用戶可以逗號分隔。 此時svn安裝完畢 3.1??windows客戶端軟件tortoisesSVN 下載地址:http://tortoisesvn.net/downloads.html 由于目前安裝的是svn獨立訪問方式,所以svn客戶端鏈接服務器的方式如下 svn://192.168.2.48/sadoc 用戶名:gongli 密碼:123456 3.1.2?linux客戶端命令行使用說明 co??checkout up??update ci??commit 3.1.2.1?從svn庫提取數據 a,?將文件checkout到本地目錄???Linux客戶端,是checkout?,而不是update [root@localhost?sadoc]#?mkdir?/svndata /svndata???---項目代碼下載到、/svndata/?下? svn?co??svn://192.168.2.48/sadoc/??/svndata/??--username=gongli??--password=123456 3.1.2.2-查看服務器端的數據 [root@localhost?svndata]#?svn??ls???svn://192.168.2.48/sadoc/???--username=wyb??--password=123456??-查看服務器端的數據 svn.txt ww.txt 新建文本文檔.txt [root@localhost?svndata]#? [root@localhost?svndata]#?svn??ls???svn://192.168.2.48/sadoc/???--username=wyb??--password=123456??--verbose ??????5?wyb???????????????????Oct?23?10:59?./ ??????1?wyb??????????????8011?Oct?23?09:49?svn.txt ??????4?wyb?????????????????0?Oct?23?10:37?ww.txt ??????5?wyb?????????????????0?Oct?23?10:59?新建文本文檔.txt 3.1.2.3?從本地提交到svn服務器 [root@localhost?svndata]#?touch?a.html? [root@localhost?svndata]#?svn?add??a.html? A?????????a.html [root@localhost?svndata]#?svn?commit? svn:?Commit?failed?(details?follow): svn:?Could?not?use?external?editor?to?fetch?log?message;?consider?setting?the?$SVN_EDITOR?environment?variable?or?using?the? --message?(-m)?or?--file?(-F)?options svn:?None?of?the?environment?variables?SVN_EDITOR,?VISUAL?or?EDITOR?are?set,?and?no?'editor-cmd'?run-time?configuration? option?was?found [root@localhost?svndata]#?svn?commit??-m?"svn?ci?data"? Adding?????????a.html Transmitting?file?data?. Committed?revision?6. [root@localhost?svndata]#? [root@localhost?svndata]#?svn??ls???svn://192.168.2.48/sadoc/???--username=wyb??--password=123456??--verbose ??????6?wyb???????????????????Oct?23?11:09?./ ??????6?wyb?????????????????0?Oct?23?11:09?a.html ??????1?wyb??????????????8011?Oct?23?09:49?svn.txt ??????4?wyb?????????????????0?Oct?23?10:37?ww.txt ??????5?wyb?????????????????0?Oct?23?10:59?新建文本文檔.txt |
###########################################################################################
?
?
二、svn ?hooks?
?
1.1.1鉤子腳本:
?
寫法就是系統中shell腳本程序的寫法
?
?
當svn版本庫發生改變時候,hooks就會觸發相應作出執行命令 ,根據hooks輸出或者返回的狀態,hooks程序能夠以某種方式執行該動作繼續執行,停止或者掛起、
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -rw-r--r--?1?root?root?2780?Oct?22?17:05?start-commit.tmpl [root@localhost?hooks]#?pwd /application/svndata/sadoc/hooks [root@localhost?hooks]#?ll total?36 -rw-r--r--?1?root?root?1977?Oct?22?17:05?post-commit.tmpl -rw-r--r--?1?root?root?1638?Oct?22?17:05?post-lock.tmpl -rw-r--r--?1?root?root?2289?Oct?22?17:05?post-revprop-change.tmpl -rw-r--r--?1?root?root?1567?Oct?22?17:05?post-unlock.tmpl -rw-r--r--?1?root?root?3426?Oct?22?17:05?pre-commit.tmpl -rw-r--r--?1?root?root?2410?Oct?22?17:05?pre-lock.tmpl -rw-r--r--?1?root?root?2786?Oct?22?17:05?pre-revprop-change.tmpl -rw-r--r--?1?root?root?2100?Oct?22?17:05?pre-unlock.tmpl -rw-r--r--?1?root?root?2780?Oct?22?17:05?start-commit.tmpl [root@localhost?hooks]# |
?
?
對每種subversion版本庫支持的鉤子都有一個模板,通過查看這些腳本的內容,我們可以看到 的是什么事件觸發了腳本以及如何給腳本傳遞數據
同時,這些模板也是如何使用這些腳本,結合subversion支持的工具來完成任務的例子。
要實際安裝一個可用的鉤子,你需要在repo/hooks 目錄下安裝一些與鉤子同名的可執行的程序或者腳本
?
注意:
由于安全原因,subversion版本庫在一個空環境中執行鉤子腳本就是沒有任何環境變量,甚至沒有$PATH或者%PATH% 由于這個原因,許多管理員會感到困惑, ?他們的鉤子腳本手工運行時正常,可以在subversion中卻不能運行。 要注意,必須在你的鉤子中設置好“環境變量”或者為你的程序制定好“絕對路徑”
?
?
1.1.2 svn的hooks模板
1.1.2.1常用的鉤子腳本
?
?
post-commit ? ? ? ?在提交完成成功創建版本之后執行該鉤子,提交已經完成,不可更改,因此,本腳本的返回值被忽略提交完成時候出發事務
pre-commit ? ? ? ?提交完成觸發執行該腳本 ?
start-commit ? ? ??
在客戶端還沒有向服務器提交數據之前,即還沒有建立 ?subversiontransaction之前執行該腳本
?
1.2 svn hooks生產環境應用場景舉例
pre-commit?
限制上傳文件大小擴展名及大小,控制提交要輸入的信息等、
?
post-commit?
svn 更新自動周知,MSN,郵件短信周知
svn更新觸發checkout程序,然后實時rsync送到服務器等
?
1.2.1 svn鉤子生產應用實戰。
?
案例一:rsync與svn鉤子結合實現數據同步某企業小案例
?
a,建立同步web目錄:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | [root@localhost?hooks]#?mkdir??-p??/data/www b,將svn中內容checkout到WEB目錄一份 [root@localhost?www]#?svn?co?svn://192.168.2.48/sadoc??/data/www/?--username=wyb??--password=123456 [root@localhost?www]#?ls a.html??b.html??c.html???svn.txt??ww.txt 修改hooks腳本,進行同步 ?chmod?755?/application/svndata/sadoc/hooks/post-commit [root@localhost?svndata]#?more?/application/svndata/sadoc/hooks/post-commit #!/bin/bash REPOS="$1" REV="$2" export?LC_CTYPE="en_US.UTF-8" export?LC_ALL=? LOGPATH="app/log" [!?-d?${LOGPATH}?]?&&?mkdir?${LOGPATH}?-p ##update?content?from?svn? SVN=/usr/bin/svn $SVN??update?--username?wyb?--password?123456?/data/www/ if?[?$??-eq?0?] ???then ?????/usr/bin/rsync??-az??--delete??/data/www/???/tmp/ fi [root@localhost?svndata]#?touch?wwwwwwwwwwwwwwwww [root@localhost?svndata]#?svn?add?wwwwwwwwwwwwwwwww? A?????????wwwwwwwwwwwwwwwww [root@localhost?svndata]#?svn?commit?-m?"wwwwwwww" Adding?????????wwwwwwwwwwwwwwwww Transmitting?file?data?. Committed?revision?13. [root@localhost?svndata]#?svn??ls???svn://192.168.2.48/sadoc/???--username=wyb??--password=123456??--verbose ?????13?wyb???????????????????Oct?23?15:11?./ ??????9?wyb????????????????15?Oct?23?11:34?a.html ?????12?wyb?????????????????0?Oct?23?15:09?asd.txt ??????7?wyb?????????????????0?Oct?23?11:28?b.html.txt ??????8?wyb?????????????????0?Oct?23?11:30?c.html.txt ?????11?wyb?????????????????0?Oct?23?15:08?hh.txt ??????1?wyb??????????????8011?Oct?23?09:49?svn.txt ??????4?wyb?????????????????0?Oct?23?10:37?ww.txt ?????13?wyb?????????????????0?Oct?23?15:11?wwwwwwwwwwwwwwwww [root@localhost?svndata]#? [root@localhost?svndata]#?ls?/tmp/ a.html??asd.txt??b.html.txt??c.html.txt??hh.txt??svn.txt??ww.txt??wwwwwwwwwwwwwwwww |
?
?
寫鉤子腳本的注意事項:
a,鉤子腳本的權限要允許svn執行,一般可以設置 chmod 755 post-commit
?
b,鉤子腳本盡可能定義環境變量,主要是用過的命令的路徑,因為svn考慮安裝的問題,不會調用系統環境變量,所以如果發現手動執行post-
?
commit沒有問題,但是自動還有可能無法執行
?
c,這個筆記的案例腳本,在svn update之前先要手動checkout一份出來,還有盡可能要加上用戶密碼,如果只是手動一樣會更新,但是如果觸
?
發可能就會不能更新
?
#####################################################
SVN 遠程同步程序代碼到遠端的WEB服務器參考方法
方法一:http://biancheng.dnbcw.info/linux/345531.html
方法二:http://os.51cto.com/art/201410/454887.htm
#######################################################
?
?
案例二:
利用pre-commit 限制上傳文件擴展名及大小
.
.
.
.
.
.
.
.
.
?
###############################################################
代碼上線的解決方案,案例
?1.1小型格式的代碼上線案例
?
?
?
1.2 中型企業上線解決方案:
?
?
?
?
1.3大型企業上線解決方案:
ITIL ?BSWx
?
?
?
?
?
?
?
?
集群環境中分批更新
?
?
?
代碼上線解決方案注意事項:
1,上線的流程里,辦公測試環境---》IDC測試環境----》正式生產環境,所有環境軟件版本均應統一,否咋后患無窮;
?
2,開發團隊小組辦公內部測試環境(該環境由開發小組維護,或者定時自動更新代碼),代碼有問題返回給某個開發人員
3,有專門的測試工程師,程序有問題直接返回給開發人員
4,IDC測試有測試和運維參與,叫IDCtest,進行程序壓力測試,有問題直接返回給開發人員。無問題上生產環境
?
5,數臺服務器代碼分發上線方案例子(Java程序)::::::
a,假設同業服務器有6臺,分為2組,A組三臺,B組三臺,先對A進行平滑下線,B組正常提供服務,避免影響業務
b, 下線是通過腳本將A組的服務器從RS池(LVS,NGINX,HAPROXY,F5)等負載均衡器平滑提出,避免負載均衡器將請求送給
A組服務器,(此時在流量低峰期)
總結
- 上一篇: SourceTree的基本使用
- 下一篇: bupt summer training