背景狀況:SVN與WEB不在同一臺服務器上,須要SVN提交後WEB站點自動進行SVN UPDATE更新,查閱網上的教程,發現部分的細節和權限部分沒有提到致使跨服務器ssh執行更新腳本失敗,手動執行post-commit能夠經過html
需求:開發想要在項目修改並提交到svn服務器上後,web服務器可以自動進行svn update更新站點,並當即看到修改後的web頁面效果nginx
思路:項目提交時觸發post-commit裏面的腳本並寫入到/var/log/svn.log中,腳本經過SSH免密登錄到WEB上而後再進行svn up.sh的腳本觸發web站點更新
web
配置:SVN服務器一臺(172.17.8.8) WEB測試服務器一臺(172.17.8.9) 兩臺服務器均爲CentOS7.4(1708)shell
SVN項目版本環境在/svn/project(目錄中含有db hook等文件) WEB的網站路徑爲/var/www/html/project下
apache
須要安裝的軟件:兩臺服務器均須要安裝Apache軟件(web服務器nginx也能夠)和SVN軟件,個人web測試環境爲lampvim
兩臺服務器均安裝apache(httpd)、SVN(subversion),SVN服務器須要安裝svn和apache的集成模塊(mod_dav_svn),安裝方式爲yum install httpd subversion mod_dav_svn
bash
在此不詳細敘述SVN帳號和密碼以及權限的調試,只說post-commit、腳本、權限、以及log的寫法和設置
服務器
1.兩臺服務器各創建系統帳戶爲svn的用戶名(useradd svn),並給svn用戶設置密碼(passwd svn) 注意:此步驟兩臺服務器都要作相同的操做
ssh
2.登錄SVN服務器作ssh免密碼登錄web服務器的操做:ide
(1)在SVN服務器下,使用su - svn(要帶-,說明環境變量也切換到svn下面) ,切換到svn用戶上,執行ssh-keygen -t rsa,一路回車執行,成功的話會生成SHA256的密鑰文件
(2)將svn用戶下的密鑰文件拷貝至web服務器下的svn用戶ssh目錄:ssh-copy-id -i /home/svn/.ssh/id_rsa.pub svn@172.17.8.9,輸入密碼後提示覆製成功
(3)使用ssh登錄到web服務器:ssh svn@172.17.8.9,輸入一次密碼後,嘗試再次執行該命令,確認可以免密登錄後便可。
3.將apache的啓動進程用戶修改爲svn
vim /etc/httpd/conf/httpd.conf
找到User和Group(大約66 67行左右)將apache改成svn,:wq保存退出
將全部的svn目錄下的權限修改爲svn用戶,使用-R遞歸方式
chown -R svn:svn /svn
4.進入項目目錄,編寫post-commit腳本並賦予其執行權限
vim /svn/project/hooks/post-commit
腳本以下:
#!/bin/sh
REPOS="$1"
REV="$2"
LOGFILE=/var/log/svn.log ##這裏是爲了保存日誌並查看是否有報錯,有報錯說明執行了未成功,沒報錯說明未執行成功,檢查權限,執行成功會有svn update信息
exec 1>>"$LOGFILE"
exec 2>&1
export.UTF-8
/usr/bin/ssh -l svn 172.17.8.9 "/bin/bash /shell/svnup.sh"
exit 0
保存退出
賦予post-commit可執行權限
chmod 777 /svn/project/hooks/post-commit
5.建立腳本日誌並賦予svn權限
touch /var/log/svn.log
chmod 777 /var/log/svn.log
chown svn:svn /var/log/svn.log
6.修改完畢後重啓Apache服務器使其生效
systemctl restart httpd.service
至此SVN服務器配置完畢
################################
WEB服務器配置:
1.做者自己建立了一個管理腳本的文件夾
mkdir /shell/
編寫腳本
vim /shell/svnup.sh
腳本內容
#!/bin/bash
/usr/bin/svn update /var/www/html/project/
:wq保存退出
2.賦予可執行及最大權限
chmod 777 /shell/svnup.sh
3.將站點的屬主屬組改成svn用戶,並將站點設置爲777權限
chown -R svn:svn /var/www/html/project
chmod -R 777 /var/www/html/project
4.切換至svn用戶並從svn服務器上拉取網站文件(很是關鍵的一步,必須使用svn帳戶來操做,使用root用戶操做會失敗)
切換至svn用戶 su - svn
檢出網站文件至網站目錄 svn checkout http://172.17.8.8/svn/project /var/www/html/project --username taoye
輸入用戶的密碼
至此,全部網站都以svn用戶身份拉取到網站目錄下
#############################################
操做完成後,嘗試svn提交文件看是否在提交時可以觸發post-commit文件,若是觸發時有錯誤提示,有多是權限和屬主屬組不對,要麼就是post-commit中的腳本開頭不是以#!/bin.sh開頭的
若是在提交的時候沒有出現問題,那麼能夠查看一下SVN服務器上的/var/log/svn.log文件中查看是哪裏出現問題
若是提示/usr/share/httpd等提示,說明你的apache不是以svn用戶啓動的,或者你的svn項目權限和屬主屬組沒有變成svn用戶
若是提示ssh認證錯誤等信息,說明web服務器在svn checkout的時候不是以svn用戶進行的,或者是在兩臺機器作免密登錄的時候用戶使用不正確,切換到svn用戶進行操做
切記,WEB服務器在svn checkout的時候,用戶必須以svn用戶來進行!!!