使用 GitHub 的 Webhooks 自动部署 Ghost 主题
最近几天在做 Ghost 的主题 Adam,但是想要在远程调试就必须得 ssh 到服务器执行一下命令,光是 cd path/to/theme
就够烦了。于是想办法是否能让服务器自动从 github 上面 pull 代码,然后自动执行自定义命令让代码生效。
让服务器自动部署主题命令有两个方法:
用 Crond 执行周期任务,比如 1 分钟去 git 取一次。但是这样实时性其实并不那么好,并且如果任务所需负载较大 (我就是这种情况,因为主题需要用 Grunt 跑一堆命令才能生效),那就更无法接受了。
用 GitHub webhooks 监听 GitHub 发来的 HTTP POST 请求。
但是网上关于 webhooks 的资料实在是少之又少,中文的也基本上没有。自己也是弄了半天才搞明白,原谅我不是做 web 的吧,我只是一个手游客户端程序员 :D
详细资料可以在 GitHub Developer API Webhooks 找到。这里之做一些简单的说明。
GitHub Webhooks 是怎么工作的?
设置钩子
在 GitHub 上,每个仓库 (repository) 都可以设置一个或多个自己专属的钩子,且每个钩子都可以设置独立的触发事件 (Events)。
这里列举两个事件:
事件类型 | 描述 |
---|---|
push | 仓库有 push 时触发。默认事件 |
create | 当有分支或标签被创建时触发 |
delete | 当有分支或标签被删除时触发 |
下面讲一下 webhooks 的设置
- Payloads URL:当事件被触发时,GitHub 会将 POST 请求发送至改地址。
- Content type:数据格式。
- Secret: 用作给 POST 的 body 加密的字符串。采用 HMAC 算法。 HMAC hex digest of the body, using the secret as the key
事件内容
Headers 中:
头 | 描述 |
---|---|
X-Github-Event | 触发 POST 请求的事件名称。 |
X-Hub-Signature | 用设置的 Secret 加密的哈希 (如果有设置 secret 的话) |
X-Github-Delivery | 本次 POST 的全局 ID (UID) |
body 中的内容,由事件不同而不同,就不做赘述了。具体可以看 event types。
怎么使用 hooks?
其实上面说了那么多,要使用钩子其实很简单。
- 在仓库的 settings 中添加一个钩子。
- 设置 Payloads URL 为你准备监听的地址,比如
http://fancycoding.com:1234
。 - 如无必要,可以不设置 secret 加密。
- 选择监听的事件类型,我只需要监听 push,所以默认即可。
- 如果你需要监听到事件后执行 git 命令,记得把 key 加入仓库的 Deploy keys 中。(此步骤根据个人需要可选)。
- 自己写一个监听程序,解析 header 判断事件,然后执行你自己想要的命令吧。
嗯,第六步虽然说着简单但是还是要折腾一番。我折腾了大半天弄了个基于 nodejs 的监听程序 Cherry-hooks,很简单,但足够我的情景用了。
使用 GitHub 的 Webhooks 自动部署 Ghost 主题
https://robinxb.com/posts/2015/automatic-deploy-task-using-github-hooks/