在开发中,我需要将 Gitee 仓库的代码在每次 Push 时自动同步到宝塔面板的网站目录。本文记录了如何利用宝塔自带的 WebHook 插件,通过简单的脚本实现这一目标,避免了额外的服务端配置。
背景和目标
目标是将 Gitee 仓库的代码实时同步到宝塔的网站目录(例如 /www/wwwroot/example.com
)。我希望通过 Gitee 的 WebHook 触发同步,宝塔端无需复杂配置,只需在 WebHook 插件中添加脚本。由于手动运行 git fetch
和 git reset --hard origin/master
已验证可行,我将其集成到自动流程中。
遇到的问题
实现过程中遇到几个障碍:
- HTTPS 自签名证书问题
宝塔默认自签名证书不受 Gitee 信任,报错SSLHandshakeException: PKIX path building failed
,导致 HTTPS WebHook 失败。 - 同步逻辑调整
最初脚本使用git pull
,但发现git fetch
和git reset --hard
更适合单向覆盖同步。 - 权限设置失败
脚本中设置目录权限(如chown -R www:www
)失败,可能是 Web 用户不匹配。
最终,我选择使用 HTTP WebHook,并直接在宝塔 WebHook 插件中编写脚本,简化流程。
解决方案
- 使用 HTTP WebHook:绕过自签名证书问题。
- 宝塔 WebHook 插件:直接在插件中添加 Hook 脚本,无需额外 PHP 或 Nginx 配置。
- SSH 同步:通过 SSH 地址拉取代码,避免 HTTPS 认证。
- 简化权限:跳过
chown
,手动调整权限。
实现步骤
1. 安装宝塔 WebHook 插件
- 登录宝塔面板。
- 进入“软件商店”,搜索并安装“WebHook”插件。
2. 添加 WebHook Hook
- 打开 WebHook 插件,点击“添加 Hook”。
- 配置以下参数:
- 名称:
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
- 保存方式:选择“直接执行”。
保存后,获取 WebHook 的 URL,例如:
http://example.server.com:8888/hook?access_key=your_access_key
端口(默认 8888
)和 access_key
由宝塔 WebHook 插件生成。
3. 配置 Gitee WebHook
- 进入 Gitee 仓库 > “管理” > “WebHooks”。
- 添加 WebHook:
- URL:
http://example.server.com:8888/hook?access_key=your_access_key
- 事件:Push。
- URL:
- 保存并点击“测试”。
4. 确保 SSH 认证
由于脚本使用 SSH 地址(git@git.example.com:user/repo.git
):
- 生成 SSH 密钥:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 查看公钥并添加到 Gitee:
cat ~/.ssh/id_rsa.pub
复制公钥,登录 Gitee > “设置” > “SSH 公钥” > 添加。
- 测试 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
更新。
注意事项
- 端口开放
确认服务器防火墙开放 WebHook 端口(默认8888
):firewall-cmd --add-port=8888/tcp --permanent firewall-cmd --reload
- 权限问题
如果需要调整目录权限,手动运行:chown -R www:www /www/wwwroot/example.com
或根据 Web 服务用户(例如
nginx
)修改。 - 长期建议
使用 HTTP 不安全,建议绑定域名并申请 Let’s Encrypt 证书,改为 HTTPS。
总结
通过宝塔 WebHook 插件,我成功实现了 Gitee 仓库的实时同步。核心步骤包括:安装插件、添加 Hook 脚本、配置 Gitee WebHook 和 SSH 认证。相比独立脚本方案,这种方法更简洁,直接利用宝塔内置功能,避免了额外的 Nginx 配置。希望这篇记录能帮助有类似需求的开发者!