使用github webhook自动更新Hexo

什么是webhook,它是一个很方便的功能,通常他会帮我们监控某一个event,当某个事件触发的时候,会向预先设置的接口发起一个信息请求,如通过HTTP POST/PUT的形式向一个接口发起请求。

这是一个很方便的功能,最近用它实现了grafana上的channel,原因也是其很方便,当它的告警信息触发,可以POST一个信息到我们的告警接口,通过一些告警收敛,聚合规则之后,发送给对应的相关业务维护人员,也有一些服务启动脚本,如果是服务down掉也会自动调用脚本重新启动服务。

这里我们也可以方便的用webhook实现网站的自动部署,Hexo自身就是一个纯静态的页面,而github提供了webhook接口,可以监控到和仓库相关的事件发生。这里给出一个使用思路

使用xinetd来监听某个端口,当收到http request调用脚本进行一次git pull,在github配置webhook监听commit事件,当我们在本地写好文章,使用hexo g生成public目录。之后提交到github repository,当commit事件触发,向xineted监听的端口发起请求,触发一次脚本执行

配置xinetd
需要提前保证xinetd已经安装,在/etc/service定义监听的端口

1
2
[zhxfei@hk ~]$ grep '7996' /etc/services
webhook-ci 7996/tcp

配置文件:/etc/xinetd.d/webhook-ci

1
2
3
4
5
6
7
8
9
10
service webhook-ci
{
disable = no
port = 7996
socket_type = stream
protocol = tcp
wait = no
user = root
server = /webhook/webhook-ci.sh
}

webhook-ci.sh就是在端口被请求的时候所调用的脚本,很简单就三行:

1
2
3
4
5
6
#!/bin/bash
#
LOG_PATH=/webhook/xinet_webhook.log
NGINX_ROOTPATH=/var/www/html
cd ${NGINX_ROOTPATH} && git pull git@github.com:zhxfei/zhxfei.com.git &>> ${LOG_PATH}

启动xineted服务,查看是否监听在对应的端口上

注意

  • 需要保证xineted配置文件中指定的用户有这个脚本的执行权限。
  • 需要在github上添加ssh公钥让你的Nginx可以访问你的github

    在这个栗子中:需要修改nginx serverroot path/var/www/html/publicpublichexo生成的页面所在的目录

之后在你的github上配置webhook就好了。

优化
这里只是实现了一个接口可以接受请求,但是GitHub webhook那边还有很多规则我们没有遵循,比如我们没有回复这个,那么github那边就会认为没有响应,会提示service timeout,虽然这并不会影响我们的使用,但是足够不优雅。这就需要修改下xineted调用的脚本了,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
#
LOG_PATH=/webhook/xinet_webhook.log
NGINX_ROOTPATH=/var/www/html
for i in {1..9}
do
read line
done
array=(${line})
length=${array[1]}
read line
read -n ${length:0:-1} line
echo "$line" >> ${LOG_PATH}
echo -e "HTTP/1.1 200 OK"
cd ${NGINX_ROOTPATH} && git pull git@github.com:zhxfei/zhxfei.com.git &>> ${LOG_PATH}

这时候查看更新的情况:

坚持原创技术分享,您的支持将鼓励我继续创作!