乐趣区

关于php:web-hooks服务器自动拉取代码php-thinkphp6

Github 筹备事项

1. 在仓库 settings 里增加 webhooks

以私人仓库为例:

1. 创立完仓库之后,点击 settings。

设置 webhooks 拜访门路:

以我本人我的项目为例,框架应用的是 tp6。在 public/ 下创立一个名为 basic.php 的文件,目标在于当代码推送至服务器上时,github 能够拜访到并且能够执行的一个文件。
该文件用于执行 shell 命令,在触发该链接时主动执行该文件里的命令,从而实现 git 主动拉取。

2. 测试链接是否失效,文件是否有被拜访到

如上图所示,当呈现绿色✅时示意此链接被拜访到,当呈现红色⚠️标记则示意文件没有被拜访。以此排查链接问题还是代码问题。

  • [x] 至此 Github 方面实现。

    PHP 代码部署

    1. 增加钩子文件 执行 shell 命令

    上面展现一些 内联代码片

<?php
    //git webhook 主动部署脚本
    $requestBody = file_get_contents("php://input");    // 接收数据
    if (empty($requestBody)) {              // 判断数据是不是空
        die('send fail');
    }
    $content = json_decode($requestBody, true);     // 数据转换
    // 若是主分支且提交数大于 0
    if ($content['ref']=='refs/heads/main') {
     // 或将命令退出 shell 里,看集体需要 git reset --hard origin/master && git clean -f
        $res = shell_exec('cd /www/wwwroot/xxxx/ && echo `sudo git pull` >> b.log');//PHP 函数执行 git 命令
        $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);// 将每次拉取信息追加写入到日志里
    }
?>
  • [x] 至此命令 php shell 局部已实现,可依据不同我的项目需要自行调试。

    常见错误处理

    1.php.ini 文件里 shell 没有禁用 该谬误比拟常见,调试的时候很容易发现,就不再赘述。

    解决办法 将 php.ini 里的 shell_exec 删除,重启服务即可。

    2. .git 权限问题,将.git/ 目录下的文件权限组改成 www

    个别不会呈现, 当呈现权限报错,倡议先检查一下文件目录是否为你设置的权限组. 如果不是,能够应用一下命令批改文件权限组

    // 以 www 用户组为例
    chown -R www:www file/

    3. 权限组问题

    步步排查,当确定后面流程没有问题 而代码仍然没有主动拉取时. 手动执行以上 shell 如果代码胜利拉取,能够排除 shell 问题。关上日志记录,如果日志记录里的内容为空,能够尝试 应用将老版本替换为新版本的办法

    4. 呈现相似报错 Host key verification failed.^M fatal: Could not read from remote rep……

    是因为权限秘钥呈现了问题,在 www 权限组里没有创立连贯 github 的公钥
    这里作者应用的是此办法解决,如果有大佬有其余解决方案,欢送私信或评论区留言。
    vim 关上 /etc/sudoers 在 root 下增加一行 www 执行 sudo 权限免明码

    5. 完结,至此你的 webhook 就能够工作了,批改文件并提交,查问日志。

    本地环境 centos + php7.3 + nginx

退出移动版