Ubuntu 上使用 GitLab Webhook 的完整步骤
一 前置准备
二 在 GitLab 项目中添加 Webhook
三 在 Ubuntu 上实现 Webhook 接收端示例
git pull 自动更新站点:
sudo apt-get update
sudo apt-get install -y nginx php-fpm
# 编辑 /etc/nginx/sites-enabled/default,添加:
# location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; }
# location /webhook { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; }
sudo systemctl restart nginx php7.4-fpm
<?php
// 配置
$secret = 'YOUR_SECRET_TOKEN'; // 与 GitLab 中一致
$repoPath = '/var/www/your-site'; // 项目绝对路径
$allowedIps = ['127.0.0.1', 'GITLAB_SERVER_IP']; // 建议仅允许 GitLab 服务器 IP
// 校验 Token
$clientToken = $_SERVER['HTTP_X_GITLAB_TOKEN'] ?? '';
if ($clientToken !== $secret) {
http_response_code(403);
exit('Forbidden: token mismatch');
}
// 可选:IP 白名单
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '';
if (!in_array($clientIp, $allowedIps, true)) {
http_response_code(403);
exit('Forbidden: IP not allowed');
}
// 读取 Payload
$payload = file_get_contents('php://input');
if (!$payload) {
http_response_code(400);
exit('Bad Request: no payload');
}
// 简单解析 JSON(仅演示,可按需扩展)
$data = json_decode($payload, true);
$ref = $data['ref'] ?? '';
// 仅对 main 分支拉取(可按分支策略调整)
if ($ref === 'refs/heads/main') {
$cmd = "cd " . escapeshellarg($repoPath) . " && git pull origin main 2>&1";
exec($cmd, $out, $ret);
file_put_contents('/tmp/webhook.log', date('c') . " CMD: $cmd\nRET: $ret\nOUT:\n" . implode("\n", $out) . "\n\n", FILE_APPEND);
}
// 返回 2xx 让 GitLab 认为成功
http_response_code(200);
echo "OK\n";
git pull 所需权限,避免全权限:sudo visudo
www-data ALL=(ALL) NOPASSWD: /usr/bin/git
四 测试与常见问题
五 常见集成场景
updateGitlabCommitStatus 将构建状态回写到 GitLab。