目標:SVN版本庫提交,服務器中的工作拷貝能自動update。
實現方法:subversion, curl,php腳本實現,並且入mysql庫來進行管理。改hosts文件來進行訪問!提交觸發鈎子腳本時調用 curl 訪問內網php腳本,內網內svn更新
基本思路:默認情況下,版本庫的hooks子目錄中包含各種版本庫鈎子模板。如下圖:
鈎子是通過版本庫事件觸發,例如新版本的創建或一個未版本化屬性的修改。一些鈎子(“pre hooks”)在事件發生前運行,可以用來報告發生了什么以及防止它發生。還有一些鈎子(“post hooks”)在版本庫事件之后發生,只是用來報告。這里我們要用post-commit鈎子,在版本庫提交事件發生后,更新服務器的工作拷貝。
深入了解hooks:對每種鈎子的都有一個模板,通過查看這些腳本的內容,我們能看到是什么事件觸發了腳本及如何給傳遞數據。要實際安裝一個可用的鈎子,我們需要在repos/hooks目錄下安裝一些與鈎子同名(如 start-commit或者post-commit)的可執行程序或腳本。例如,在linux下,我們需要復制模板,去掉后綴名 .tmpl,自定義鈎子的內容,並使之成為一個可執行地腳本;Windows用文件的擴展名來決定一個程序是否可運行,所以我們要使程序的基本名與鈎子同名,同時,它的擴展名是Windows系統所能辨認的,例如exe、com和批處理的bat。
如何使用hooks:在版本庫hooks目錄下新建文件 post-commit 並輸入如下內容保存:
#!/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 命令無法觸發遠程服務器的更新。
解決方案:思路——在鈎子里向測試服務器發送HTTP請求,測試服務器收到請求后,通過php的system函數本地調用svn up 命令,實現測試服務器的工作拷貝的更新。兩件事情:
1.測試服務器安裝 linux版svn客戶端(下載地址,),在web根目錄下新建svnupdate.php文件。代碼如下:
<?php
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執行;