大地主的知识库
专注于收集、整理和分享各种各样的知识信息

如何通过宝塔 WebHook 插件实时同步 Gitee 仓库代码

在开发中,我需要将 Gitee 仓库的代码在每次 Push 时自动同步到宝塔面板的网站目录。本文记录了如何利用宝塔自带的 WebHook 插件,通过简单的脚本实现这一目标,避免了额外的服务端配置。

背景和目标

目标是将 Gitee 仓库的代码实时同步到宝塔的网站目录(例如 /www/wwwroot/example.com)。我希望通过 Gitee 的 WebHook 触发同步,宝塔端无需复杂配置,只需在 WebHook 插件中添加脚本。由于手动运行 git fetchgit reset --hard origin/master 已验证可行,我将其集成到自动流程中。

遇到的问题

实现过程中遇到几个障碍:

  1. HTTPS 自签名证书问题
    宝塔默认自签名证书不受 Gitee 信任,报错 SSLHandshakeException: PKIX path building failed,导致 HTTPS WebHook 失败。
  2. 同步逻辑调整
    最初脚本使用 git pull,但发现 git fetchgit reset --hard 更适合单向覆盖同步。
  3. 权限设置失败
    脚本中设置目录权限(如 chown -R www:www)失败,可能是 Web 用户不匹配。

最终,我选择使用 HTTP WebHook,并直接在宝塔 WebHook 插件中编写脚本,简化流程。

解决方案

  • 使用 HTTP WebHook:绕过自签名证书问题。
  • 宝塔 WebHook 插件:直接在插件中添加 Hook 脚本,无需额外 PHP 或 Nginx 配置。
  • SSH 同步:通过 SSH 地址拉取代码,避免 HTTPS 认证。
  • 简化权限:跳过 chown,手动调整权限。

实现步骤

1. 安装宝塔 WebHook 插件

  1. 登录宝塔面板。
  2. 进入“软件商店”,搜索并安装“WebHook”插件。

2. 添加 WebHook Hook

  1. 打开 WebHook 插件,点击“添加 Hook”。
  2. 配置以下参数:
    • 名称sync_gitee(自定义)。
    • 执行脚本:直接写入以下 Bash 脚本:

#!/bin/bash

date "+%Y-%m-%d %H:%M:%S"
echo "Start"

gitPath="/www/wwwroot/example.com"
gitHttp="git@git.example.com:user/repo.git"

echo "Web站点路径:$gitPath"

if [ -d "$gitPath" ]; then
    cd "$gitPath" || { echo "错误:无法进入目录 $gitPath"; exit 1; }
    if [ ! -d ".git" ]; then
        echo "在该目录下克隆 git"
        git clone "$gitHttp" gittemp || { echo "错误:Git 克隆失败"; exit 1; }
        mv gittemp/.git . || { echo "错误:移动 .git 失败"; exit 1; }
        rm -rf gittemp || { echo "错误:删除临时目录失败"; exit 1; }
    fi

    echo "同步 Gitee 最新代码"
    BEFORE=$(git rev-parse HEAD)
    git fetch || { echo "错误:Git fetch 失败"; exit 1; }
    git reset --hard origin/master || { echo "错误:Git reset 失败"; exit 1; }
    AFTER=$(git rev-parse HEAD)

    if [ "$BEFORE" = "$AFTER" ]; then
        echo "代码已是最新,无需同步"
    else
        echo "代码同步成功,HEAD 从 $BEFORE 更新到 $AFTER"
    fi

    echo "End"
    exit 0
else
    echo "该项目路径不存在"
    echo "End"
    exit 1
fi
  1. 保存方式:选择“直接执行”。

保存后,获取 WebHook 的 URL,例如:
http://example.server.com:8888/hook?access_key=your_access_key
端口(默认 8888)和 access_key 由宝塔 WebHook 插件生成。

3. 配置 Gitee WebHook

  1. 进入 Gitee 仓库 > “管理” > “WebHooks”。
  2. 添加 WebHook:
    • URLhttp://example.server.com:8888/hook?access_key=your_access_key
    • 事件:Push。
  3. 保存并点击“测试”。

4. 确保 SSH 认证

由于脚本使用 SSH 地址(git@git.example.com:user/repo.git):

  1. 生成 SSH 密钥:
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. 查看公钥并添加到 Gitee:
    cat ~/.ssh/id_rsa.pub

    复制公钥,登录 Gitee > “设置” > “SSH 公钥” > 添加。

  3. 测试 SSH:
    ssh -T git@git.example.com

    应返回认证成功信息。

5. 测试与验证

  • 手动测试
    curl "http://example.server.com:8888/hook?access_key=your_access_key"

    检查输出是否包含同步结果。

  • Gitee 测试
    Push 一次代码,查看 WebHook 日志,确保目录 /www/wwwroot/example.com 更新。

注意事项

  1. 端口开放
    确认服务器防火墙开放 WebHook 端口(默认 8888):

    
    firewall-cmd --add-port=8888/tcp --permanent
    firewall-cmd --reload
            
  2. 权限问题
    如果需要调整目录权限,手动运行:

    chown -R www:www /www/wwwroot/example.com

    或根据 Web 服务用户(例如 nginx)修改。

  3. 长期建议
    使用 HTTP 不安全,建议绑定域名并申请 Let’s Encrypt 证书,改为 HTTPS。

总结

通过宝塔 WebHook 插件,我成功实现了 Gitee 仓库的实时同步。核心步骤包括:安装插件、添加 Hook 脚本、配置 Gitee WebHook 和 SSH 认证。相比独立脚本方案,这种方法更简洁,直接利用宝塔内置功能,避免了额外的 Nginx 配置。希望这篇记录能帮助有类似需求的开发者!

赞(0) 打赏
未经允许不得转载:大地主的知识库 » 如何通过宝塔 WebHook 插件实时同步 Gitee 仓库代码

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

微信扫一扫打赏

登录

找回密码

注册