部署和使用SVN
Subversion(簡(jiǎn)稱(chēng)SVN)是一個(gè)開(kāi)源的版本控制系統(tǒng),通過(guò)分支管理系統(tǒng),可以高效管理隨時(shí)間改變的數(shù)據(jù)。本文介紹如何基于ECS部署和使用SVN。
準(zhǔn)備工作
創(chuàng)建用于部署SVN的ECS實(shí)例,具體操作,請(qǐng)參見(jiàn)自定義購(gòu)買(mǎi)實(shí)例。
該實(shí)例必須滿(mǎn)足以下條件:
實(shí)例已分配公網(wǎng)IP地址或綁定彈性公網(wǎng)IP(EIP)。具體操作,請(qǐng)參見(jiàn)綁定EIP。
操作系統(tǒng):Alibaba Cloud Linux 3、Alibaba Cloud Linux 2、CentOS 7.x。
實(shí)例規(guī)格:部署SVN服務(wù)所需的實(shí)例規(guī)格與項(xiàng)目規(guī)格和團(tuán)隊(duì)規(guī)模有關(guān),建議您使用4 vCPU、4 GiB以上的實(shí)例規(guī)格。
實(shí)例安全組的入方向規(guī)則已放行22、80、443端口。具體操作,請(qǐng)參見(jiàn)添加安全組規(guī)則。
說(shuō)明svnserve模式還需要放行3690端口。
部署SVN
SVN有HTTP和svnserve兩種訪(fǎng)問(wèn)模式,兩種模式主要有以下區(qū)別。您可以根據(jù)業(yè)務(wù)需要,選擇以下其中一種部署方式。
功能 | HTTP模式 | svnserve模式 |
協(xié)議 | 使用HTTP協(xié)議進(jìn)行通信。 | 使用自定義的SVN協(xié)議進(jìn)行通信。 |
訪(fǎng)問(wèn)方式 | 支持通過(guò)Web瀏覽器或者SVN客戶(hù)端進(jìn)行訪(fǎng)問(wèn)。 | 僅支持通過(guò)SVN客戶(hù)端進(jìn)行訪(fǎng)問(wèn)。 |
端口 | 使用80端口進(jìn)行通信。 | 使用3690端口進(jìn)行通信。 |
安全性 | 通過(guò)HTTPS進(jìn)行加密通信。 | 默認(rèn)使用明文通信,可以通過(guò)啟用加密選項(xiàng)進(jìn)行加密通信。 |
配置 | 需要在Web服務(wù)器上進(jìn)行配置。 | 需要在SVN服務(wù)器上進(jìn)行配置。 |
功能支持 | 支持更多的功能,比如權(quán)限管理、日志查看等。 | 相對(duì)簡(jiǎn)單,功能較少。 |
部署HTTP訪(fǎng)問(wèn)SVN
步驟一:安裝SVN
遠(yuǎn)程連接安裝SVN的Linux實(shí)例。
具體操作,請(qǐng)參見(jiàn)通過(guò)密碼或密鑰認(rèn)證登錄Linux實(shí)例。
運(yùn)行以下命令,安裝SVN。
sudo yum install -y subversion
運(yùn)行以下命令,查看SVN版本。
svnserve --version
當(dāng)回顯類(lèi)似如下所示時(shí),說(shuō)明SVN已安裝。
步驟二:安裝Apache
運(yùn)行以下命令,安裝httpd。
sudo yum install httpd -y
運(yùn)行以下命令,查看httpd版本。
httpd -version
返回下圖所示信息時(shí),表示httpd服務(wù)已安裝。
步驟三:安裝mod_dav_svn
mod_dav_svn是一個(gè)Apache HTTP服務(wù)器的模塊,用于提供SVN(Subversion)版本控制系統(tǒng)的Web訪(fǎng)問(wèn)功能。
運(yùn)行以下命令,安裝mod_dav_svn。
sudo yum install mod_dav_svn -y
步驟四:配置SVN
依次運(yùn)行以下命令,創(chuàng)建SVN版本庫(kù)。
sudo mkdir /var/svn cd /var/svn sudo svnadmin create /var/svn/svnrepos
運(yùn)行以下命令,將SVN倉(cāng)庫(kù)的用戶(hù)組修改為apache。
sudo chown -R apache:apache /var/svn/svnrepos
依次運(yùn)行以下命令,查看自動(dòng)生成的版本庫(kù)文件。
cd svnrepos ls
Subversion目錄說(shuō)明如下表:
目錄
說(shuō)明
db
存放所有的版本控制數(shù)據(jù)文件。
hooks
放置hook腳本文件。
locks
用來(lái)追蹤存取文件庫(kù)的客戶(hù)端。
format
一個(gè)文本文件,文件中只包含一個(gè)整數(shù),表示當(dāng)前文件庫(kù)配置的版本號(hào)。
conf
SVN版本庫(kù)的配置文件(版本庫(kù)的訪(fǎng)問(wèn)賬號(hào)、權(quán)限等)。
運(yùn)行以下命令,增加SVN版本庫(kù)的用戶(hù)和密碼。
SVN默認(rèn)使用明文密碼,而HTTP并不支持明文密碼,所以需要單獨(dú)生成passwd文件。本示例中,增加用戶(hù)
userTest
,密碼設(shè)置為passWDTest
。請(qǐng)根據(jù)實(shí)際情況選擇并運(yùn)行以下命令:如果您第一次增加用戶(hù),運(yùn)行命令時(shí)需要帶上參數(shù)
-c
生成文件。sudo htpasswd -c /var/svn/svnrepos/conf/passwd userTest
如果您已經(jīng)增加過(guò)用戶(hù),當(dāng)后續(xù)還需要增加用戶(hù)時(shí),請(qǐng)運(yùn)行以下命令。
sudo htpasswd /var/svn/svnrepos/conf/passwd userTest
根據(jù)提示設(shè)置用戶(hù)的密碼。
運(yùn)行以下命令,進(jìn)入conf目錄下。
cd /var/svn/svnrepos/conf/
設(shè)置賬號(hào)的讀寫(xiě)權(quán)限。
運(yùn)行以下命令,打開(kāi)權(quán)限控制文件。
sudo vim authz
按
i
鍵進(jìn)入編輯模式。移動(dòng)光標(biāo)至文件末尾,并添加如下代碼(其中,userTest表示賬號(hào),r表示讀權(quán)限,w表示寫(xiě)權(quán)限)。
[/] userTest=rw
按
Esc
鍵后,輸入:wq
保存并退出文件。
修改SVN服務(wù)配置。
運(yùn)行以下命令,打開(kāi)SVN服務(wù)配置文件。
sudo vim svnserve.conf
按
i
鍵進(jìn)入編輯模式。移動(dòng)光標(biāo)找到如下配置行,刪除行前面的注釋符#和空格。
說(shuō)明每行不能以空格開(kāi)始,且等號(hào)兩端要有一個(gè)空格。
anon-access = read auth-access = write password-db = passwd authz-db = authz realm = /var/svn/svnrepos
按
Esc
鍵后,輸入:wq
保存并退出文件。
運(yùn)行以下命令,啟動(dòng)SVN版本庫(kù)。
本文示例中,啟動(dòng)命令直接指定到版本庫(kù)。
sudo svnserve -d -r /var/svn/svnrepos/
說(shuō)明運(yùn)行
killall svnserve
命令可停止SVN服務(wù)。運(yùn)行命令,查看SVN服務(wù)是否開(kāi)啟。
ps -ef |grep svn
返回下圖所示信息時(shí),表示SVN服務(wù)已經(jīng)開(kāi)啟。
步驟五:配置Apache
運(yùn)行以下命令,新增并編輯httpd配置文件。
sudo vim /etc/httpd/conf.d/subversion.conf
按
i
鍵進(jìn)入編輯模式。在
subversion.conf
文件中輸入以下配置信息。<Location /svn> DAV svn SVNParentPath /var/svn AuthType Basic AuthName "Authorization SVN" AuthzSVNAccessFile /var/svn/svnrepos/conf/authz AuthUserFile /var/svn/svnrepos/conf/passwd Require valid-user </Location>
按
Esc
鍵后,輸入:wq
保存并退出文件。運(yùn)行以下命令,啟動(dòng)Apache服務(wù)。
sudo systemctl start httpd.service
部署svnserve訪(fǎng)問(wèn)SVN
步驟一:安裝SVN
遠(yuǎn)程連接安裝SVN的Linux實(shí)例。
具體操作,請(qǐng)參見(jiàn)通過(guò)密碼或密鑰認(rèn)證登錄Linux實(shí)例。
運(yùn)行以下命令,安裝SVN。
sudo yum install -y subversion
運(yùn)行以下命令,查看SVN版本。
svnserve --version
當(dāng)回顯類(lèi)似如下所示時(shí),說(shuō)明SVN已安裝。
步驟二:配置SVN
依次運(yùn)行以下命令,創(chuàng)建SVN版本庫(kù)。
sudo mkdir /var/svn cd /var/svn sudo svnadmin create /var/svn/svnrepos
依次運(yùn)行以下命令,查看自動(dòng)生成的版本庫(kù)文件。
cd svnrepos ls
Subversion目錄說(shuō)明如下表:
目錄
說(shuō)明
db
存放所有的版本控制數(shù)據(jù)文件。
hooks
放置hook腳本文件。
locks
用來(lái)追蹤存取文件庫(kù)的客戶(hù)端。
format
一個(gè)文本文件,文件中只包含一個(gè)整數(shù),表示當(dāng)前文件庫(kù)配置的版本號(hào)。
conf
SVN版本庫(kù)的配置文件(版本庫(kù)的訪(fǎng)問(wèn)賬號(hào)、權(quán)限等)。
設(shè)置SVN版本庫(kù)的賬號(hào)和密碼。
運(yùn)行以下命令,打開(kāi)用戶(hù)配置文件。
cd conf/ sudo vim passwd
按
i
鍵進(jìn)入編輯模式。移動(dòng)光標(biāo)至
[users]
下,添加用戶(hù)賬號(hào)和密碼。說(shuō)明添加賬號(hào)和密碼的格式為:賬號(hào) = 密碼。例如,userTest(賬號(hào)) = passWDTest(密碼),如下圖所示(注意等號(hào)兩端要有一個(gè)空格)。
按
Esc
鍵退出編輯模式,并輸入:wq
保存并退出。
設(shè)置賬號(hào)的讀寫(xiě)權(quán)限。
運(yùn)行以下命令,打開(kāi)權(quán)限控制文件。
sudo vim authz
按
i
鍵進(jìn)入編輯模式。移動(dòng)光標(biāo)至文件末尾,并添加如下代碼(其中,userTest表示賬號(hào),r表示讀權(quán)限,w表示寫(xiě)權(quán)限)。
[/] userTest=rw
按
Esc
鍵后,輸入:wq
保存并退出文件。
修改SVN服務(wù)配置。
運(yùn)行以下命令,打開(kāi)SVN服務(wù)配置文件。
sudo vim svnserve.conf
按
i
鍵進(jìn)入編輯模式。移動(dòng)光標(biāo)找到如下配置行,刪除行前面的注釋符#和空格。
說(shuō)明每行不能以空格開(kāi)始,且等號(hào)兩端要有一個(gè)空格。
anon-access = read auth-access = write password-db = passwd authz-db = authz realm = /var/svn/svnrepos
按
Esc
鍵后,輸入:wq
保存并退出文件。
運(yùn)行以下命令,啟動(dòng)SVN版本庫(kù)。
本文示例中,啟動(dòng)命令直接指定到版本庫(kù)。
sudo svnserve -d -r /var/svn/svnrepos/
說(shuō)明運(yùn)行
killall svnserve
命令可停止SVN服務(wù)。運(yùn)行命令,查看SVN服務(wù)是否開(kāi)啟。
ps -ef |grep svn
返回下圖所示信息時(shí),表示SVN服務(wù)已經(jīng)開(kāi)啟。
使用SVN
使用SVN管理代碼的常見(jiàn)流程為:
Checkout(您提取源代碼到本地)。
其他人修改并提交源代碼到Repository。
Update(您獲得最新的代碼)。
您修改并調(diào)試成功源代碼。
Commit(提交修改后的代碼到Repository,其他程序員即可看到您的修改)。
提取源代碼到本地(Checkout)
在本地Windows環(huán)境中下載并安裝TortoiseSVN客戶(hù)端。
在本地項(xiàng)目文件夾內(nèi)的空白區(qū)域單擊鼠標(biāo)右鍵。
本示例中,項(xiàng)目文件夾為
C:\Test
。在彈出菜單中,選擇SVN Checkout...。
填寫(xiě)如下信息后,單擊OK。
URL of repository:版本庫(kù)URL,源代碼統(tǒng)一存放的地址。
HTTP訪(fǎng)問(wèn)模式:URL格式為
http://<ECS實(shí)例公網(wǎng)IP>/svn/<SVN版本庫(kù)名>
。svnserve訪(fǎng)問(wèn)模式:URL格式為
svn://實(shí)例公網(wǎng)IP地址/
。說(shuō)明當(dāng)在版本庫(kù)的上層目錄啟動(dòng)SVN服務(wù)時(shí),SVN檢出的URL要對(duì)應(yīng)加上版本庫(kù)的名稱(chēng)。
Checkout directory:檢出到本地的目錄,本文示例中,目錄為
C:\Test
。
說(shuō)明第一次登錄需要輸入賬號(hào)和密碼,即您在passwd文件中設(shè)置的用戶(hù)名和密碼。
檢出完成示例如下。
獲取更新(Update)
SVN服務(wù)端系統(tǒng)庫(kù)上的項(xiàng)目更新后,您可在本地項(xiàng)目文件空白處單擊右鍵,選擇SVN Update,即可自動(dòng)完成下載最新項(xiàng)目,并會(huì)顯示所有更新內(nèi)容。
在原項(xiàng)目文件夾內(nèi)選擇SVN更新,會(huì)自動(dòng)覆蓋原有內(nèi)容。建議您先備份,再更新,防止自己原有的項(xiàng)目?jī)?nèi)容丟失。
提交修改(Commit)
完成以下操作,提交本地修改到服務(wù)端系統(tǒng)庫(kù)中。
在項(xiàng)目文件空白處單擊右鍵,選擇SVN Commit...。
輸入本次提交的版本更新信息(所做修改的注釋?zhuān)x中要提交的操作內(nèi)容,單擊OK。
即可將本地項(xiàng)目提交到SVN服務(wù)器資源庫(kù),覆蓋資源庫(kù)項(xiàng)目從而實(shí)現(xiàn)更新。
說(shuō)明如果發(fā)生提交沖突,即兩人都提交修改,后提交者由于版本落后會(huì)提交失敗。這時(shí),您可以先備份自己的項(xiàng)目,然后從服務(wù)端下載最新的項(xiàng)目,并將自己的項(xiàng)目覆蓋到本地項(xiàng)目文件夾,再單擊SVN提交即可成功提交。
若您提交的項(xiàng)目中刪除了某個(gè)文件,則會(huì)顯示如下圖所示的信息。
還原文件
完成以下操作,還原SVN中被刪除的文件。
打開(kāi)本地項(xiàng)目文件夾,右鍵單擊選擇SVN Checkout...來(lái)檢出數(shù)據(jù)。
刪除其中一個(gè)文件。
根據(jù)您是否已提交修改選擇相應(yīng)的操作:
未提交時(shí),右鍵單擊空白處,選擇
。已提交時(shí),服務(wù)端系統(tǒng)庫(kù)中數(shù)據(jù)已得到同步,系統(tǒng)也會(huì)將其保存的數(shù)據(jù)刪除。此時(shí),您需要采取以下方法還原數(shù)據(jù):
右鍵單擊空白處,選擇
查看操作日志。在日志中,單擊刪除的日志行,下方會(huì)顯示已刪除的數(shù)據(jù)。
右鍵單擊已刪除的數(shù)據(jù),然后單擊Save revision to...。
在保存對(duì)話(huà)框,設(shè)置文件名,單擊保存(S),將已刪除的文件保存版本至刪除前的位置。
打開(kāi)原文件夾,單擊SVN Commit...,即可同步文件和系統(tǒng)庫(kù)中的數(shù)據(jù)。
常見(jiàn)問(wèn)題
為什么使用TortoiseSVN訪(fǎng)問(wèn)SVN服務(wù)器時(shí)服務(wù)連接,提示“主機(jī)沒(méi)有反應(yīng)”?
出現(xiàn)“主機(jī)沒(méi)有反應(yīng)”可能有以下原因:
SVN服務(wù)器未啟動(dòng)
安全組中未開(kāi)放SVN服務(wù)器所需端口
ECS實(shí)例開(kāi)啟了firewalld防火墻,但是未放行SVN服務(wù)器所需的端口
您可以按照以下步驟排查:
查看SVN服務(wù)狀態(tài)。
ps -ef |grep svn
返回下圖所示信息時(shí),表示SVN服務(wù)已經(jīng)開(kāi)啟。如果未返回以下信息,請(qǐng)執(zhí)行
sudo svnserve -d -r /var/svn/svnrepos/
啟動(dòng)SVN服務(wù)。查看ECS實(shí)例所在安全組規(guī)則是否滿(mǎn)足SVN服務(wù)器要求。
HTTP模式:開(kāi)放22、80、443
svnserve模式:開(kāi)放22、80、443、3690
查看firewalld防火墻
查看firewalld防火墻狀態(tài)。
sudo firewall-cmd --state
回顯信息為
not running
說(shuō)明firewalld防火墻未開(kāi)啟,對(duì)SVN服務(wù)器無(wú)影響。回顯信息為
running
說(shuō)明firewalld防火墻已開(kāi)啟,請(qǐng)繼續(xù)執(zhí)行下一步驟。
在firewalld規(guī)則中放行SVN服務(wù)器所需端口(例如3690)。
sudo firewall-cmd --add-port=3690/tcp --per
重新加載
firewalld
服務(wù)配置,使配置生效。sudo systemctl reload firewalld