gitlab webhooks 自動更新線上代碼

<?php
error_reporting(E_ALL);
date_default_timezone_set('PRC');
$project_map = [
    'master' => [
        'name' => 'master', # 別名
        'access_token' => 'auto-push-master', # 配置鉤子時需要的一個祕鑰,當然也可以不設置
        'root' => '/srv/www/api' # 倉庫所在路徑
    ],
];
// 根據token獲取項目信息
function getProjectInfoByToken($token, $project_map){
    $return = [];
    foreach ($project_map as $map) {
        if ($map['access_token'] == $token) {
            $return = $map;
            break;
        }
    }
    return $return;
}
// 這裏填你的gitlab服務器ip
$valid_ip = array('127.0.0.1'); 
// 這是gitlab服務器上配置的access_token
$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];    
$client_ip = $_SERVER['REMOTE_ADDR'];
// 按照日期生成日誌文件
$file_name = 'webhook.log';
$data = ['time' => date('Y-m-d H:i:s'), 'client_ip' => $client_ip];
$data = array_merge($data, $_POST, $_GET);
$project = getProjectInfoByToken($client_token, $project_map);

$projectNo = empty($project);
$notIp = !in_array($client_ip, $valid_ip);
if ($projectNo || $notIp) {
    $data['result'] = $notIp ? 'Ip mismatch!' : 'Token mismatch!';
    $log_data = json_encode($data) . PHP_EOL . PHP_EOL;
    file_put_contents($file_name, $log_data, FILE_APPEND);
    die('Token mismatch!');
}
$root = $project['root'];
$command = "cd " . $root . "; git pull origin master 2>&1"; //我更新的是master分支代碼
$data['command'] = $command;
// 執行shell命令,需要服務器啓用exec函數,默認是關閉的
exec($command, $output);
$data['result'] = $output;
$log_data = json_encode($data) . PHP_EOL . PHP_EOL;
file_put_contents($file_name, $log_data, FILE_APPEND);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章