首页 > 编程语言 >部署PHP+Swoole实现自动更新项目的GitHub Webhooks

部署PHP+Swoole实现自动更新项目的GitHub Webhooks

时间:2023-06-25 17:34:32浏览次数:51  
标签:www GitHub Swoole request event 自动更新 Webhooks PHP response

前言

在项目开发过程中,每次需要手动登录服务器并执行git pull命令来更新代码,这样非常繁琐和耗时。为了简化这个过程,我们可以利用GitHub的Webhooks功能,结合PHP和Swoole来编写一个自动更新项目的接口脚本。

实现步骤

以下是实现自动更新项目的GitHub Webhooks的步骤:

  1. 首先,你得有一个github项目,进入github项目,点击设置 -》webhooks-》add webhook
    • 配置Payload URL:将Payload URL设置为你自己服务器的脚本地址。
    • 选择Content type:如果你用的是swoole部署的自动更新脚本,那么需要确保请求是application/x-www-form-urlencoded或multipart/form-data格式发送的。如果content-type不是这俩种类型swoole可能无法正确解析post数据。所以webhooks的content
      type需要配置为application/x-www-form-urlencoded
    • 填写“Secret”,后续接口校验会用到
    • 选择"Which events would you like to trigger this webhook?":我这边选择“Just the push event.”,当推送时触发webhook
    • 保存并更新Webhook配置。
  2. 确保已经安装了Swoole扩展
  3. 创建一个名为GitWebhook的PHP类,用于处理GitHub Webhooks的请求。
    • 在OnRequest方法中,获取请求的URI,并检查是否为有效的目录。
    • 校验请求的事件类型,确保为推送事件。
    • 获取请求的签名,并使用密钥进行校验。
    • 解析请求中的JSON数据,提取相关的提交信息,如提交ID、作者、提交消息等。
    • 执行git pull命令来更新项目代码,并将执行结果保存在一个变量中。
    • 在控制台输出更新日志和执行结果。
    • 响应GitHub Webhooks请求,返回更新成功的消息。
  4. 启动Swoole HTTP 服务:php GitWebhook.php

以下是GitWebhook类的PHP代码:

class GitWebhook
{
    public $http;
    public $dir = [
        'fastadmin',
        'chat',
    ];
    private $secret = '20230625';//密钥

    public function __construct()
    {
        $this->http = new Swoole\Http\Server('0.0.0.0', 9501);
        $this->http->on('Request', [$this, 'OnRequest']);
        $this->http->start();
    }

    /**
     * @param $request
     * @param $response
     */
    public function OnRequest($request, $response)
    {
        $uri = trim($request->server['request_uri'], '/');
        if (!in_array($uri, $this->dir, true)) {
            $response->status(500);
            $this->show($request, $response, '目录丢失');
            return;
        }

        $event = $request->header['x-github-event'] ?? '';
        if ($event !== 'push') {
            $response->status(500);
            $this->show($request, $response, '错误事件:' . $event);
            return;
        }
        // 签名
        $signature = $request->header['x-hub-signature-256'] ?? '';
        if (!$signature) {
            $response->status(403);
            $this->show($request, $response, '没有权限');
            return;
        }
        list($algo, $hash) = explode('=', $signature, 2);

       /*需要确保请求是application/x-www-form-urlencoded或multipart/form-data格式发送的。如果content-type不是这俩种类型,swoole可能无法正确解析post数据。
       所以webhooks的content type需要配置为application/x-www-form-urlencoded*/
        $_hash = hash_hmac($algo, $request->rawContent(), $this->secret);
        //校验
        if ($hash !== $_hash) {
            $response->status(403);
            $this->show($request, $response, '没有权限');
            return;
        }

        $payload = json_decode($request->post['payload'], true);
        $commit  = $payload['head_commit']['id'];
        $author  = $payload['head_commit']['author']['name'];
        $message = $payload['head_commit']['message'];

        echo "【{$uri}】 " . date('Y-m-d H:i:s') . ": Push event received. Commit: {$commit}, Author: {$author}, Message: {$message}\n";
        $output = shell_exec("cd /www/{$uri} && git pull 2>&1");
        echo $output . PHP_EOL;

        $response->end(' Webhook 更新成功.');
    }

    private function show($request, $response, $msg)
    {
        print_r($request->header, null);
        echo $msg, PHP_EOL;

        $response->end($msg);
    }
}

(new GitWebhook());

测试

随便修改提交文件,观察控制台是否有以下内容输出:

