50 行
1.6 KiB
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);
|