測試伺服器 SVN 生產環境,通過 post-commit 鉤子呼叫 Git 自動備份
阿新 • • 發佈:2019-02-04
折騰一個晚上,令人窒息的操作誕生了!
伺服器:阿里雲 ECS
VCS:SVN
埠的開放是必不可少的,配置安全組內的規則即可
在此之前我僅會通過配置鉤子在提交程式碼時自動部署/釋出到 Web 環境中
保險起見,為了更好的儲存程式碼,就突發奇想的弄了一個這玩意兒
開發人員 => SVN 提交程式碼到伺服器 => 鉤子自動部署 Web => Git 提交併推送到碼雲
簡直是完美的操作…
結果踩坑無數
首先搭建好 SVN 環境,這沒什麼難的(CentOS 7) yum install subversion
也就是那幾個檔案 passwd
、authz
、svnserv.conf
完成後碼雲新建 Git 專案(空的最好),接著在你的 Web 目錄中 clone
一下
注意:如果此時在伺服器上已經部署程式碼並開啟 SVN 版本控制,需要在專案 Web 目錄中執行 git init
和 git 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
即可儲存