怎樣使用Docker鏡像搭建SVN的容器服務

一、簡述

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倉庫搭建,編好腳本後,可以使用一條命令即可完成以上覆雜的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章