使用 Webhook 自动从 GitHub 更新博客

什么是 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-urlencodedSecret 填入上面配置文件中的 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 进去手动更新的麻烦。


转载规则

《使用 Webhook 自动从 GitHub 更新博客》Konata 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
  目录