利用github webhook 结合openresty自动更新静态博客

使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上。

对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就可以正常访问了。 麻烦的是博客更新的时候,还要去vps上操作更新git pull操作,如果每次在本地commit之后,github仓库能够自动更新到vps上多好啊,于是就用到了webhook的功能。(这里静态文件的生成还是在本地,只是把生成好的静态文件push到github了,所以自动部署没有构建的环节)

部署静态博客

代码clone到vps上的目录,然后配置nginx

1
2
3
4
5
6
7
8
9
 server {
listen 80;
server_name xxx.info ;

location / {
alias /www/orangle.github.io/;
index index.html index.htm;
}
}

注意下权限问题 ,配置完成reload nginx 就能访问了。

自动更新shell脚本

从github拉取代码,然后强制更新所有内容。

git_update.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#! /bin/bash

blog_dir=/path/to/git/repository
git=/usr/bin/git
branch=master

cd $blog_dir
$git reset --hard origin/$branch
$git clean -f
$git pull

dtime=`date`
echo "success $dtime" > d.txt

配置webhook

在github上配置这个项目的webhook,然后在openresty中写一个http接口来出来每次github发来的 push事件
webhook的设置文档 ,这里设置成 http://xxx.info/hook

修改nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name xxx.info www.xxx.info;
lua_code_cache on;

location / {
alias /www/orangle.github.io/;
index index.html index.htm;
}

location /hook {
content_by_lua_file /etc/nginx/hook.lua;
}
}

lua脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
local signature = ngx.req.get_headers()["X-Hub-Signature"]
local key = "xxxxxx" --github上配置的相同
if signature == nil then
return ngx.exit(404)
end

-- 校验header
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

-- 执行更新
os.execute("bash /www/blog_update.sh");
ngx.say("OK")
ngx.exit(200)

注意!github发送的请求可能playload比较大,这时候 ngx.req.get_body_data() 就无法正常获取内容,可以通过调整 client_body_buffer_size 100k; 配置来解决

参考文章