前言:我们在进行git代码维护时,每次本地push代码,都要去服务器再进行pull代码的拉取,以保证代码本地和线上的一致性,但是频繁的拉取是非常繁琐的,特别是大项目要进行多个服务器代码同步时,这时候就用到了webhooks(网络钩子)这个东西。
ps:注意我这里全程用到的是码云进行测试举例,其他的都大同小异
去git仓库创建webhooks

添加钩子文件 执行shell命令
以我自己项目为例,框架使用的是tp5,在public/下创建一个名为webhooks.php的文件,目的在于当代码推送至服务器上时,github可以访问到并且可以执行的一个文件。该文件用于执行shell 命令,在触发该链接时自动执行该文件里的命令,从而实现git 自动拉取。

具体代码
<?php
// 本地仓库路径 项目目录
$local = '/www/wwwroot/wurenji';
// 密码 gitee项目管理webhook中设置
$password = '123';
//如果请求体内容为空,返回错误
$payload = file_get_contents('php://input');
if (!$payload) {
header('HTTP/1.1 400 Bad Request');
die('HTTP HEADER or POST is missing.');
}
// 如果启用验证,并且验证买QQ平台失败,返回错误
// gitee默认返回json,解析json后验证密码
$data = json_decode($payload, true);
if(empty($data) || $data['password'] != $password) {
header('HTTP/1.1 403 Permission Denied');
die('Permission denied.');
}
// 如果仓库目录不存在,返回错误
if (!is_dir($local)) {
header('HTTP/1.1 500 Internal Server Error');
die('Local directory is missing');
}
//输出执行结果 包括错误信息,在gitee webhook中可以查看和测试
$res = shell_exec("cd {$local} && git pull 2>&1");
echo $res;
$res_log = '-------------------------'.PHP_EOL;
$res_log .= ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push'.$res;
file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);//将每次拉取信息追加写入到日志里
die("done " . date('Y-m-d H:i:s', time()));
修改.git/config文件url
url = https://账号:密码@gitee.com/xiangyuphp/项目名.git

php.ini 文件里shell 没有禁用
处理方法 将php.ini 里的shell_exec删除,重启服务即可
(重启php:systemctl restart php-fpm)
修改.git里的文件权限
chmod -R 777 .git/FETCH_HEAD
点击测试就可以看到返回信息,是否成功

每次本地提交代码时,会在public/下生成git-webhook.txt日志文件,记录webhooks运行日志

原理:
每次你push代码到git仓库后,git代码管理平台就会检测push事件,然后发送一个post请求到你的绑定https://xxx.webhooks.php,在该访问的post请求中处理git拉取代码功能。