需求場景
A commit B post-commit C
(workstation) --------------> (svn server) ---------------------> (major site)
(開發機) (線上站點)
開發機為A,有svn服務器B,以及線上站點所在服務器C。因為B硬盤不夠等原因導致線上網站放在C上,不和svn服務器放在同一臺機器B上。
現在,希望開發機A執行commit代碼后,svn服務器B上自動同步代碼到C服務器,使得線上網站自動更新。
我的方案
大體思路是用post-commit腳本,具體細節上有點麻煩,包括:
編寫expect腳本->編寫post-commit腳本->配置apache賬戶ssh-key->測試
下面是具體步驟
編寫expect腳本
最先嘗試用svn update root@xxx.xxx.xxx.xxx:/folder_name,但是命令不執行。考慮先ssh到C服務器,然后執行svn update。因為可以用ssh key,所以感覺不用密碼登錄C服務器,并執行后續操作,寫到腳本中應該能行,做到自動化操作。
但是bash腳本中編寫了ssh登錄和svn update更新腳本,發現ssh登錄后就不執行后續命令了。
發現expect這個解釋器還是挺好用的,它是一種能夠按照腳本內容里面設定的方式與交互式程序進行“會話”的程序。不多說,直接編寫需要的腳本:
/var/svnroot/test/hooks/test.exp:
#!/usr/bin/expect -f
spawn ssh root@xxx.xxx.xxx.xxx #換成你的服務器ip或域名
expect "~"
send "svn update ~/workspace/test >> /tmp/svn_test_update.log 2>&1\r" #換成你的本地repo路徑,記得先checkout過才行。日志文件名可修改。
send "exit\r"
expect eof
修改權限:
chown apache:apache test.exp
chown +x test.ext
編寫post-commit腳本
就是去執行剛才的test.exp文件:
/var/svnroot/test/hooks/post-commit:
REPOS="$1"
REV="$2"
expect /var/svnroot/test/hooks/test.exp >> /tmp/svn_test_expect.log 2>&1 #/var/svnroot/test是svn服務器上repo的地址
修改權限:
chown apache:apache post-commit
chown +x post-commit
配置apache賬戶ssh-key
post-commit腳本是被apache用戶執行的,那么腳本中ssh登錄語句執行時,會查找/var/www/.ssh路徑下的rsa密鑰,那么現在來生成它。
創建.ssh目錄
mkdir -p /var/www/.ssh
chown -R apache:apache /var/www/.ssh
修改apache賬戶為可登錄:
vipw
#或者 vim /etc/passwd
找到apache所在行,修改最后面的/sbin/nologin為/bin/bash
用apache賬號登錄,生成ssh-key:
su apache
cd /var/www/
ssh-keygen
#然后各種回車
cat .ssh/id_rsa.pub
#用鼠標復制rsa公鑰,并粘貼到服務器root目錄下的.ssh/authorized_keys文件中(追加方式)
exit #退出apache賬戶
測試
測試用apache賬戶用ssh登錄
ssh root@xxx.xxx.xxx.xxx
#按提示輸入yes
這一步是必須的。因為初次用ssh登錄,會提示驗證同意,選擇yes后,以后就不出這個提示了,就能正常執行post-commit腳本了。
好了,大概就是這個樣子,希望對你有幫助。
文章列表