1. 程式人生 > >SVN集中程式碼版本管理倉庫

SVN集中程式碼版本管理倉庫

SVN介紹

Svn(subversion)是近年來崛起的非常優秀的版本管理工具,與CVS管理工具一樣,SVN是一個跨平臺的開源的版本控制系統。Svn版本管理工具管理著隨時間改變的各種資料。這些資料放置在一箇中央資料檔案庫(repository)中,這個檔案庫很像一個普通的檔案伺服器或者FTP伺服器,但是,與其他伺服器不同的是,SVN會備份並記錄每個檔案每一次的修改更新變動。這樣我們就可以把任意一個時間點的檔案恢復到想要的某一箇舊的版本,當然也可以直接瀏覽指定檔案的更新歷史記錄。
為什麼會有svn這樣一個專案?
官方解釋:為了接管CVS的使用者基礎,確切的說,我們寫了一個新的版本控制系統,它和CVS很相似,但是它修正了以前CVS所沒有解決的許多問題。問題見SVN官方首頁。
SVN是一個非常通用的軟體系統,它常被用來管理程式原始碼,但是它也可以管理任何型別的檔案,如文字,視訊,圖片等等。

svn與git的區別

Git 個人程式碼版本管理工具
Svn集中程式碼版本管理工具

svn集中式版本控制系統

svn版本控制系統是集中式的資料管理,存在一箇中央版本庫,所有開發人員本地開發所使用的程式碼都是來自於這個版本庫,提交程式碼也都必須提交到這個中央版本庫。

svn版本控制系統工作流程如下:
在中央庫上建立或從主幹複製一個分支
從中央庫check out 下這個分支的程式碼
增加自己的程式碼檔案,修改現存的程式碼或刪除程式碼檔案
commit程式碼,假設有人在剛剛的分支上提交了程式碼,你就會被提示程式碼過期,你得先up你的程式碼後再提交。up程式碼的時候如果出現衝突,需要解決好衝突後再進行提交。

缺點:
當無法連線到中央版本庫的環境下,你無法提交程式碼,將程式碼加入版本控制;
你無法檢視程式碼的歷史版本以及版本的變化過程。提交到版本控制系統中的程式碼我們都預設通過自測可執行的,如果某個模組的程式碼比較複雜,不能短時間內實現為可測試的功能,那麼你需要等很長的時間才能提交自己的程式碼,由於程式碼庫集中管理,因此,需要對中央版本庫的儲存做備份。這點分散式的版本控制系統要好一些。Svn的備份要備份所有程式碼資料以及所有更改的版本記錄。

git分散式的版本控制

git是由Linus開發的,所以很自然的git和Linux檔案系統結合的比較緊密,以至於在windows上你必須使用cygwin才能使其完美的工作。
那git憑啥叫做分散式的版本控制系統呢?還是從其工作模式講起把。
git中沒有了中央版本庫的說法了,但是為了開發小組的程式碼共享,我們通常還是會搭建一個遠端的git倉庫。
但是和svn不同的是,開發者本地也包含了一個完整的git倉庫,從某種程度上說本地的倉庫和遠端的倉庫在身份上是等價的,沒有主從之分。
如果你的專案是閉源專案,或者你習慣於以往的集中式的管理模式的話,那麼在git下你也可以像svn那樣的工作,只是流程中可能會增加一些步驟。
你本地建立一個git庫,並將其add到遠端git庫中。
你在本地新增或者刪除檔案,然後commit,當然commit操作都是提交到本地的git庫中了。(嗯,其實是提交到git目錄下的objects目錄中去了)
將本地git庫的分支push到遠端git庫的分支,如果這個時候遠端git庫中已經有別人push過,那麼遠端git庫將不允許你push,這時候你需要先pull,然後如果有衝突,處理好衝突,commit到本地git庫後,再push到遠端git庫。
從上面的描述我們可以看到,我們每個開發人員的本地都會有一個git庫,我們可以隨時進行commit而不需要聯網,可以隨時檢視歷史版本,當某一個功能點開發完了之後我們可以將commit後的內容push到遠端git庫了,如果遠端git庫的版本在你上次clone或者pull之後變化了,那麼你需要進行pull並處理衝突,提交之後,再push到遠端git庫。

企業應用場景

svn仍是當前企業的主流。git正在發展,也許未來也會成為主流,但現在還不是。如果同學們有精力,能同時掌握更好。

運維人員掌握版本管理

對於版本管理系統,運維人員需要掌握的技術點:
安裝,部署,維護,排障。
簡單使用,很多公司都是由開發來管理,包括建立新倉庫和新增刪除賬號
對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務的。

SVN服務執行模式與訪問方式
  1. 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客戶端訪問方式

SVN客戶端可以通過多種方式訪問伺服器端,例如:本地磁碟訪問,或各種各樣不同的網路協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。

訪問方式 說明
file:// 直接通過本地磁碟或者網路磁碟訪問版本庫
http:// 通過WebDAV協議訪問支援Subversion的Apache伺服器
https:// 與http://相似,但是用SSL加密訪問
svn:// 通過TCP/IP自定義協議訪問svnserve伺服器
svn+ssh:// 通過認證並加密的TCP/IP自定義協議訪問svnserve伺服器

