1. 程式人生 > >測試伺服器 SVN 生產環境,通過 post-commit 鉤子呼叫 Git 自動備份

測試伺服器 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 即可儲存