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是一種集中式文件系統版本管理系統,集中式管理的工作流程如下圖

 

wKiom1YrUo6STGugAAE73J7ZiJQ067.jpg

 

 

 

 

 

 

 

 

 

集中式代碼管理的核心是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小型格式的代碼上線案例

 

wKioL1YrUiCTui9cAAMs6naCrBc100.jpg

 

 

1.2 中型企業上線解決方案:

 

wKiom1YrUi7xhfPtAAHTYHIAYCs400.jpg

 

 

 

1.3大型企業上線解決方案:

ITIL  BSWx

 

 

 

wKioL1YrUpOQmEUEAARMMIlWO8M494.jpg

 

 

 

 

 

集群環境中分批更新

 

 

 

代碼上線解決方案注意事項:

1,上線的流程里,辦公測試環境---》IDC測試環境----》正式生產環境,所有環境軟件版本均應統一,否咋后患無窮;

 

2,開發團隊小組辦公內部測試環境(該環境由開發小組維護,或者定時自動更新代碼),代碼有問題返回給某個開發人員

3,有專門的測試工程師,程序有問題直接返回給開發人員

4,IDC測試有測試和運維參與,叫IDCtest,進行程序壓力測試,有問題直接返回給開發人員。無問題上生產環境

 

5,數台服務器代碼分發上線方案例子(Java程序)::::::

a,假設同業服務器有6台,分為2組,A組三台,B組三台,先對A進行平滑下線,B組正常提供服務,避免影響業務

b, 下線是通過腳本將A組的服務器從RS池(LVS,NGINX,HAPROXY,F5)等負載均衡器平滑提出,避免負載均衡器將請求送給

A組服務器,(此時在流量低峰期)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM