如果需要同步到生產環境,請做額外處理,如自動化測試,測試通過再同步。
<?php
$project = trim($_GET['project']);
if (empty($project)) {
die('project not exist.');
}
//網站目錄
$www_file='/home/wwwroot/' . $project . '/';
//打開網站目錄下的hooks.log文件 需要在服務器上創建 並給寫權限
$fs = fopen('./hooks.log', 'a');
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);
//自定義字串掩碼 用於驗證
$access_token = 's7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw';
//接受的ip數組,也就是允許哪些IP訪問這個文件 這里是gitlab服務器IP
$access_ip = array('8.8.8.8', '119.23.153.156');
//獲取請求端的ip和token
$client_token = $_GET['token'];
$client_ip = $_SERVER['REMOTE_ADDR'];
//把請求的IP和時間寫進log
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
//驗證token 有錯就寫進日志並退出
if ($client_token !== $access_token)
{
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}
//驗證ip
if ( !in_array($client_ip, $access_ip))
{
echo "error 503";
fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);
exit(0);
}
//獲取請求端發送來的信息,具體格式參見gitlab的文檔
$json = file_get_contents('php://input');
$data = json_decode($json, true);
//如果有需要 可以打開下面,把傳送過來的信息寫進log
//fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
//執行shell命令並把返回信息寫進日志
$output=shell_exec("cd $www_file && git checkout dev-master && git pull origin dev-master 2>&1");
fwrite($fs, 'Info:'. $output.PHP_EOL);
fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);
$fs and fclose($fs);
實際上gitlab的鈎子post的數據包含了更多內容,上面只是做一個簡單的同步。
nginx配置
server {
listen 80;
server_name 你的ip;
charset utf-8;
#access_log logs/host.access.log main;
root /home/wwwroot/hooks;
index index.html index.htm index.php ;
error_log logs/hooks.err.log;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi_params;
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
}
項目配置
為項目設置自動更新
- 在gitlab項目設置里面,點擊"Web鈎子"
- 鏈接填寫
http://ip地址/hooks.php?token=s7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw&project=xiaomi - 上面鏈接的xiaomi是對應服務器的/home/wwwroot/下的xiaomi目錄
-
私密授權碼填寫:
s7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw -
觸發選項:
- 勾選 "推送事件"
- 勾選 "標簽推送事件"
- 其余留空
- 反選 "開啟SSL證書驗證"
-
點擊 "增加Web鈎子" 按鈕
-
在最下面的Web鈎子列表,點擊測試,200則沒有問題
token和上面php代碼里面的一致,project是服務器上的項目目錄名,默認路徑/home/wwwroot
