php 用webhook实现git同步服务器代码 2022.8.18

发布于:2023-01-12 ⋅ 阅读:(414) ⋅ 点赞:(0)

网上很多的教程根本走不通,到后面会有一堆报错,所以自己整理了一下

预备工作:本地和服务器已git clone项目

1.先编写php文件

文件hook.php,放到和项目入口文同目录下(这里只是一种网上copy的,可以用其他的)

<?php

// 允许请求IP gitee请求的时候会打印
// $allowIpArr = [
//     //码云IP,不知道怎么来的,只能通过hook.php报错获得(未使用)
//     '106.13.250.83',
//     '106.13.250.89',
//     '106.13.250.90',
//     '106.13.250.88',
// ];

// 请求密码 你的密码
$password = 'shen9703142530';

// 检测IP(未使用)
// if (!in_array($_SERVER['REMOTE_ADDR'], $allowIpArr)) {
//     echo '非法IP:' . $_SERVER['REMOTE_ADDR'];
//     exit(0);
// }

// 获取请求参数
$headers = getallheaders();
$body = json_decode(file_get_contents("php://input"), true);

// 验证提交分支是否为master
if (!isset($body['ref']) || $body['ref'] !== 'refs/heads/master') {
    echo '非主分支' . $body;
    exit(0);
}

// 验证提交密码是否正确
if (!isset($body['password']) || $body['password'] !== $password) {
    echo '密码错误';
    exit(0);
}

// 验证成功,拉取代码
// $path = $body['project']['path'];
$command = 'cd /usr/www/myblog';
$command2 = 'git pull 2>&1';
$res = shell_exec($command);
$res2 = shell_exec($command2);

//(未使用)
//$body['sender']['email'],// 将邮件发送给发送者
//$body['repository']['owner']['email']// 将邮件发送给仓库所有者
//$message = $body['head_commit']['message'];// 提交信息
//$datetime = date('Y-m-d H:i:s', $body['timestamp'] / 1000);// 时间
//$pusher = $body['pusher']['name'];// 提交人
//$name = $body['project']['name'];// 项目名
//$path = $body['project']['path'];// 路径

// 返回结果
echo 'git pull执行结果:' . $res2;

2. 创建gitee自带的gitwebhook

按理说此时git push应该可以自动同步,但并不是,会有报错

3.报错整理修改

1.shell_exec()无法使用,shell_exec()被禁用

原因:php.ini exec()函数无法使用
解决:在php.ini的 disable_functions配置中,默认exec执行函数都是被 禁止的,需要在php.ini中disable_functions = exec , popen, system …. ,将你需要用的函数从列表中删掉,然后在重启就可以了
2.以下两种错误均为权限问题

error: Your local changes to the following files would be overwritten by merge: public/index.php Please commit your changes or stash them before you merge.

error: cannot open .git/FETCH_HEAD: Permission denied

解决:权限问题,修改整个项目和.git文件权限为755或777

在项目文件所在目录(myblog为我的项目文件名)

chmod -R 777 myblog

如果.git文件权限未修改

cd myblog
chmod -R 777 .git

 3.fatal: unable to auto-detect email address (got 'apache@iZwz9hnrha4ocqutj5bgy5Z.(none)')

解决:此类报错为无法验证邮箱或用户身份,很多解决方法,此处写一种

修改.git/config文件

vim config

在文件中增加和修改以下内容

email=注册邮箱
name=用户名(电话)
url = https://用户名:密码@gitee.com/shen_miao/myblog.git

4.error: insufficient permission for adding an object to repository database .git/objects fatal: failed to write object fatal: unpack-objects failed

最烦人的报错,网上找了好多资料都没解决,最后打开objects文件发现,当触发钩子的时候git pull的操作者为apache,所以要把Apache放入管理员组中

解决路线:

打开.git/objects文件查看操作者

cd objects
ll

 

 修改用户组(我的管理员组为root)

sudo chown -R apache:root *

 如果还是不成功,可以把这条指令写到hook.php里面。每次执行git pull之前执行一下

5.还有一种报错至今未解决,但是后来不知道怎么就没了

fatal: update_ref failed for ref 'ORIG_HEAD': could not open '.git/ORIG_HEAD' for writing: Permission denied

疑惑:说是权限不够,可以我已经给ORIG_HEAD 777 权限了。网上没有一条解决方法,似乎没人遇到这个问题,只有类似的: ‘ORIG_HEAD‘:cannot lock ref ‘ORIG_HEAD‘。

我猜测是和第四条报错原因一样,后来可能因为我改了apache的权限组,就没了。有懂的大佬可以讲一下

6.还有其他的一些问题,大部分都是和权限有关,或者与身份验证有关。如果我的方法解决不了可以自行查找。