文件
xionggeshop/public/webhook.php

50 行
1.6 KiB
PHP

<?php
/**
* GitCode Webhook 自动部署接收入口
*/
// 响应头部
header('Content-Type: application/json; charset=utf-8');
// Webhook 密钥 Token
$secret = 'xiongge_deploy_webhook_2026';
// 项目根目录与部署脚本
$rootDir = dirname(__DIR__);
$deployScript = $rootDir . '/deploy.sh';
$logFile = $rootDir . '/runtime/webhook.log';
// 加载核心处理类
require_once $rootDir . '/application/common/library/WebhookHandler.php';
$deployExecutor = function (array $payload) use ($deployScript, $rootDir) {
$branch = str_replace('refs/heads/', '', $payload['ref'] ?? 'master');
// 以 bash 执行部署脚本,并捕获标准输出与错误输出
$cmd = "bash " . escapeshellarg($deployScript) . " " . escapeshellarg($branch) . " 2>&1";
$output = shell_exec($cmd);
return trim($output ?? '');
};
$handler = new \app\common\library\WebhookHandler($secret, 'master', $deployExecutor);
$rawBody = file_get_contents('php://input') ?: '';
$result = $handler->handle($_SERVER, $_GET, $rawBody);
// 记录审计日志
$date = date('Y-m-d H:i:s');
$ip = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN';
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$status = $result['data']['status'] ?? 'unknown';
$msg = $result['data']['message'] ?? '';
$out = $result['data']['output'] ?? '';
$logEntry = "[{$date}] [{$ip}] {$method} => Status: {$status}, Msg: {$msg}";
if (!empty($out)) {
$logEntry .= "\nDeploy Output:\n" . $out;
}
$logEntry .= "\n" . str_repeat('-', 50) . "\n";
@file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
http_response_code($result['code']);
echo json_encode($result['data'], JSON_UNESCAPED_UNICODE);