實作 Subversion 檔案庫自動備份機制
趁著在整理公司各專案的原始文件與程式碼的機會,將
Subversion 的備份機制 中所提到的想法化為實際可行的方案,目前實作備份到 EMAIL 帳號的部份。
※ 2007-06-04 更新:新增 svnBackup.sh 中每月一日完整備份 svn 檔案庫功能。
前置準備
簡單說明個人在 Subversion 上的環境設定,基本上就是前文
試用 Subversion 中所提到的多檔案庫設定,由 svn 這個用戶負責執行 svnserve 並管理所有的檔案庫與相關的維護/備份作業。個人伺服器上設定的目錄列表大概長的像這樣,預定建立兩個分類的檔案庫:docs/ 及 projects/ 分別儲放文件類及專案類資料:
svn@www ~ $ tree /home/svn -L 2 -F --dirsfirst
/home/svn
|-- docs/ # 儲放 docs/ 類的檔案庫
| `-- resume/ # 這是個人的 resume ,還沒寫!
|-- projects/ # 預定儲放 projects/ 類的檔案庫
|-- authz # svn 權限設定對照表,所有檔案庫都會參照此檔
|-- initRepos.sh* # 備份機制所提供的檔案庫初始化工具
|-- passwd # svn 帳號/密碼設定檔,所有檔案庫都會參照此檔
`-- svnserve.conf # svnserve 的設定檔,所有檔案庫都會參照此檔
3 directories, 4 files
初始化檔案庫
檔案庫的初始化可以直接使用 svnadmin create 去建立,但是為了順便完成 hooks 的設定所以這裡提供了一個自動化作業的命令稿:initRepos.sh ,它的執行方式如下列所示,其中 repoPath 指的是檔案庫的實際目錄位址;authorization 則是要寫到 authz 檔中的權限設定項目,可以不提供,也可以提供多個。特別注意的是若 authz 中已經存在指定檔案庫的設定時,則 authorization 設定部份將全數予以忽略。
svn@www ~ $ ./initRepos.sh
Usage:
initRepo.sh repoPath [authorization] [authorization] ...
repoPath: the path for your repository.
[authorization]: optional, the line write into authz file.
ex:
$ ./initRepo.sh ~/projects/myProject
will create a repo at ~/projects/myProject
範例:建立 projects/scripts 檔案庫
projects/scripts 計劃用來保存曾寫過的 bash scripts 使用的檔案庫,其他為了系統管理或其他原因所寫的 scripts 或其他源碼也會納入對應的檔案庫中加以控管。
svn@www ~ $ ./initRepos.sh projects/scripts "ada = rw"
/home/svn/svnBackup.sh had been created, and you must change your
'$RCV_EMAIL' value and execute it automatically via crontab.
前述動作的意思說明如下:
建立的檔案庫位於現行目錄下的 projects/scripts 中;
在 authz 中寫入對檔案庫 projects/scripts 的存取權限 "ada = rw",參見 tail -n 5 authz 輸出結果;
執行訊息顯示一個檔案 /home/svn/svnBackup.sh 被建立了,提醒執行者記得修改 $RCV_EMAIL 的值還有記得放到 crontab 中自動執行以確保可以將備份檔寄到指定 EMAIL 信箱去。
如果重覆執行同一命令時,初始指令稿會顯示該檔案庫已存在而終止執行。
svn@www ~ $ tail -n 5 authz
[docs/resume:/]
ada = rw
[projects/scripts:/]
ada = rw
重覆執行檔案庫初始化作業時之輸出結果
svn@www ~ $ ./initRepos.sh projects/scripts "ada = rw"
Sorry, target repository was existed, script will be terminated.
Here is projects/scripts contained:
總計 8
drwxr-sr-x 7 svn svn 224 2007-01-22 15:30 .
drwxrwsr-x 3 svn svn 72 2007-01-22 15:30 ..
drwxr-sr-x 2 svn svn 80 2007-01-22 15:30 conf
drwxr-sr-x 2 svn svn 48 2007-01-22 15:30 dav
drwxr-sr-x 5 svn svn 256 2007-01-22 15:30 db
-r--r--r-- 1 svn svn 2 2007-01-22 15:30 format
drwxr-sr-x 2 svn svn 392 2007-01-22 15:30 hooks
drwxr-sr-x 2 svn svn 104 2007-01-22 15:30 locks
-rw-r--r-- 1 svn svn 229 2007-01-22 15:30 README.txt
匯入檔案庫
將 projects/scripts 第一支程式匯進去
ada@www ~/scripts $ svn import . svn://localhost/projects/scripts -m "匯入 scripts 檔案庫"
新增 initRepos.sh
送交修訂版 1.
檢查異動記錄檔是否正確建立
當有 commit 事件發生時,hooks/ 內的 post-commit 會被執行,該指令稿會將 commit 的程式庫名稱及修訂版次資料寫入 ~/commit.log/commit-YYYYMMDD (多檔案庫併存時亦同)檔案中:
svn@www ~ $ ls commit.log/
commit-20070122
svn@www ~ $ cat commit.log/commit-20070122
projects/scripts 1
svn@www ~ $
發現一些小問題而做了修改,最後記錄如下:
Subversion 檔案庫狀況
ada@www ~ $ svn info svn://localhost/projects/scripts
路徑: scripts
URL: svn://localhost/projects/scripts
檔案庫根目錄: svn://localhost/projects/scripts
檔案庫 UUID: 9caff80a-9c27-0410-8ed1-a6eee95ea654
修訂版: 4
節點種類: 目錄
最後更新作者: ada
最後修改修訂版: 4
最後修改日期: 2007-01-22 16:42:08 +0800 (一, 22 1月 2007)
ada@www ~ $
svn@www ~ $ cat commit.log/commit-20070122
projects/scripts 1
projects/scripts 2
projects/scripts 3
projects/scripts 4
svn@www ~ $
驗證至此可以確定任何 commit 進 Subversion 檔案庫的動作都可以被記錄了。如果原先已建立的檔案庫的話,可在透過 initRepos.sh 建立的檔案庫下的 hooks/ 目錄中取得自動記錄異動狀態的 post-commit 命令稿,放入原檔案庫下 hooks/ 中即可。
驗證自動寄送 EMAIL 備份程序
※ 請先安裝 mpack MIME 寄信工具
建立檔案庫時有提過 initRepos.sh 要求修改 svnBackup.sh 內的 RCV_EMAIL 變數資料以便將備份檔案進行郵件投遞。為確保放入 crontab 後可以正常運行,此處可先進行測試。
修改 svnBackup.sh 內容
RCV_EMAIL 變數:如果是寄給 gmail.com 時,會被改成虛擬信箱方式寄出。如前述檔案庫寄給 mysvn@gmail.com 時會變成 mysvn+projects.scripts@gmail.com 。
YESTERDAY 變數:本來這個變數是自動計算出來的,不過我們可以另外指定成今天的日期 20070122 以便進行測試。
執行 svnBackup.sh 測試,一切正常的話會在指定的 EMAIL 信箱中收到異動備份檔。
測試完畢後記得把行指定的 YESTERDAY 變數拿掉以免總是收到同一天的異動備份檔。
svn@www ~ $ ./svnBackup.sh
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
projects.scripts.dump.r1-r4
svn@www ~ $
※收到的異動備份信件,可以透過 Filter 自動將檔案歸類封存。
下載
請直接下載
initRepos.sh
其他
那個顯示目錄結構的好東西叫做 tree ,請多多愛用!
想要多做其他備份的可以修改 svnBackup.sh 檔。
GMAIL 果然是檔案備份的居家良伴啊!