SVN檔案庫資料格式

svn儲存版本資料有2種方式:BDB(一種事務安全型表型別)和FSFS(一種不需要資料庫的儲存系統)。因為BDB方式在伺服器中斷時,有可能鎖住資料,所以還是FSFS方式更安全一點。

BDB:
伯克利DB(Berkeley DB),版本庫可以使用的一種經過充分測試的後臺資料庫實現,不能在通過網路共享的檔案系統上使用,伯克利DB是Subversion 1.2版本以前的預設版本庫格式

FSFS:
一個專用於Subversion版本庫的檔案系統後端,可以使用網路檔案系統(例如 NFS 或 SMBFS)。是1.2版本及其後的預設版本庫格式。

SVN 集中式版本管理系統
  1. Svn是一種集中式檔案版本管理系統。集中式管理的工作流程如下圖:
    在這裡插入圖片描述
    集中式程式碼管理的核心是SVN伺服器,所有開發者在開始新一天的工作之前必須從伺服器獲取程式碼,然後進行開發,最後解決衝突,提交。所有的版本資訊都放在SVN伺服器上。因此如果脫離了伺服器,開發者就無法進行提交程式碼工作。
  2. 開發者利用SVN版本管理系統工作過程
    下面舉例說明:

開始新一天的工作:
首先從SVN伺服器下載專案組最新程式碼。
進入自己的分支,進行開發工作,每隔一小時向伺服器上自己的分支提交一次程式碼(很多程式設計師都有這個習慣。因為有時候自己對程式碼改來改去,最後又想還原到新一個小時的版本,或者看看前一個小時自己修改了哪些程式碼,就需要這樣做了)。
下班時間快到了,把自己的分支合併到伺服器主分支上,一天的工作完成,並反映給伺服器。

優點:
管理方便,邏輯清晰明確,符合一般人思維習慣。
易於管理,集中式svn伺服器更能保證資料安全性。
程式碼一致性非常高。
適合開發人數不多的專案開發。
普及度高,大部分軟體配置管理的大學教材都是使用svn和vss。

搭建SVN服務端

  1. 安裝配置SVN服務
#光碟安裝svn
[[email protected] ~]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[[email protected] ~]# yum -y install subversion
Loaded plugins: fastestmirror
Determining fastest mirrors
#建立svn版本庫資料儲存根目錄(svndata)及使用者,密碼許可權目錄(svnpasswd)
mkdir -p /application/svndata   #資料儲存根目錄
mkdir -p /application/svnpasswd #使用者,密碼許可權目錄
  1. 建立專案版本庫
    建立一個新的Subversion專案yunjisuan,其實,類似yunjisuan這樣的專案可以建立多個,每個專案對應不同的程式碼,這裡只是以建立一個專案為例演示:
