文章出處

需求場景

      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腳本了。

好了,大概就是這個樣子,希望對你有幫助。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()