什么是 Webhook
Webhook 就像一个回调函数,允许当设定的 GitHub 事件被触发时,发送特定的请求到指定的 URL。利用这一点,我们可以在将本地博客提交至 GitHub 时,自动发送通知到博客服务器,执行 git pull 操作来更新服务器上的文件。
使用 webhook 工具当作监听程序
有一个叫 webhook 工具可以帮我们执行监听并执行脚本的工作。官方文档上有比较详细的安装与配置教程。
我的配置文件:
{
"id": "hexo-webhook",
"execute-command": "/home/hexo-redeploy-webhook.sh",
"command-working-directory": "/home",
"trigger-rule":
{
"and":
[
{
"match":
{
"type": "payload-hash-sha1",
"secret": "secret",
"parameter":
{
"source": "header",
"name": "X-Hub-Signature"
}
}
}
]
}
}
打开 Github 的 Webhook 功能
在 GitHub 上相应仓库的 Settings 中找到 Webhook 功能,添加一个钩子, Payload URL
填入服务器监听地址, Content type
选择 application/x-www-form-urlencoded
, Secret
填入上面配置文件中的 secret
,钩子触发中选择 push 事件,勾选 Active,这样 GitHub 端就配置完成了。
编写自动更新脚本
因为服务器的 webhook 触发之后执行的是一个命令,还需要一个 shell 脚本来对博客部署目录进行更新。
脚本如下,因为国内网络到 GitHub 的连通性奇差,所以加入了拉取失败重试的机制。
#! /bin/bash
cd /srv/nginx/hexo_root
retry=0
while [[ "$retry" -lt 5 ]]
do
git reset --hard HEAD
git pull
if [ $? -eq 0 ]; then
echo "Hexo git pull SUCCESS."
break
fi
retry= `expr ${retry} + 1`
echo "Hexo git pull FAIL. Retrying $retry time(s)."
done
一个坑
git 如果要设置代理的话,一定要使用git config --system https.proxy socks5://127.0.0.1:1080
设置,不要使用--global
参数设置
之后每当博客更新执行 hexo deploy
的时候,服务器端就会自动更新页面了,免去了 SSH 进去手动更新的麻烦。