温馨提示×

ubuntu gitlab如何使用webhook

小樊
33
2025-12-20 18:39:32
栏目: 智能运维

Ubuntu 上使用 GitLab Webhook 的完整步骤

一 前置准备

  • 在 Ubuntu 上准备一个可被外网或内网访问的 HTTP 服务(如 Nginx + PHP-FPMNode.jsPython Flask/FastAPI 等),用于接收 GitLab 的 POST 请求。
  • 若服务在内网,确保 GitLab Runner/服务器能访问到该服务地址;若走公网,建议启用 HTTPSSecret Token 校验。
  • 准备好要触发的事件(如 Push eventsMerge request eventsTag push events 等),后续在 GitLab 中按需勾选。

二 在 GitLab 项目中添加 Webhook

  • 进入项目主页,依次点击 Settings > Webhooks(或 Settings > Integrations)。
  • 填写配置项:
    • URL:你的接收端地址(例如:http://your-domain/webhook 或 http://服务器IP:端口/hook)。
    • Trigger:勾选需要的事件,常用为 Push eventsMerge request eventsTag push events;如需覆盖更多场景,可选择推送全部事件。
    • (可选)Secret Token:设置一个密钥,服务端用它与请求头中的 X-Gitlab-Token 比对,防止伪造请求。
    • (可选)SSL Verification:使用 HTTPS 时建议保持开启以校验证书。
  • 点击 Add webhook 保存。完成后可在 Recent Deliveries 查看投递记录与响应结果,便于调试。

三 在 Ubuntu 上实现 Webhook 接收端示例

  • PHP 示例(Nginx + PHP-FPM),支持 Secret Token 与简单 IP 白名单校验,收到请求后执行 git pull 自动更新站点:
    1. 安装与配置
    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
    
    1. 接收脚本 /var/www/html/webhook.php
    <?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";
    
    1. 安全建议
    • 将 Web 服务运行用户(如 www-data)加入 sudoers,仅授予 git pull 所需权限,避免全权限:
      sudo visudo
      www-data ALL=(ALL) NOPASSWD: /usr/bin/git
      
    • 生产环境建议用 SSH 部署密钥 替代 HTTPS 账号密码,并将仓库目录权限最小化。

四 测试与常见问题

  • 在 GitLab Webhook 页面点击 Test 发送测试事件,或在 Recent Deliveries 查看请求与响应;若失败,检查:
    • 目标 URL、端口与协议(HTTP/HTTPS)是否可达;防火墙/安全组是否放行(常见为 80/443 或自定义端口)。
    • Secret Token 是否一致;服务端是否正确读取 X-Gitlab-Token 头。
    • 接收端日志(如 /tmp/webhook.log 或 Nginx 错误日志)是否有报错与权限问题。
    • 触发事件是否勾选;例如 Push eventsMerge request eventsTag push events 等是否与实际需求匹配。

五 常见集成场景

  • 触发 Jenkins 构建:在 Jenkins 安装 GitLab Plugin,配置 GitLab 连接与凭据(个人访问令牌或用户名+密码),在任务中启用 Generic Webhook Trigger 或 GitLab 插件触发器,然后在 GitLab Webhook 中填写 Jenkins 提供的 URL 与 Secret。可在流水线中使用 updateGitlabCommitStatus 将构建状态回写到 GitLab。
  • 触发 持续交付/外部平台:复制平台提供的 Webhook URL,在 GitLab 的 Settings > Webhooks 中配置并选择事件(如 Push eventsTag push eventsMerge request events(merged) 等),保存后通过测试事件验证投递与触发条件。

0