OpenResty+GitHub WebHook 自动更新代码

兔鞠mari

本文大部分代码取自这里:利用github webhook自动更新hexo

起因

vtuber开播提醒

在去年给QQ机器人加了个检查各个vtuber直播开启提醒的功能,原理是不断对某个接口轮询(接口写法见用openresty(Lua)写一个获取YouTube直播状态的接口)。不过这个的效率很感人,而且感觉有些废资源(因为http接口返回时间有点点常。。。)

上个月的时候,给机器人加上了MQTT功能。加上之后我就开始着手直播体系改造了,

以前的流程是这样的:

现在改成了这样:

对机器人那端来说变得很简单了,同时只有开播那一刻才会和机器人有数据交互,而之前是每次查询都返回完整的开播信息,比原来更省流量。

服务端使用python,通过cron来实现定时检查,发现开播后立刻发mqtt消息。

问题

这个问题就是,因为GitHub上的数据不是我维护的,监控列表是另一个人在维护,同时因为我懒得更新代码,所以急需一套自动更新代码的逻辑来及时更新监控列表。

配置webhook

由于GitHub自带了push后推webhook的功能,只需要打开就可以了:

配置openresty

在openresty合适的地方加上lua文件的配置:

#检查脚本更新webhook
location /live {
  default_type text/plain;
  content_by_lua_file /home/xxx/live.lua;
}

然后新建文件加上功能:

local signature = ngx.req.get_headers()["X-Hub-Signature"]
local key = "填上上面webhook设置的secret"
if signature == nil then
    return ngx.exit(404)
end
ngx.req.read_body()
local t = {}
for k, v in string.gmatch(signature, "(%w+)=(%w+)") do
    t[k] = v
end
local str = require "resty.string"
local digest = ngx.hmac_sha1(key, ngx.req.get_body_data())
if not str.to_hex(digest) == t["sha1"] then
    return ngx.exit(404)
end
local result = os.execute("cd /home/xxx/v-live-check/ && git pull")
--local result = os.execute("cd /home/xxx/ && git clone https://github.com/chenxuuu/v-live-check.git")
ngx.say("OK,"..tostring(result))
ngx.exit(200)

注释的那句是因为手动clone下来初始化仓库,会发现openresty没权限。。。所以你可以用openresty来clone仓库,就不会遇到后期pull没权限的问题了。。

测试

手动push一下,看看有没有更新

发表评论

您的电子邮箱地址不会被公开。