一、簡述
1.基礎環境
- Debian GNU/Linux 9.9 (stretch)
- Docker version 19.03.4
實際上,使用其他Linux發行版本也是一樣的,我在操作的時候使用阿里雲的Debian 9.9服務器。關於什麼是SVN,這裏不會累贅說明,此處只是給大家演示如何基於第三方鏡像搭建SVN服務
2.開啓簡單的容器實例
本次安裝我們不寫Dockerfile來構建鏡像,直接使用Dockerhub上比較熱門的一個鏡像:elleflorio/svn-server,詳細內容可以參考此鏈接:https://hub.docker.com/r/elleflorio/svn-server
使用以下命令創建一個簡單的svn服務
docker run -d --name svn-server -p 3690:3690 elleflorio/svn-server
你還可以選擇性的把本地目錄映射到容器的svn倉庫目錄,如下參數
-v <hostpath>:/home/svn
二、實際操作過程
假設:現在有這樣的需要,開發一個PHP項目,在服務器創建一個base代碼倉庫,所有開發人員可以從服務器把代碼pull到PC進行開發,再上傳到服務器進行自動部署。下面我們基於Docker完成這個過程。
1.下載鏡像,創建容器
# 下載鏡像
docker pull elleflorio/svn-server
# 創建svn倉庫目錄,進入svn倉庫目錄
mkdir -p /var/svn
# 創建svn服務容器,把容器中的svn倉庫映射到本機,並映射3690端口
docker run -d --name svn-server -p 3690:3690 -v "$PWD":/home/svn -v /var/www/html:/var/www/html elleflorio/svn-server
在以上示例代碼中,爲了能在svn容器中管理本機的項目目錄,假設本機的項目目錄是/var/www/html,除了映射SVN倉庫目錄,我們同時把本機的/var/www/html映射到svn容器中的/var/www/html目錄。
2.在服務器創建代碼倉庫
# 創建代碼倉庫
docker exec -t svn-server svnadmin create /home/svn/test
以上代碼中,在容器中的/home/svn/test目錄創建代碼倉庫,會同步到本機的/var/svn目錄。我們先進行svn倉庫配置。
SVN庫中的配置目錄 conf 有三個文件:
- authz 是權限控制文件
- passwd 是帳號密碼文件
- svnserve.conf 是SVN服務綜合配置文件
配置權限配置文件 authz
編輯 authz ,內容參考如下:
示例代碼:/var/svn/test/conf/authz
[groups]
#用戶組
admin = master,master
#用戶組所對應的目錄
[/]
#庫目錄權限
@admin = rw
#用戶組權限
*=r
配置賬號密碼文件 passwd
編輯 passwd ,內容參考如下:
示例代碼:/var/svn/test/conf/passwd
[users]
# harry = harryssecret
# sally = sallyssecret
master = master
admin = admin
配置 SVN 服務綜合配置文件 svnserve.conf
編輯 svnserve.conf ,內容參考如下:
示例代碼:/var/svn/test/conf/svnserve.conf
[general]
# force-username-case = none
# 匿名訪問的權限 可以是read、write,none,默認爲read
anon-access = none
#使授權用戶有寫權限
auth-access = write
#密碼數據庫的路徑
password-db = passwd
#訪問控制文件
authz-db = authz
#認證命名空間,SVN會在認證提示裏顯示,並且作爲憑證緩存的關鍵字
realm = /var/svn/test
[sasl]
完成以上配置之後,我們要做的是服務器代碼與本地代碼同步,如下圖所示:
下面,我們將本機電腦代碼推送到SVN倉庫後,服務器又將代碼同步到項目目錄。
3.同步代碼到服務器項目目錄
(1)在PC上將代碼上傳到svn倉庫(PC上必須安裝SVN)
# 將倉庫中的代碼pull到本地,下面的123.123.123.123代表的是服務器IP地址,以下過程可能會需要輸入svn賬號和密碼
svn checkout svn://123.123.123.123/test
# 進入代碼目錄
cd test
# 創建示例文件
echo "hello" >> test.txt
# 提交代碼到SVN倉庫
svn add test.txt
svn commit test.txt -m 'test'
(2)服務器同步代碼
# 將代碼同步到項目目錄
docker exec -t svn-server svn checkout svn://127.0.0.1/test /var/www/html/test --username master --password master --force --no-auth-cache
(3)自動同步代碼
實際上,如果我們用於開發的PC每一次向服務器提交一次代碼,服務器都需要手動執行一下同步命令,本地代碼纔會同步到服務器的項目目錄。想必很麻煩,於是我們可以使用SVN提供的鉤子去實現代碼自動更新。
# 進入鉤子配置文件目錄
cd /var/svn/test/hooks
# 複製鉤子文件
cp post-commit.tmpl post-commit
我們將post-commit.tmpl鉤子文件的後綴名去掉即可生效,於是我們複製一份。接下來我們編輯post-commit文件,註釋掉髮送郵件的代碼。然後在下面加上兩行代碼即可,如下:
REPOS="$1"
REV="$2"
TXN_NAME="$3"
#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
# 設置編碼
export LANG="en_US.UTF-8"
# 更新代碼到項目目錄
svn update --username master --password master /var/www/html/test
編輯完成配置文件之後,我們只需要保存即可,自動生效。此時在PC上修改項目內容,再次提交到代碼倉庫,服務器會自動同步到服務器的項目目錄。不再需要手動執行svn checkout指令
三、總結
本次主要演示了SVN服務器的搭建過程中的一些基本流程。爲了減少服務器相關軟件庫的依賴,我們使用第三方Docker鏡像來構建SVN容器服務。實際上和我們直接在操作系統上手動編譯安裝,或者從軟件庫安裝的效果一樣。而容器更好的減少服務器相關依賴,也更好地隔離操作系統的環境。如果我們不需要SVN服務了,直接將對應容器移除即可。
實際上,如果我們每次創建一個SVN倉庫,都要進行一大堆配置,是一件比較浪費時間的事。開發者也不應該把過多的時間與精力去“重複造輪子”,而應該把更多的時間和精力去思考更有價值的事物!限於篇幅,本次教程結束。下一節將演示如何使用Shell腳本快速地完成SVN倉庫搭建,編好腳本後,可以使用一條命令即可完成以上覆雜的內容。