SVN 版本控制,通過 post-commit 鉤子調用 Git 自動備份

折騰一個晚上,令人窒息的操作誕生了!

服務器:阿里雲 ECS
VCS:SVN

端口的開放是必不可少的,配置安全組內的規則即可

在此之前我僅會通過配置鉤子在提交代碼時自動部署/發佈到 Web 環境中

保險起見,爲了更好的存儲代碼,就突發奇想的弄了一個這玩意兒

開發人員 => SVN 提交代碼到服務器 => 鉤子自動部署 Web => Git 提交併推送到碼雲

簡直是完美的操作…

結果踩坑無數


首先搭建好 SVN 環境,這沒什麼難的(CentOS 7) yum install subversion

也就是那幾個文件 passwdauthzsvnserv.conf 的配置,百度瞭解一下。弄完記得設置個自啓妥妥的

完成後碼雲新建 Git 項目(空的最好),接着在你的 Web 目錄中 clone 一下

注意:如果此時在服務器上已經部署代碼並開啓 SVN 版本控制,需要在項目 Web 目錄中執行 git initgit remote add origin Git地址

然後什麼也不用做【所以空項目最好嘛】

SVN 的文件屬性忽略調整一下,Git 的 .gitignore 配置好

服務器端各自提交/推送一手讓 SVN/Git 代碼同步。

好,擼鉤子,戳開版本庫 hooks 目錄,post-commit.tmpl 複製一份爲 post-commit 並賦予其執行權限,chmod +x post-commit

打開此文件,除開註釋內容是這樣:

REPOS="$1"
REV="$2"
TXN_NAME="$3"

mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

開始改造,刪除最後一行並添加代碼如下:

REPOS="$1" # 版本庫路徑
REV="$2" # 提交的修訂號
TXN_NAME="$3" # 事務名稱

PROJECT_DIR1="/var/www/wwwroot/xxx.com" # 項目目錄自行調整,之所以寫了個 1 怕有多個項目需要如此操作
export LANG=zh_CN.UTF-8 # Emm,編碼
CURDATE=`date` # 取一下當前時間
echo "自動部署:$CURDATE,庫:$REPOS,版本:$REV,事務號:$TXN_NAME" >> /var/log/svn/code_deploy.log # 手動寫日誌,注意目錄需要自己創建

# 這兒是重點,我將命令提出來了,因爲註釋說最好是提出來,當然寫在這個文件裏也沒毛病

# 之所以用到了 root,因爲...我之前的 Git 配置都是用 root 用戶配置的
# 所以必須要切換至 root 用戶,不然提示你沒有配置郵箱、名稱、保存密碼方式等等,導致無法提交/推送到碼雲

# 這兒我們可以看到我直接調用了 /opt 目錄下的 post-git.sh 腳本
su - root -s /bin/bash /opt/post-git.sh

post-git.sh 內容:

#!/bin/sh

PROJECT_DIR1="/var/www/wwwroot/xxx.com" # 同上
export LANG=zh_CN.UTF-8 # 同上

svn update $PROJECT_DIR1 --quiet --username SVN用戶名 --password SVN密碼
# 注意這兒連着三行我都寫了輸出,s.log 是成功輸出(有 2 別看漏了),f.log 是失敗輸出。測試通過後可以刪掉
# 如果調試自動 Git 備份代碼未成功,通過這裏的日誌可以很方便的查閱到

# 移動到項目目錄
cd $PROJECT_DIR1 >> /var/log/svn/s.log 2>> /var/log/svn/f.log
# 不用 git add . 了,直接 git commit -a,寫一句備註就行
git commit -am '生產環境代碼同步/備份' >> /var/log/svn/s.log 2>> /var/log/svn/f.log
# 推送走你
git push >> /var/log/svn/s.log 2>> /var/log/svn/f.log
修改 SVN 用戶、鉤子等信息不用重啓 SVN 服務端
所以,直接測試吧

客戶端 svn checkout 一份代碼出來,隨便改個東西提交試試!


PS:如果 Git 一直需要輸入用戶和密碼,戳一下這個 git config --global credential.helper store 即可存儲

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