折騰一個晚上,令人窒息的操作誕生了!
服務器:阿里雲 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
即可存儲