WebHooks 实现远程项目的自动部署
环境说明
- Github 或 Gitee 维护的网站代码(支持 Webhooks);
由于 Github 访问速度受限,易出现超时问题,我使用 Gitee 部署代码 - Linux 公网服务器(阿里云、腾讯云、华为云等);
服务器操作环境为 CentOS 7.6 64bit - 远程服务器环境安装:
git@1.8.3.1,Nginx@1.20.1,PHP@5.6 
前期准备
- 克隆项目代码文件夹,通过 Nginx 或宝塔面板建立可用的网站
 - 远程服务器的 PHP 代码是由 www 用户运行的,所以一切操作建立在 www 用户之上
 - 安装好 PHP 模块以后,还需要对 PHP 的 
php.ini进行更改,删除disable_functions下的exec、shell_exec,这样才能在webhooks.php文件中执行脚本命令 
生成和配置公钥
开启 www 用户
命令:
vim /etc/passwd配置:把
sbin/nologin修改为bin/bash
生成公钥
因为我们已经开始了 www 登录权限,那么在生成公钥之前,需要切换到 www 账户下,命令:su www
- 切换用户:
su www - 生成公钥:
ssh-keygen -t rsa -C "{email}"- 默认回车即可 - 查看公钥:
cat ~/.ssh/id_rsa.pub- 其他账户下不可见,只有切换到 www 可见 
配置公钥(Gitee)
- 地址:https://gitee.com/profile/sshkeys
 - 配置:把你通过 
cat ~/.ssh/id_rsa.pub查看到的公钥,配置到这里即可,如下: 
- 有了这个公钥的配置,通过 
webhooks.php中的脚本指令就可以自动拉取代码了 
配置 Webhooks
从 Gitee 克隆下来的代码文件中,有一个名为 webhooks.php 的文件,它是用于处理 Gitee 回调时拉取 Gitee 对应代码库的脚本文件。
对 webhooks.php 文件进行如下配置:
<?php
/**
 * Git webhooks 自动部署脚本
 * 地址:https://github.com/LiuPiPiPi/liupipipi.github.io/settings/hooks
 */
// 接收post参数
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    exit('data null!');
}
// Content type = application/json
$content = json_decode($requestBody, true);
// 验证 Webhooks 配置的 Secret,也可以不验证
/*if (empty($content['password']) || $content['password'] != '123456') {
 exit('password error');
}*/
// 项目存放物理路径,也就是站点的访问地址
$path = "/home/www/Blog-Hexo/";
// 判断需要下拉的分支上是否有提交,我们这里的分支名称为 master
if ($content['ref'] == 'refs/heads/master') {
    // 执行脚本 git pull,拉取分支最新代码
    $res = shell_exec("cd {$path} && git pull origin master 2>&1"); // 当前为www用户
    // 记录日志 ($content 返回的是一整个对象,可以按需获取里面的内容,写入日志)
    $res_log = '------------------------->' . PHP_EOL;
    $res_log .= '用户 ' . $content['pusher']['name'] . ' 于 ' . date('Y-m-d H:i:s') . ' 向项目【' . $content['repository']['name'] . '】分支【' . $content['ref'] . '】PUSH ' . $content['commits'][0]['message'] . PHP_EOL;
    $res_log .= $res . PHP_EOL;
    // 追加方式,写入日志文件
    // file_put_contents("git_webhook_log.txt", $res_log, FILE_APPEND);
}
// shell_exec("cd {$path} && git pull origin master 2>&1");
echo 'webhooks connect done!';添加 Webhooks
在网站代码的 Gitee 管理页面,进入设置 -> Webhooks 添加 Webhooks 请求,URL 填写 webhooks.php 文件的远程地址。
查看日志:
到这里 Webhooks 回调函数自动部署就成功实现。Webhooks 也可以通过宝塔面板自动配置,详细操作见下方链接。
宝塔面板自动配置 Webhooks 参考文章:php宝塔面板webhook使用
WebHooks 实现远程项目的自动部署
      http://lpxz.work/posts/24049/