Webhook 进行网站自动化部署

Webhook 是什么?

Webhook,也就是人们常说的钩子,是一个很有用的工具。Webhook 允许第三方应用监听 Github.com 上的特定事件,在这些事件发生时通过 HTTP POST 方式通知( 超时5秒) 到第三方应用指定的 Web URL。 例如项目有新的内容 Push,或是 Merge Request 有更新等。 WebHook 可方便用户实现自动部署,自动测试,自动打包,监控项目变化等。

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

Webhook使用场景

实际工作中,经常有这样的场景,本地提交代码到git仓库以后需要网站远程自动同步代码, 大概流程如下图:

Webhook

Webhook自动化部署

1.为了响应 Webhook 发出的请求,从而做一些我们想做的事情,我们得先实现一个响应服务器。本文采用 Node 来实现一个原型,你当然也可以用 PHP,python 等, 这里使用了github-webhook-handler插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const http = require('http')
const createHandler = require('github-webhook-handler')
const handler = createHandler({ path: '/webhook', secret: 'myhashsecret' })
const exec = require('child_process').exec

var commands = [
'cd .././blog',
'git clean -df',
'git pull'
].join(' && ')

http.createServer(function (req, res) {
console.log(req.url)
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)

handler.on('error', function (err) {
console.error('Error:', err.message)
})

handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref)

//执行通关exec做操作,也可以尝试用sh脚本
exec(commands, function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: ' + error.code);
}
console.log('博客更新 deploy');
});

})

handler.on('issues', function (event) {
console.log('Received an issue event for %s action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title)
})

例如 deploy.sh

1
2
3
4
5
6
7
8
//执行通关exec做操作,也可以尝试用sh脚本
exec('sh deploy.sh', function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: ' + error.code);
}
console.log('博客更新 deploy');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

WEB_PATH='/www/blog/'

echo "Start deployment"

cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
echo "Finished."

配置 Webhook

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

Webhook

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

Webhook

参考资料:

Webhook

coding Webhook

github-webhook-handler