SVN跨服務器自動更新--實現文件分發

目標:SVN版本庫提交,服務器中的工做拷貝能自動update。php

實現方法:subversion, curl,php腳本實現,而且入mysql庫來進行管理。改hosts文件來進行訪問!提交觸發鉤子腳本時調用 curl 訪問內網php腳本,內網內svn更新html

基本思路:默認狀況下,版本庫的hooks子目錄中包含各類版本庫鉤子模板。以下圖:mysql

鉤子是經過版本庫事件觸發,例如新版本的建立或一個未版本化屬性的修改。一些鉤子(「pre hooks」)在事件發生前運行,能夠用來報告發生了什麼以及防止它發生。還有一些鉤子(「post hooks」)在版本庫事件以後發生,只是用來報告。這裏咱們要用post-commit鉤子,在版本庫提交事件發生後,更新服務器的工做拷貝。linux


深刻了解hooks:對每種鉤子的都有一個模板,經過查看這些腳本的內容,咱們能看到是什麼事件觸發了腳本及如何給傳遞數據。要實際安裝一個可用的鉤子,咱們須要在repos/hooks目錄下安裝一些與鉤子同名(如 start-commit或者post-commit)的可執行程序或腳本。例如,在linux下,咱們須要複製模板,去掉後綴名 .tmpl,自定義鉤子的內容,並使之成爲一個可執行地腳本;Windows用文件的擴展名來決定一個程序是否可運行,因此咱們要使程序的基本名與鉤子同名,同時,它的擴展名是Windows系統所能辨認的,例如exe、com和批處理的bat。web


如何使用hooks:在版本庫hooks目錄下新建文件 post-commit 並輸入以下內容保存:sql

#!/bin/sh
export LANG=en_US.UTF-8
# 以www身份更新svn
su - www -c "svn up  /home/www/zmqnw_mobile --accept theirs-full"

curl -s http://192.168.1.60/distribute?project=zmqnw_mobile

碰到問題:實際狀況是,SVN服務端和須要自動更新的測試環境不在同一臺服務器。svn update 命令沒法觸發遠程服務器的更新。apache


解決方案:思路——在鉤子裏向測試服務器發送HTTP請求,測試服務器收到請求後,經過php的system函數本地調用svn up 命令,實現測試服務器的工做拷貝的更新。兩件事情:服務器

1.測試服務器安裝 linux版svn客戶端(下載地址,),在web根目錄下新建svnupdate.php文件。代碼以下:curl

<?phpsvn

empty($_GET['path']) && die('miss params');

$paramArr = explode('|||', $_GET['path']);

$path = $paramArr[0];

$username = isset($paramArr[1])?$paramArr[1]:'';

$password = isset($paramArr[2])?$paramArr[2]:'';

$res = exec("export LANG='zh_CN.GBK' && /usr/bin/svn up $path --username='$username' --password='$password'");

if (strpos($res, '修訂版')!== false) echo '成功更新到5.211';


2.SVN服務器版本庫中hooks目錄下post-commit.bat 修改以下:

 

其中ab.exe是apache下的壓測工具;參數path格式:測試服務器工做拷貝路徑[|||SVN用戶名[|||SVN密碼]],如有特殊字符需urlencode。

碰到的新問題:在咱們的配置中,php-fpm進程以www:www運行,在調用exec和system函數時,其參數中的命令也以www:www執行,而/usr/bin/svn的執行須要 root 身份,因此上面的svnupdate.php不可能成功更新工做拷貝。


解決方案:

讓/usr/bin/svn能夠以www:www執行;

相關文章
相關標籤/搜索