chaihongjun.me

Gitee Webhook自动部署系统

项目简介

这是一个基于 Gitee Webhook 的自动部署系统,能够实现代码提交后自动部署到服务器。通过配置 Webhook,当代码推送到 Gitee 仓库时,系统会自动将代码部署到指定的服务器目录。

系统要求

·PHP 5.6+ ·Git ·Linux/Unix 服务器环境 ·网站目录写权限

文件结构

网站根目录/├── deploy/                 # 保护目录(不会被覆盖)│   ├── webhook.php        # 部署脚本(必须放在此目录)│   └── webhook.log        # 自动生成的日志文件├── dist/                  # 部署的目标目录(根据配置)└── 其他网站文件...

配置说明

脚本配置参数

编辑 deploy/webhook.php 中的配置区域:

// ==================== 配置区 ====================define('WEBSITE_ROOT', '/alidata1/www/web/webhook.chaihongjun.me'); // 服务器网站根目录define('GIT_REMOTE', 'https://gitee.com/chaihongjun/webhook-test.git'); // Gitee仓库地址define('SECRET_KEY', 'chj441315628'); // Webhook密码(需与Gitee设置一致)define('TARGET_DIR', 'dist'); // 要部署的子目录,留空则部署整个仓库define('BRANCH', 'master'); // 同步的分支define('GIT_PATH', '/usr/bin/git/bin/git'); // 服务器Git路径define('CHECK_TARGET_CHANGES', true); // 是否检查目标目录变化define('PROTECTED_DIRS', ['deploy', '.temp_deploy']); // 保护目录列表

关键配置说明

TARGET_DIR(目标目录配置)

  1. 设置目录名(如 'dist'):只部署该目录的内容

  2. 留空(''):部署整个仓库的所有内容

CHECK_TARGET_CHANGES(变化检查配置)

  1. true:智能部署,只有目标目录有变化时才部署

  2. false:强制部署,任何提交都会触发部署

配置组合使用示例
TARGET_DIRCHECK_TARGET_CHANGES部署行为
disttrue只有 dist 目录变化时才部署
distfalse任何提交都部署 dist 目录
''true/false任何提交都部署整个仓库

Gitee 仓库配置

  1. 创建 Webhook

    在 Gitee 仓库中设置 Webhook:

    1. URL: http://你的域名/deploy/webhook.php

    2. WebHook 密码: 与脚本中 SECRET_KEY 一致

    3. 触发事件: 选择 Push 事件

    4. 是否激活: 是

    5. 进入仓库 → 管理 → WebHooks

    6. 添加WebHook

    7. 配置参数:

  2. 测试Webhook

保存后点击 测试,应该收到成功响应:

{  "status": "success",  "message": "Webhook is working",  "time": "2024-01-01 12:00:00"}

服务器部署步骤

初始部署

# 1. 创建网站目录mkdir -p /alidata1/www/web/webhook.chaihongjun.me# 2. 创建保护目录mkdir -p /alidata1/www/web/webhook.chaihongjun.me/deploy# 3. 上传 webhook.php 到 deploy 目录cd /alidata1/www/web/webhook.chaihongjun.me/deploy# 4. 设置权限chown -R www:www /alidata1/www/web/webhook.chaihongjun.mechmod 755 webhook.php

验证部署

访问 Webhook URL 测试连通性:

http://你的域名/deploy/webhook.php

应该看到提示:Only POST requests allowed

日常使用流程

  1. 本地开发

# 克隆仓库git clone https://gitee.com/chaihongjun/webhook-test.git# 开发代码...# 提交更改git add .git commit -m "功能更新"git push origin master
  1. 自动触发部署

 推送代码后的自动流程:

  1. Gitee 自动发送 Webhook 请求到服务器

  2. 服务器验证请求合法性

  3. 检查目标目录变化(如果启用)

  4. 执行部署操作

  5. 返回部署结果


  1. 查看部署日志

# 查看部署日志tail -f /alidata1/www/web/webhook.chaihongjun.me/deploy/webhook.log

部署行为说明

保护机制

  • deploy/ 目录及其所有内容受到完全保护

  • 部署过程中不会删除或覆盖保护目录

  • 保护目录包括:deploy.temp_deploy

清理操作

部署时会清理网站根目录,但:

  • 保留保护目录和文件

  • 删除其他所有文件和目录

  • 然后从仓库复制新文件

权限设置

部署完成后自动设置:

  • 文件所有者:www:www

  • Webhook 脚本权限:755

故障排除

常见问题

Webhook 测试失败

  • 检查 URL 是否正确

  • 验证 Secret 是否匹配

  • 查看服务器错误日志

部署失败

  • 检查 Git 路径配置

  • 验证目录权限

  • 查看 webhook.log 详细日志

文件权限问题
# 修复权限chown -R www:www /alidata1/www/web/webhook.chaihongjun.mefind /alidata1/www/web/webhook.chaihongjun.me -type f -exec chmod 644 {} \;find /alidata1/www/web/webhook.chaihongjun.me -type d -exec chmod 755 {} \;chmod 755 /alidata1/www/web/webhook.chaihongjun.me/deploy/webhook.php

日志分析

查看 webhook.log 文件,关注关键信息:

=== Webhook 请求开始 === - 请求开始标记

  • === Webhook 请求开始 === - 请求开始标记

  • 事件类型 - 接收到的事件类型

  • 检测到目标目录 - 变化检测结果

  • 执行命令 - 执行的系统命令和输出

  • 部署完成 - 部署结果

  • 错误 - 错误信息

维护建议

日志管理
# 定期清理日志(保留最近30天)
find /alidata1/www/web/webhook.chaihongjun.me/deploy -name "webhook.log" -mtime +30 -exec rm {} \;

# 或者使用日志轮转
# 在 /etc/logrotate.d/ 创建配置文件

安全建议

  • 定期更换 Webhook 密码

  • 限制 Webhook URL 访问权限

  • 监控部署日志异常

性能优化

  • 对于大仓库,考虑使用增量部署

  • 定期清理临时文件

  • 监控服务器资源使用

注意事项

  1. 首次部署需要手动将 Webhook 脚本放到服务器

  2. 保护目录确保部署脚本和日志不会被意外删除

  3. 权限设置必须正确,否则部署可能失败

  4. 定期维护清理日志文件,避免磁盘空间不足

这个系统能够有效实现代码的自动部署,大大提高了开发部署的效率。

webhook.php: webhook.php.txt



知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»