root@57b11c01f356:/www/fastadmin/swoole# php GitWebhook.php 
【chat】 2023-06-25 08:05:15: Push event received. Commit: 156037988721162341e4b24df328ab9db2e79abe, Author: **, Message: 测试webhook
From github.com:**/chat
   4a5a5f2..1560379  main       -> origin/main
Updating 4a5a5f2..1560379
Fast-forward
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

看到类似上面内容输出说明测试成功了。

这时候你也可以到webhooks的Recent Deliveries 查看最最新一条记录body返回内容是否为:"Webhook 更新成功."

标签:www,GitHub,Swoole,request,event,自动更新,Webhooks,PHP,response
From: https://www.cnblogs.com/aj407blogs/p/17503524.html

相关文章

  • github.com 打不开的准确方法
    解决方法:打开网站http://tool.chinaz.com/dns/,在A类型中填写github.com,再点击监测按钮复制下面任意一个ip打开电脑文件C:\Windows\System32\drivers\etc下的host文件在host文件的最后一刚加入刚才复制的IP20.205.243.166    github.com5.win+R打开cmd命窗口,执行......
  • Could not resolve type alias 'com.github.mybatis.helper.page.PageSqlInterceptor'
    报错信息 Couldnotresolvetypealias'com.github.mybatis.helper.page.PageSqlInterceptor'.Cause:java.lang.ClassNotFoundException:Cannotfindclass:com.github.mybatis.helper.page.PageSqlInterceptor 原因报错的位置是 mybatis-config.xml 文件中......
  • PHP用Swoole的WebSocket功能编写聊天室Demo
    前提:linux环境下PHP有可用的Swoole扩展。9501端口可访问。后端<?phpclassHelper{/***@function将数组中的null值转化为空字符串*@param$arrarray要转化的数组*@returnarray*@othervoid*/publicstaticfuncti......
  • go使用 github.com/influxdata/influxdb/client/v2 写数据到 influxdb
    转载请注明出处:接入示例使用github.com/influxdata/influxdb/client/v2依赖包向InfluxDB写入数据的示例代码:packagemainimport("fmt""log""time""github.com/influxdata/influxdb/client/v2")const(MyDB=&......
  • 如何使用 GitHub Copilot:提示、技巧和用例
    生成式人工智能编码工具正在改变开发人员处理日常编码任务的方式。从记录我们的代码库到生成单元测试,这些工具有助于加快我们的工作流程。然而,就像任何新兴技术一样,总是有一个学习曲线。因此,当人工智能驱动的编码助手无法生成他们想要的输出时,开发人员(无论是初学者还是经验丰富的......
  • 关于搭建github+hexo博客一些问题的解决
    最近通过github和hexo搭建博客时,遇到一些问题,这里写一篇博客记录一下他们的解决方法,顺便推荐几篇关于搭建博客的教程https://zhuanlan.zhihu.com/p/60578464https://firstfan119.github.io/2019/12/06/hexo-build-up/个人环境 Hexod报错hexod远程部署报错,报错信息如下:......
  • [转]火狐浏览器访问github提示:未连接:有潜在的安全问题...github.com 启用了被称为 HTT
    火狐浏览器访问github,提示:       未连接:有潜在的安全问题;       Firefox检测到潜在的安全威胁,并因github.com要求安全连接而没有继续。如果这种情况是因为使用DevSidecar而引起的,可以使用以下方式解决:在地址栏输入:about:config在搜索框输入:security.en......
  • JPA在事务结束时自动更新查询数据
    目录现象产生的原因解决方法现象最近解决了一个困惑几天的bug,数据库里的某一些记录莫名其妙的被刷新了,排查过代码跟应用日志,可以确定不是代码执行的更新。直到今天看到了一条日志,在事务提交时报错“Column'user_name'cannotbenull”,在出错的事务中,针对这一个表只会执行query......
  • luffy项目 之 导出项目依赖、前台首页固定样式、git介绍和安装、git,github,gitee,gitlab
    目录一、导出项目依赖二、前台首页固定样式三、git介绍和安装四、git,github,gitee,gitlab的介绍五、git工作流程六、git常用命令七、git的回退到某个版本命令八、git忽略文件总结一、导出项目依赖#以后所有python项目的根路径下,都会有个requirements.txt【约定俗称的名字】,这里......
  • 04导出项目依赖,首页推荐课程前端,git介绍安装,git,github,gitee,gitlab,git使用流程,常用命令
    补充-字段类:DateTimeField的属性: -auto_now_add:这个字段新增的时候,可以不传,会以当前时间存入 -这样写,配置文件中:USE_TZ=False写成true,和fasle的区别 -auto_now:更新这条记录,会把当前时间存入 -update更新-对象.属......