Yifans_Z's Blog.

GitHub Webhook 自动部署 Hexo

字数统计: 1.1k阅读时长: 15 min
2016/07/01 Share

GitHub Pages 不被百度收录解决方案 中,思路二是通过 Dnspod 的智能 DNS 服务。简而言之就是搭建一个 Server,做一个 Blog 的镜像站,专为百度收录使用。

但是每次将新建的博客文章 PUSH 到 GitHub 后,还要再登陆 Server PULL 一下,简直是太蠢了。那有什么解决办法吗?答:GitHub Webhook。

Webhook

Webhook,也就是人们常说的钩子,是一个很有用的工具。你可以通过定制 Webhook 来监测你在 Github.com 上的各种事件,最常见的莫过于 push 事件。

如果你设置了一个监测 push 事件的 Webhook,那么每当你的这个项目有了任何提交,这个 Webhook 都会被触发,这时 Github 就会发送一个 HTTP POST 请求到你配置好的地址。

如此一来,你就可以通过这种方式去自动完成一些重复性工作;比如,你可以用 Webhook 来自动触发一些持续集成(CI)工具的运作,比如 Travis CI;又或者是通过 Webhook 去部署你的线上服务器。

Github 开发者平台的文档中对 Webhook 的所能做的事是这样描述的:

You’re only limited by your imagination.

响应 Webhook

在参考文章里博主是使用 Node.js 编写的服务端响应代码,但考虑到自己对 Node.js 不熟悉,还要部署环境,所以改用 Python 语言编写响应代码。

自己在 GitHub 搜索下 github webhooklanguage 选择 Python 便找到了 Python 编写的:razius/github-webhook-handler

自己的 VPS 是在 Bandwagon Host 上购买的,最合适的配置:

  • Self-managed service
  • SSD: 10 GB
  • RAM: 512 MB
  • CPU: 1x Intel Xeon
  • BW: 1000 GB/mo
  • Link speed: 1 Gigabit
  • VPS technology: OpenVZ/KiwiVM
  • Linux OS: 32-bit and 64-bit Centos, Debian, Ubuntu, Fedora

费用:

  • \$2.99 USD Monthly
  • \$7.99 USD Quarterly
  • \$12.99 USD Semi-Annually
  • \$19.99 USD Annually

Bandwagon Host 支持支付宝付款很是方便,优惠码:IAMSMART52J3NC 再打个 9.5 折左右。这配置有时会 (out of stock) 等等随缘会有的。

安装 Git

apt-get update
apt-get install git

clone razius/github-webhook-handler

git clone https://github.com/razius/github-webhook-handler.git

根据 github-webhook-handler Gettings started:

Installation Requirements

Install dependencies found in requirements.txt

pip install -r requirements.txt

Repository Configuration

Edit repos.json to configure repositories, each repository must be registered under the form GITHUB_USER/REPOSITORY_NAME.

{
"razius/puppet": {
"path": "/home/puppet",
"key": "MyVerySecretKey",
"action": [["git", "pull", "origin", "master"]]
},
"d3non/somerandomexample/branch:live": {
"path": "/home/exampleapp",
"key": "MyVerySecretKey",
"action": [["git", "pull", "origin", "live"],
["echo", "execute", "some", "commands", "..."]]
}
}

过程如果出现:pip: command not found 可以执行:

sudo apt-get install python-pip

Set environment variable for the repos.json config.

export REPOS_JSON_PATH=/path/to/repos.json

Start the server.

python index.py 80

clone and pull your Blog

git clone git@github.com:imzyf/imzyf.github.io.git
git pull origin master

过程如果出现:Permission denied (publickey). 可以参考:

cd ~/.ssh && ssh-keygen
cat id_rsa.pub | xclip

然后添加到你的 GitHub 账户:Settings -> SSH keys 中。

config imzyf.github.io Webhooks

首先进入你的 repo 主页,通过点击页面上的按钮 [settings] -> [Webhooks & service] 进入 Webhooks 配置主页面。也可以通过下面这个链接直接进入配置页面:

https://github.com/[ 用户名 ]/[ 仓库名称 ]/settings/hooks

此处只需要配置 Webhook 所发出的 POST 请求发往何处即可,于是我们就配置我们所需要的路径:
http://104.236.xxx.xxx:9988/deploy/。这个地址指向的就是那个能够响应 Webhook 所发出请求的服务器。

配置好 Webhook 后,Github 会发送一个 ping 来测试这个地址。如果成功了,那么这个 Webhook 前就会加上一个绿色的勾;如果你得到的是一个红色的叉,那就好好检查一下哪儿出问题了吧!

config Nginx server

最后想说的

为了一个百度收录大可不必这么麻烦,刚刚查到这些解决方案时心里也是烦的、虚的,但还是硬的头皮搞了。

过程中已经不单单是为了百度收录自己的博客,而是变成学习了东西、思考问题。这些解决方案网上都有,也不是自己创造的,但是别人的东西自己不尝试,就还是别人的。

现在百度已经收录我的博客了,imzyf.github.io 到 Server 也是自动部署的。解决问题后的快乐和信心,才是我这次最大的收获。

Reference

CATALOG
  1. 1. Webhook
  2. 2. 响应 Webhook
    1. 2.1. 安装 Git
    2. 2.2. clone razius/github-webhook-handler
      1. 2.2.1. Installation Requirements
      2. 2.2.2. Repository Configuration
      3. 2.2.3. Set environment variable for the repos.json config.
      4. 2.2.4. Start the server.
      5. 2.2.5. clone and pull your Blog
    3. 2.3. config imzyf.github.io Webhooks
    4. 2.4. config Nginx server
  3. 3. 最后想说的