使用 GitHub 的 Webhooks 自动部署 Ghost 主题

最近几天在做 Ghost 的主题 Adam,但是想要在远程调试就必须得 ssh 到服务器执行一下命令,光是 cd path/to/theme 就够烦了。于是想办法是否能让服务器自动从 github 上面 pull 代码,然后自动执行自定义命令让代码生效。

让服务器自动部署主题命令有两个方法:

  1. 用 Crond 执行周期任务,比如 1 分钟去 git 取一次。但是这样实时性其实并不那么好,并且如果任务所需负载较大 (我就是这种情况,因为主题需要用 Grunt 跑一堆命令才能生效),那就更无法接受了。

  2. 用 GitHub webhooks 监听 GitHub 发来的 HTTP POST 请求。

但是网上关于 webhooks 的资料实在是少之又少,中文的也基本上没有。自己也是弄了半天才搞明白,原谅我不是做 web 的吧,我只是一个手游客户端程序员 :D

详细资料可以在 GitHub Developer API Webhooks 找到。这里之做一些简单的说明。


GitHub Webhooks 是怎么工作的?

设置钩子

在 GitHub 上,每个仓库 (repository) 都可以设置一个或多个自己专属的钩子,且每个钩子都可以设置独立的触发事件 (Events)。

这里列举两个事件:

事件类型描述
push仓库有 push 时触发。默认事件
create当有分支或标签被创建时触发
delete当有分支或标签被删除时触发

下面讲一下 webhooks 的设置

事件内容

Headers 中:

描述
X-Github-Event触发 POST 请求的事件名称。
X-Hub-Signature用设置的 Secret 加密的哈希 (如果有设置 secret 的话)
X-Github-Delivery本次 POST 的全局 ID (UID)

body 中的内容,由事件不同而不同,就不做赘述了。具体可以看 event types


怎么使用 hooks?

其实上面说了那么多,要使用钩子其实很简单。

  1. 在仓库的 settings 中添加一个钩子。
  2. 设置 Payloads URL 为你准备监听的地址,比如 http://fancycoding.com:1234
  3. 如无必要,可以不设置 secret 加密。
  4. 选择监听的事件类型,我只需要监听 push,所以默认即可。
  5. 如果你需要监听到事件后执行 git 命令,记得把 key 加入仓库的 Deploy keys 中。(此步骤根据个人需要可选)。
  6. 自己写一个监听程序,解析 header 判断事件,然后执行你自己想要的命令吧。

嗯,第六步虽然说着简单但是还是要折腾一番。我折腾了大半天弄了个基于 nodejs 的监听程序 Cherry-hooks,很简单,但足够我的情景用了。

使用 GitHub 的 Webhooks 自动部署 Ghost 主题

https://robinxb.com/posts/2015/automatic-deploy-task-using-github-hooks/

作者

薯条

发布于

2014-07-04

更新于

2024-01-15

许可协议

评论