環境要求:自建的gitlab,php.ini的disabled_functions 中取消shell_execphp
實現原理:跟svn的鉤子相似,特定的事件git會自動觸發相應的腳本.目標腳本進行相關命令執行便可.git
方法:web
第一步:在gitlab的repo中設置相關參數.若是有多個分支能夠設置多個webhook.shell
以develop分支爲例,若是要添加其餘分支處理腳本,只須要改動$site_dir便可.json
develop.php的內容服務器
<?php ini_set('display_errors', 'on'); error_reporting(E_ALL); //第一步:容許IP訪問判斷 這裏是gitlab服務器IP $access_ip = array('115.192.154.145'); //獲取ip $client_ip = $_SERVER['REMOTE_ADDR']; //驗證ip if ( !in_array($client_ip, $access_ip)) { exit('ip error'); } $json = file_get_contents('php://input'); $data = json_decode($json, true); //fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);//gitlab發送過來的所有數據 //die; if (isset($data['ref']) && $data['ref']) { $branch = substr($data['ref'], 11); //獲取分支名稱(如:refs/heads/develop) if (!$branch) { exit; } if ($branch == 'develop') { $site_dir='/data/sites/autoupdate-develop'; //建立日誌文件 $logfile = './logs/test_hooks_develop_'.date('Ymd').'.log'; $fs = fopen($logfile, 'a'); //把請求的IP和時間寫進log fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL); fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL); fwrite($fs, 'Branch: '.print_r($branch, true).PHP_EOL); //執行shell命令並把返回信息寫進日誌 try{ $output=shell_exec("cd $site_dir && git checkout $branch && git pull origin $branch 2>&1"); fwrite($fs, 'Info:'. $output.PHP_EOL); fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL); $fs and fclose($fs); }catch(Exception $e){ fwrite($fs, 'Error:'. $e->getMessage() .PHP_EOL); throw new Exception("Error Processing Request", 1); } } }else{ exit('no data'); }