• git实现服务器自动push拉取代码--webhooks


    前言:我们在进行git代码维护时,每次本地push代码,都要去服务器再进行pull代码的拉取,以保证代码本地和线上的一致性,但是频繁的拉取是非常繁琐的,特别是大项目要进行多个服务器代码同步时,这时候就用到了webhooks(网络钩子)这个东西。

    部署使用例子

    ps:注意我这里全程用到的是码云进行测试举例,其他的都大同小异

    1. 去git仓库创建webhooks
      在这里插入图片描述

    2. 添加钩子文件 执行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()));
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
    3. 修改.git/config文件url

      url = https://账号:密码@gitee.com/xiangyuphp/项目名.git

      在这里插入图片描述

    4. php.ini 文件里shell 没有禁用

      处理方法 将php.ini 里的shell_exec删除,重启服务即可
      (重启php:systemctl restart php-fpm)

    5. 修改.git里的文件权限

      chmod -R 777 .git/FETCH_HEAD

    测试

    点击测试就可以看到返回信息,是否成功
    在这里插入图片描述

    日志

    每次本地提交代码时,会在public/下生成git-webhook.txt日志文件,记录webhooks运行日志
    在这里插入图片描述

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

    如果您觉得本篇对你有帮助,可以点关注,给个赞,支持一下,过程有遇到什么问题也欢迎评论私信,进行交流

  • 相关阅读:
    Jansson库中的json_delete函数
    spring中基础核心接口总结
    docker容器管理-实操命令
    AIGC|从革新内容创作到社会共识建立,迎接全新技术维度
    解决json_decode解析返回null空值
    解析Spring中的循环依赖问题:再探三级缓存(AOP)
    MySQL之短时间提高性能的措施
    01 MIT线性代数-方程组的几何解释
    数据结构练习题——图(算法设计题)
    Python操作XML文件
  • 原文地址:https://blog.csdn.net/qq_36303853/article/details/125472281