[[email protected] ~]# svnadmin create /application/svndata/yunjisuan
[[email protected] ~]# tree /application/svndata/yunjisuan/
/application/svndata/yunjisuan/
|-- README.txt
|-- conf
|   |-- authz
|   |-- passwd
|   `-- svnserve.conf
|-- db
|   |-- current
|   |-- format
|   |-- fs-type
|   |-- fsfs.conf
|   |-- min-unpacked-rev
|   |-- rep-cache.db
|   |-- revprops
|   |   `-- 0
|   |       `-- 0
|   |-- revs
|   |   `-- 0
|   |       `-- 0
|   |-- transactions
|   |-- txn-current
|   |-- txn-current-lock
|   |-- txn-protorevs
|   |-- uuid
|   `-- write-lock
|-- format
|-- hooks     #鉤子指令碼
|   |-- post-commit.tmpl
|   |-- post-lock.tmpl
|   |-- post-revprop-change.tmpl
|   |-- post-unlock.tmpl
|   |-- pre-commit.tmpl
|   |-- pre-lock.tmpl
|   |-- pre-revprop-change.tmpl
|   |-- pre-unlock.tmpl
|   `-- start-commit.tmpl
`-- locks     #程式碼鎖,控制版本
    |-- db-logs.lock
    `-- db.lock

10 directories, 28 files

#提示:檢視svnadmin命令幫助的方法
  1. 編輯svn配置檔案
[[email protected] ~]# cd /application/svndata/yunjisuan/conf/
[[email protected] conf]# ll
total 12
-rw-r--r--. 1 root root 1080 Sep 13 16:02 authz
-rw-r--r--. 1 root root  309 Sep 13 16:02 passwd
-rw-r--r--. 1 root root 2279 Sep 13 16:02 svnserve.conf
[[email protected] conf]# cp svnserve.conf{,.bak}
[[email protected] conf]# vim svnserve.conf
#修改配置檔案的如下資訊
[[email protected] ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p'
    12  # anon-access = read
    13  # auth-access = write
    20  # password-db = passwd
    27  # authz-db = authz

#將配置檔案程式碼修改為如下所示:
[[email protected] ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p'
    12  anon-access = none          #禁止匿名訪問
    13  auth-access = write         #驗證訪問可寫
    20  password-db = /application/svnpasswd/passwd #密碼檔案位置
    27  authz-db = /application/svnpasswd/authz     #驗證檔案位置
    
特別提示:
此配置檔案裡的每條配置程式碼必須頂格寫,不能有空格。
  1. 將authz檔案和passwd檔案拷貝到/application/svnpasswd下
[[email protected] conf]# cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/
[[email protected] conf]# cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/
[[email protected] conf]# ll /application/svnpasswd/
total 8
-rw-r--r--. 1 root root 1080 Sep 13 17:07 authz
-rw-r--r--. 1 root root  309 Sep 13 17:07 passwd
  1. 啟動svn服務
[[email protected] conf]# svnserve --help          #svn啟動命令幫助
svnserve: warning: cannot set LC_CTYPE locale
svnserve: warning: environment variable LANG is en
svnserve: warning: please check that your locale name is correct
usage: svnserve [-d | -i | -t | -X] [options]

Valid options:
  -d [--daemon]            : daemon mode        #守護程序啟動(後臺)
  -i [--inetd]             : inetd mode
  -t [--tunnel]            : tunnel mode
  -X [--listen-once]       : listen-once mode (useful for debugging)
  -r [--root] ARG          : root of directory to serve #指定根目錄
  -R [--read-only]         : force read only, overriding repository config file
  --config-file ARG        : read configuration from file ARG
  --listen-port ARG        : listen port        #監聽埠預設3690
                             [mode: daemon, listen-once]
  --listen-host ARG        : listen hostname or IP address  #監聽IP
                             [mode: daemon, listen-once]
  -T [--threads]           : use threads instead of fork [mode: daemon]
  --foreground             : run in foreground (useful for debugging)
                             [mode: daemon]
  --log-file ARG           : svnserve log file
  --pid-file ARG           : write server process ID to file ARG
                             [mode: daemon, listen-once]
  --tunnel-user ARG        : tunnel username (default is current uids name)
                             [mode: tunnel]
  -h [--help]              : display this help
  --version                : show program version information

#啟動svn服務
[[email protected] conf]# svnserve -d -r /application/svndata/          #警告可以忽略
[[email protected] conf]# netstat -antup | grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      1294/svnserve       

  1. 解決svnserve啟動時的警告問題
[[email protected] conf]# source /etc/sysconfig/i18n   #啟用中文字符集
[[email protected] conf]# pkill svnserve
[[email protected] conf]# svnserve -d -r /application/svndata/
[[email protected] conf]# netstat -antup | grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      1261/svnserve 
[[email protected] conf]# cat /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
  1. passwd檔案及密碼設定
#在/application/svnpasswd/passwd檔案末尾追加如下內容:
[[email protected] conf]# vim /application/svnpasswd/passwd 
[users]
# harry = harryssecret  
# sally = sallyssecret
yunjisuan = 123456     #設定賬號密碼
benet = 123456  	    #設定賬號密碼
stu0001 = 123456       #設定賬號密碼
stu0002 = 123456	    #設定賬號密碼

  1. authz的授權
    注意:
    1,許可權配置檔案中出現的使用者名稱必須已在使用者配置檔案中定義
    2,對許可權配置檔案的修改立即生效,不必重啟svn
許可權配置說明
#使用者組格式:
【groups】
=,
其中,1個使用者組可以包含1個或多個用過戶,使用者間以逗號分隔。
例如:harry\_and\_sally = harry,sally     #==>使用者組 = 使用者1,使用者2

#版本庫目錄格式:
[<版本庫>:/專案/目錄]  #例如:[repository:/baz/fuz]
@<使用者組名> = <許可權>    #例如:@harry\_and\_sally = rw
<使用者名稱> = <許可權>       #例如:harry = rw
#其中,方框號內部分可以有多種寫法:
/application/svndata/
				專案名稱1
						專案主版
							分支A
							分支B
				專案名稱2
						專案主版
							分支A
							分支B
[/],表示根目錄及以下(即/application/svndata/目錄下),根目錄是svnserve啟動時指定的,我們指定為/application/svndata,[/]就是表示對全部版本庫設定許可權。
[repos:/],(即專案名稱1)表示對版本庫repos設定許可權。
[repos:/yunjisuan],(即專案主版)表示對版本庫repos中的yunjisuan專案設定許可權。
[repos:/yunjisuan/benet],(即專案主版/分支A)表示對版本庫repos中的yunjisuan專案的benet目錄設定許可權。
#許可權主體可以是使用者組,使用者或*,使用者組在前面加@,*表示全部使用者。
#許可權可以是w,r,wr和空,空表示沒有任何許可權。
#authz中每個引數都要頂格寫,開頭不能有空格。
#對於組,要以@開頭,使用者不需要@開頭。

#編輯authz配置檔案進行授權,在authz末尾加入以下幾句程式碼
[[email protected] conf]# egrep -v "#|^$" /application/svnpasswd/authz
[aliases]
[groups]
sagroup = stu001,stu002         #新增本行,定義組名
[yunjisuan:/]                   #定義授權的範圍
yunjisuan = rw                  #使用者單獨授權
benet = r                       #使用者單獨授權
@sagroup = r                    #組使用者授權

  1. 重啟動svnserve(無需重啟)
[[email protected] conf]# ps -ef | grep svn | grep -v grep
root       1261      1  0 17:16 ?        00:00:00 svnserve -d -r /application/svndata/
[[email protected] conf]# kill 1261
[[email protected] conf]# ps -ef | grep svn | grep -v grep
[[email protected] conf]# svnserve -d -r /application/svndata/

搭建SVN客戶端

使用svn客戶端(windows版)
  1. 軟體版本選擇

推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

  1. svn客戶端軟體安裝

一路yes即可

  1. svn客戶端軟體的使用

(1)先在本地建立一個目錄,起名任意,比如data
在這裡插入圖片描述
(2)滑鼠右鍵點選data目錄

選擇右鍵選單裡的SVN Checkout,出現下圖:
在這裡插入圖片描述
特別提示:
如果連線不通,請檢查Linux虛擬機器的iptables是否關閉。

點選OK後,出現下圖:
在這裡插入圖片描述
再次點選OK以後,結束。此時目錄裡多了一個隱藏的目錄,表示此目錄已經和svn伺服器連通

命令說明:
(1)SVN Checkout:相當於下載,第一次連線svn伺服器的時候需要和伺服器的對應儲存目錄進行資料同步,如果伺服器的對應目錄裡有資料檔案,那麼就會下載到你的本地對應目錄裡。
(2)SVN Update:更新資料,檢查伺服器端svn儲存目錄裡是否和本地svn儲存目錄資料不一致,如果不一致,那麼下載改變或新增的部分到本地svn目錄裡。(不會刪除本地目錄內容)
(3)SVN Commit:提交資料到svn伺服器端儲存目錄。本地svn儲存目錄會和伺服器端儲存目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至伺服器端。

  1. svn客戶端使用測試

(1)向windows的svn儲存目錄data裡放一個空檔案
在這裡插入圖片描述
(2)右鍵點選data目錄,選擇SVN Commit
在這裡插入圖片描述
在這裡插入圖片描述
(3)開啟本地data目錄裡的檔案,隨便寫點內容後,再次進行SVN commit
在這裡插入圖片描述
在這裡插入圖片描述
(4)直接從本地檢視伺服器端的資料內容

右鍵點選本地svn儲存目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖:
在這裡插入圖片描述
雙擊檔案可以直接遠端開啟檔案,可以看到裡面剛剛被修改後的內容已經更新至伺服器端。

(5)刪除本地svn儲存目錄data裡的檔案,後選擇SVN Update
剛剛刪除的檔案又重新下載回來了。

(6)繼續刪除本地svn儲存目錄data裡的檔案,後選擇SVN Commit
在這裡插入圖片描述
在這裡插入圖片描述
(7)再次檢視伺服器端儲存目錄裡,發現檔案已經被刪除了

在這裡插入圖片描述

SVN的管理命令(Linux)

先安裝subversion

[[email protected] ~]# svn --help
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.6.11.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)        #下載資料
   cleanup
   commit (ci)          #提交資料
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)            #顯示伺服器端內容
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)                  #更新資料

Subversion is a tool for version control.
For additional information, see http://subversion.tigris.org/
  1. 從SVN庫提取資料

將檔案checkout到本地目錄
svn checkout(co) remotepath localpath

[[email protected] ~]# yum -y install subversion
[[email protected] ~]# mkdir yunjisuan
[[email protected] ~]# cd yunjisuan/
[[email protected] yunjisuan]# pwd
/root/yunjisuan

#下載伺服器端資料到Linux本地目錄
[[email protected] yunjisuan]# svn co svn://192.168.239.137/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123456
Checked out revision 0.
[[email protected] yunjisuan]# touch daisy
[[email protected] yunjisuan]# pwd
/root/yunjisuan
[[email protected] yunjisuan]# svn add /root/yunjisuan/daisy 
A         /root/yunjisuan/daisy
[[email protected] yunjisuan]# svn commit /root/yunjisuan/daisy -m 1
Adding         daisy
Transmitting file data .
Committed revision 1.

排錯

[[email protected] yunjisuan]# svn co svn://192.168.239.137/yunjisuan/ /root/yunjisuan/ --username=benet --password=123456
[[email protected] yunjisuan]# svn commit /root/yunjisuan/daisy -m 1
svn: Commit failed (details follow):
svn: Authorization failed
#出錯原因:benet只有讀許可權,沒有寫許可權
將benet使用者新增rw許可權即可
  1. 檢視SVN版本庫中的資料(服務端)
    svn list file:///application/svndata/yunjisuan
#SVN服務端
[[email protected] conf]#  svn list file:///application/svndata/yunjisuan/
daisy

  1. 提交資料到SVN版本庫

(1)一次失敗的提交

[[email protected] yunjisuan]# pwd
/root/yunjisuan
[[email protected] yunjisuan]# mkdir {111..120}    #建立目錄
[[email protected] yunjisuan]# ll
total 44
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 111
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 112
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 113
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 114
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 115
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 116
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 117
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 118
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 119
drwxr-xr-x. 2 root root 4096 Sep 13 19:56 120
-rw-r--r--. 1 root root   30 Sep 13 19:45 ffff.txt
-rw-r--r--. 1 root root    0 Sep 13 19:48 xxxx
[[email protected] yunjisuan]# svn add *       #提交前需要先把要提交的內容做標記A
A         111
A         112
A         113
A         114
A         115
A         116
A         117
A         118
A         119
A         120
svn: warning: 'ffff.txt' is already under version control       #這個檔案已經標記過了
A         xxxx
[[email protected] yunjisuan]# svn ci -m "message"         #提交時需要同時-m指定一段話作為備註
Authentication realm: <svn://192.168.239.137:3690> e498878c-b578-41a4-8361-6c1c5baa75f9
Password for 'benet':           #輸入benet使用者密碼(之前checkout時的賬號密碼已經記錄到了此目錄)

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.239.137:3690> e498878c-b578-41a4-8361-6c1c5baa75f9

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes        #是否記錄賬戶
svn: Commit failed (details follow):
svn: Authorization failed                       #提交失敗,賬戶沒有寫許可權,認證失敗

(2)換賬戶重新Checkout

[[email protected] yunjisuan]# svn co svn://192.168.239.137/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123456      #換擁有寫入許可權的賬戶checkout

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.239.137:3690> e498878c-b578-41a4-8361-6c1c5baa75f9

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes            #是否作為目錄的新賬戶和密碼
Checked out revision 6.
[[email protected] yunjisuan]# ll
total 44
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 111
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 112
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 113
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 114
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 115
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 116
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 117
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 118
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 119
drwxr-xr-x. 3 root root 4096 Sep 13 19:57 120
-rw-r--r--. 1 root root   30 Sep 13 19:45 ffff.txt
-rw-r--r--. 1 root root    0 Sep 13 19:48 xxxx


#重新提交
[[email protected] yunjisuan]# svn add *
svn: warning: '111' is already under version control        #檔案或目錄已經納入了版本控制(也就是做過標記了)
svn: warning: '112' is already under version control
svn: warning: '113' is already under version control
svn: warning: '114' is already under version control
svn: warning: '115' is already under version control
svn: warning: '116' is already under version control
svn: warning: '117' is already under version control
svn: warning: '118' is already under version control
svn: warning: '119' is already under version control
svn: warning: '120' is already under version control
svn: warning: 'ffff.txt' is already under version control
svn: warning: 'xxxx' is already under version control
[[email protected] yunjisuan]# svn ci -m "message"         #重新提交
Adding         111
Adding         112
Adding         113
Adding         114
Adding         115
Adding         116
Adding         117
Adding         118
Adding         119
Adding         120
Adding         xxxx
Transmitting file data .
Committed revision 7.

#檢視伺服器端資料
[[email protected] yunjisuan]# svn list file:///application/svndata/yunjisuan/
111/
112/
113/
114/
115/
116/
117/
118/
119/
120/
ffff.txt
xxxx

SVN鉤子指令碼

鉤子指令碼簡介

鉤子指令碼的具體寫法就是作業系統中shell指令碼程式的寫法,可根據自己的SVN所在的作業系統和shell程式進行相應的開發。
鉤子指令碼就是被某些版本庫事件觸發的程式,例如:建立新版本或修改未被版本控制的屬性。每個鉤子都能掌管足夠的資訊來了解發生了什麼事件,操作物件是什麼以及觸發事件使用者的賬號。
根據鉤子的輸出或返回狀態,鉤子程式能夠以某種方式控制該動作繼續執行,停止或掛起。
預設情況下,鉤子的子目錄中包含各種版本庫鉤子模板

[[email protected] ~]# ls -l /application/svndata/yunjisuan/hooks/
total 36
-rw-r--r--. 1 root root 1977 Sep 13 16:02 post-commit.tmpl
-rw-r--r--. 1 root root 1638 Sep 13 16:02 post-lock.tmpl
-rw-r--r--. 1 root root 2289 Sep 13 16:02 post-revprop-change.tmpl
-rw-r--r--. 1 root root 1567 Sep 13 16:02 post-unlock.tmpl
-rw-r--r--. 1 root root 3426 Sep 13 16:02 pre-commit.tmpl
-rw-r--r--. 1 root root 2410 Sep 13 16:02 pre-lock.tmpl
-rw-r--r--. 1 root root 2786 Sep 13 16:02 pre-revprop-change.tmpl
-rw-r--r--. 1 root root 2100 Sep 13 16:02 pre-unlock.tmpl
-rw-r--r--. 1 root root 2780 Sep 13 16:02 start-commit.tmpl

對每種Subversion版本庫支援的鉤子都有一個模板,通過檢視這些指令碼的內容,你能看到是什麼事件觸發了指令碼及如何給傳指令碼傳遞資料。
同時,這些模板也是如何使用這些指令碼,結合Subversion支援的工具來完成有用任務的例子。
要實際安裝一個可用的鉤子,你需要在repos/hooks目錄下安裝一些與鉤子同名(如start-commit或者post-commit)的可執行程式或指令碼,注意,去掉模板的副檔名。
重要提示:

由於安全原因,Subversion版本庫在一個空環境中執行鉤子指令碼就是沒有任何環境變數,甚至沒有$PATH或%PATH%。由於這個原因,許多管理員會感到很困惑,他們的鉤子指令碼手工執行時正常,可在Subversion中卻不能執行。要注意,必須在你的鉤子中設定好環境變數或為你的程式指定好絕對路徑。

SVN的hooks模板
  1. 常用鉤子指令碼
鉤子指令碼 說明
post-commit 在提交完成成功建立版本之後執行該鉤子,提交已經完成,不可更改,因此,本指令碼的返回值被忽略。提交完成時觸發事務
pre-commit 提交完成前觸發執行該指令碼
start-commit 在客戶端還沒有向伺服器提交資料之前,即還沒有建立Subversion transaction之前,執行該指令碼(提交前出發事務)
  1. 非常用鉤子指令碼
    pre-revprop-change:在修改revision屬性之前,執行該指令碼
    post-revprop-change:在修改revision屬性之後,執行該指令碼。因為修改稿已經完成,不可更改,因此本指令碼的返回值被忽略(不過實際上的實現似乎是該指令碼的正確執行與否影響屬性修改)
    pre-unlock:對檔案進行解鎖操作之前執行該指令碼
    post-unlock:對檔案進行解鎖操作之後執行該指令碼
    pre-lock:對檔案進行加鎖操作之前執行該指令碼
    post-lock:對檔案進行加鎖操作之後執行該指令碼。
  2. 利用鉤子指令碼觸發同步資料的注意事項
    (1)一定要定義變數,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有呼叫系統變數,如果手動執行是沒有問題,但SVN自動執行就會無法執行了。
    (2)SVN的同步目錄在 update之前一定要先checkout一份出來,還有這裡一定要新增使用者和密碼。
    (3)加上了對前一個命令的判斷,如果update的時候出了問題,程式沒有退出的話還會繼續同步程式碼到Web伺服器上,這樣會造成程式碼有問題。
    (4)建議最好記錄日誌,出錯的時候可以很快的排錯
    (5)最後是資料同步,rsync的相關引數一定要清楚。
svn鉤子生產應用場景舉例

pre-commit:
限制上傳副檔名及大小,控制提交要輸入的資訊等。
post-commit:
SVN更新自動通知,MSN,郵件或簡訊通知。
SVN更新觸發checkout程式,然後實時rsync推送到伺服器等。

svn鉤子生產應用實戰
  1. rsync與svn鉤子結合實現資料實時同步某企業小案例
    (1)建立同步WEB目錄
    mkdir -p /data/www
    (2)將SVN中內容checkout到WEB目錄一份。
#SVN客戶端
[[email protected] yunjisuan]# mkdir -p /data/www
[[email protected] yunjisuan]# svn checkout svn://192.168.239.137/yunjisuan /data/www --username=yunjisuan --password=123456
A    /data/www/xxxx
A    /data/www/111
A    /data/www/120
A    /data/www/112
A    /data/www/113
A    /data/www/114
A    /data/www/ffff.txt
A    /data/www/115
A    /data/www/116
A    /data/www/117
A    /data/www/118
A    /data/www/119
Checked out revision 7.
[[email protected] yunjisuan]# ll /data/www/
total 44
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120
-rw-r--r--. 1 root root   30 Sep 13 21:32 ffff.txt
-rw-r--r--. 1 root root    0 Sep 13 21:32 xxxx

(3)製作鉤子指令碼,post-commit

#SVN服務端
[[email protected] yunjisuan]# cd /application/svndata/yunjisuan/hooks/
[[email protected] hooks]# cp post-commit.tmpl post-commit #複製模板一份
[[email protected] hooks]# egrep -v "#|^$" post-commit     #模板原始內容
REPOS="$1"
REV="$2"
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
[[email protected] hooks]# vim post-commit         #修改post-commit指令碼
[[email protected] hooks]# egrep -v "#|^$" post-commit
REPOS="$1"                  #傳參(未用上)
REV="$2"                    #傳參(未用上)
SvnIP="192.168.239.137"       #svn服務端的IP地址
ProjectName="yunjisuan"     #svn服務端的專案庫名稱
UserName="yunjisuan"        #賬戶姓名
PassWord="123456"           #賬戶密碼
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 ${LocalPaht}
    $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord}       #新建立目錄需要先經過checkout才能update
else
    $SVN update --username yunjisuan --password 123456 /data/www        #更新共享目錄內容
fi
if [ $? -eq 0 ];then
    /usr/bin/rsync -az --delete /data/www /tmp/         #資料同步推送到本地/tmp目錄下(生產環境可以直接同步推送到Web測試伺服器)
fi

(4)進行鉤子指令碼同步測試

#刪除之前的測試記錄
[[email protected] hooks]# rm -rf /data/www/
[[email protected] hooks]# ll -d /data/www
ls: cannot access /data/www: No such file or directory
[[email protected] hooks]# rm -rf /tmp/*
[[email protected] hooks]# ll /tmp/
total 0
[[email protected] hooks]# chmod 700 post-commit   #給鉤子指令碼可執行許可權

特別提示:
當用戶通過svn更新鉤子post-commit所在的專案庫時,在更新完畢之後會自動觸發鉤子指令碼

模擬更新專案庫版本
在這裡插入圖片描述
在這裡插入圖片描述

#檢視svn伺服器端鉤子指令碼執行情況
[[email protected] hooks]# ll /data/www/                   #svn伺服器端本地共享目錄
total 28
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118
-rw-r--r--. 1 root root    0 Sep 13 23:07 test.txt
-rw-r--r--. 1 root root    9 Sep 13 23:07 xxx.txt
-rw-r--r--. 1 root root    0 Sep 13 23:07 xxxx
[[email protected] hooks]# ll /tmp/www/                    #推送後的資料目錄
total 28
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 111
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 112
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 113
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 116
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 117
drwxr-xr-x. 3 root root 4096 Sep 13 23:07 118
-rw-r--r--. 1 root root    0 Sep 13 23:07 test.txt
-rw-r--r--. 1 root root    9 Sep 13 23:07 xxx.txt
-rw-r--r--. 1 root root    0 Sep 13 23:07 xxxx

大中小型企業上線解決方案

SVN 上線解決方案說明
  1. 小型公司程式碼上線案例(十幾臺伺服器)
    在這裡插入圖片描述
    開發每次修改完程式碼就直接提交,然後通過FTP直接更新到Web伺服器網頁目錄;沒有專門的測試人員,完全是由使用者來進行測試體驗。

小型企業現狀:

小型公司一般只有幾個開發人員,網站核心程式大多數都是PHP語言開發,為了方便,會直接通過FTP直接上傳程式程式碼到線上伺服器,隨時隨地上線更新。

上述上線方案的特點和問題:

釋出快,及時,隨時隨地就可以釋出程式碼。
開發人員釋出的程式碼不經過測試人員的測試,且使用者訪問頁面重新整理後頁面即改變,也可能重新整理瞬間程式在更新,到時無法訪問,對網站使用者的體驗比較差,如果開發寫錯了程式碼,造成的影響就更大了,這是拿使用者作為測試的上線方案。
據統計,網站中大概50%以上的故障是和開發程式程式碼有關的,(比如:開發寫錯了一個迴圈程式碼,導致了死迴圈,此時大量使用者訪問這個程式,就能把伺服器資源耗盡,搞死伺服器)
在中小公司網站出了問題一般是運維人員的問題(例如網站宕機),但這種情況下,問題大多可能由開發人員或程式碼引起的,這裡比較好的策略是開發專案負責制思想。
小型企業上線架構方案建議:

開發人員需在個人電腦搭建LAMP環境測試開發好的網站程式碼,並且在辦公室或IDC機房的測試環境測試通過,最好有專職測試人員。
程式程式碼上線規定時間,例如,三天上線一次,如網站需經常更新可每天下午17點上線,這個看網站業務性質而定,原則就是影響使用者體驗最小。
程式碼上線之前需備份,網站程式出了問題方便回退,另外,網站程式出了問題方便回退,另外,從上線技巧上講,上傳程式碼時儘可能先傳到伺服器網站臨時目錄,傳完整後一步mv過去,或者通過ln做軟連線。(線上更新程式碼思路)
務必由運維人員管理上線,對於程式碼的功能性,開發人員更在意,而對於程式碼的效能和服務的穩定,運維更在意,因此,如果網站問題歸運維管,就要讓運維上線這樣更規範科學。否則,開發隨意更新,出了問題運維負責,這樣就錯了。

  1. 中型企業上線解決方案
    中型企業上線,一般是規範運維人員操作步驟,制定統一的上線操作指令碼,備份檔名稱,備份檔案路徑。使操作人性化,統一化,自動化。
    Web程式碼的上線流程演示圖:
    在這裡插入圖片描述

  2. 大型企業上線解決方案

大型企業上線一般制度和流程控制較多,比較嚴謹,下面是某大型企業上線解決方案架構:9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
SVN裡的內容:
1,程式程式碼
2,服務的配置
3,專案文件,設計文件,運維部署優化文件

門戶大型網站架構環境程式碼上線具體方案:
本地開發人員從SVN中取程式碼。當天上線的提交到trunk,否則,長期專案單開分支開發,然後在合併主線(trunk)
辦公內網開發測試時,由開發人員或配置管理員通過部署平臺jenkins實現統一部署,(即在部署平臺上控制開發機器從SVN取程式碼,編譯,打包,釋出到開發機器,包名如idc_dep.war)
開發人員通知或和測試人員一起測試程式,沒有問題後,打上新的tag標記。
配置管理員,根據上步的tag標記,checkout出上線程式碼,並配置好IDC測試環境的所有配置,執行編譯,打包(mvn,ant)(php不需要),然後釋出到IDC內的統一分發伺服器,這裡要注意,不同環境的配置檔案是隨程式碼同時釋出的。
配置管理員或SA上線人員,把分發的程式程式碼內容推送到相關測試伺服器(包名如idc_test.war),然後通知開發及測試人員進行測試。如果有問題向上回退,繼續修改。
如果測試沒有問題,繼續打好tag標記,此時,配置管理員,根據上步的tag標記,checkout出測試好的程式碼,並配置好IDC正式環境的所有配置,執行編譯,打包(mvn,ant)(php不需要),然後釋出到IDC內的統一分發伺服器主機,準備批量釋出。
配置管理員或SA上線人員,把分發的內容推送到相關正式伺服器(包名如idc_product.war),然後通知開發及測試人員進行測試。如果有問題直接釋出回滾指令。
IDC正式上線的過程對於JAVA程式,可以是AB分組上線的思路,即平滑下線一半的伺服器,然後釋出更新程式碼測試,無問題後,掛上伺服器,同時在平滑下線另一半的伺服器,然後釋出更新程式碼測試(或者直接釋出後就掛上線)

PHP程式程式碼上線的具體方案:
對於PHP上線方法:釋出程式碼時(也需要測試流程)可以直接釋出到正式線臨時目錄,然後mv或更改link的方式釋出到正式線目錄,不需要重啟http服務。這是sina,ganji的上線方案。

JAVA程式程式碼上線的具體方案:
對於java上線方法:較大公司需要分組平滑上線,例如,首先從負載均衡器上摘掉一半的伺服器,釋出程式碼後,重啟伺服器測試,沒問題後,掛上經過測試的這一半,再下另外一半。如果前端有DNS智慧解析,上線還可以分地區上線若干伺服器,逐漸普及到全國的伺服器,這個被稱為灰度釋出。

  1. 更多大型程式碼上線解決方案案例
    (1)SINA網的程式碼釋出流程邏輯圖:
    在這裡插入圖片描述
    (2)和訊案例
ABCD 12:33:24
我們這裡程式碼釋出都不太標準,全部都是開發自己搞

Mr.chen 12:35:14
目前是什麼個方式呢
說下現狀即可。

ABCD 12:36:04
就是很傳統,開發有許可權可以上機器,我們就把應用部署好,他們隨便折騰。

ABCD 12:41:05
原始碼是svn,靜態內容都是同步分發

(3)小米案例


XYZ 13:36:49
程式碼上線都是開發上,我們運維這邊沒有流程...如果程式碼釋出導致了問題,就是開發的問題。

XYZ 13:37:55
伺服器上面有一個客戶端,開發自己在頁面上點發布,客戶端就去拉程式碼了。
就是這麼個額流程,就像你以前說的,專案責任制,誰的專案出問題了。找開發和運維

Mr.chen 13:49:08
不需要重啟伺服器麼?還有直接拉到站點目錄麼?

XYZ 13:49:17
嗯,都是自動的
他們有個管理系統

Mr.chen 13:49:49
如何保證不影響使用者呢?
還有怎麼回滾的。

XYZ 13:50:12
還沒有做到這點把
那個管理系統可以回滾的,好像
平時把客戶的部署上去,再把機器加入到那個系統中
他們就可以發了。

XYZ 13:58:16
運維這邊就管新增機器和安裝客戶端,也有釋出許可權,專案上線後很少發。一教就會沒有在這塊搞過太多,那個程式和版本管理結合的。實現原理應該就是客戶端收到伺服器發來的clone命令和路徑,就去執行了。

什麼是配置管理員呢?
就是在開發和運維中間起一個連線紐帶的一個職位,這個職位一般在大公司裡會設定,負責SVN的管理,上線
管理,申請,協調等工作。

  1. 自動化部署和上線程式碼管理

對於入口網站或重視規範或開發能力較強的公司也許會結合系統服務和WEB介面管理來更科學更自動的進行上線程式碼管理,如開發一個自動化程式碼上線部署平臺,其實就是一個web管理介面(介面底層呼叫相關指令碼實現分發推送程式碼以及重啟伺服器),然後普通的初級上線人員就可以在平臺裡實現僅僅點滑鼠,敲回車,就能實現平滑上線和平滑回滾程式碼了,當然,自動化和完善的程度也許沒我們說的這麼好,但是,思路是這樣的。下面就是管理平臺的一個圖例:
在這裡插入圖片描述

開發自動化部署平臺的思路很多,例如:我們可以通過nagios的被動模式實現上線管理平臺原理思路:
實際上就是生成配置在分發伺服器上執行命令請求,應用伺服器,然後指令碼在應用伺服器處理完畢後回傳結果到web介面顯示:
例如:check_nrpe -h 10.0.0.178 -c check_load

  1. 開發人員和運維人員業務變更管理平臺

業務變更管理平臺優點:
(1)變更管理制度流程有利於業務穩定。
(2)保留變更業務歷史,便於核查發現的問題。
(3)故障跟蹤平臺,有利於跟蹤問題的解決進度,而不是半途而廢。
相關常用軟體
JIRA 用於缺陷跟蹤,客戶服務,需求收集,流程審批,任務跟蹤,專案跟蹤和敏捷管理等工作領域。
Mantis是一款PHP開源Bug跟蹤系統,比較適合中小型專案的管理及跟蹤,具有多特性。包括:易於安裝,易於操作,基於Web,支援任何可執行PHP的平臺(Windows,Linux,Mac,Solaris,AS400/i5等),已經被翻譯成68種語言,支援多個專案,為每一個專案設定不同的使用者訪問級別,跟蹤缺陷變更歷史,定製我的檢視頁面,提供全文搜尋功能,內建報表生成功能(包括圖形報表),通過Email報告缺陷,使用者可以監視特殊的Bug,附件可以儲存在web伺服器上或資料庫中(還可以備份到FTP伺服器上),自定義缺陷處理工作流,支援輸出格式包括csv,MicrosoftExcel,MicrosoftWord,整合原始碼控制(SVN與CVS),整合wiki知識庫與聊天工具(可選/可不選),支援多種資料庫(MySQL,MSSQL,PostgreSQ,Oracle,DB2),提供WebService(SOAP)介面,提供Wap訪問。