小忆

有梦想,有精彩

浅析Webhook

2017-05-28

在上篇文章中简单的介绍了Coding的Webhook,本文说说Coding和GitHub上的Webhook吧!GitHub或者Coding上的Webhook,是在你执行push、pull_request等操作时,GitHub或者Coding会向Webhook中填写的URL地址发起POST请求,当我们接收到发过了的POST请求可以根据不同的事件,从而来做不同的事情。

如何设置Webhook?

  1. 在GitHub中找到需要设置Webhook的仓库,进入仓库之后点击Settings -> Webhooks -> Add webhook (这时需要输入登录密码)。

    Payload URL:GitHub POST请求的地址。

    Content type:向URL中发送数据的格式,建议选择appliction/json

    Secret:认证签名,随便填写。

    接下来就是询问你想监听那些事件,有三个选项,一、仅监听push事件,二、监听所有事件,三、自定义选择需要监听的事件。

  2. 在Coding中则是找到需要设置Webhook的仓库,进入仓库之后点击设置 -> WebHook -> 新建Hook。Coding中的WebHook设置比较简单,在这里不多叙述

Webhook可以做那些事?

WebHook 可方便实现自动部署,自动测试,自动打包,监控项目变化等。

案例:基于Hexo的博客大多都建立在Pages服务上,但Pages服务访问速度往往都很慢,如果你手头正好有一台闲置的服务器,你可以通过Webhook功能实现Hexo在服务器上自动部署上线。

Webhook代码编写

我使用的是Node.js编写的,当然你也使用PHP编写。

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
var express=require('express');
var bodyParser = require('body-parser');
var proces = require('child_process');
var crypto = require('crypto')
var app=express();
app.use(bodyParser.json());
var Secret="xxx";
app.post("/deploy",function(req,res){
//console.log(req.body);
//计算签名
var sign ='sha1=';
sign+=crypto.createHmac('sha1',"xxx").update(JSON.stringify(req.body)).digest().toString('hex');
//打印GitHub传过来的事件
//console.log(req.headers['x-github-event']);

if (sign===req.headers['x-hub-signature']) {
switch(req.headers['x-github-event']){
case "ping":
proces.exec("chmod +x test.sh && sh test.sh",{'cwd':'./'},function(error, stdout, stderr){
console.log(stdout);
});
break;
default:
console.log("error");
}
// cp.exec("chmod +x test.sh && sh test.sh",{'cwd':'./'},function(error, stdout, stderr){
// console.log(stdout);
// });
}

res.send("OK");
});
app.listen(9000, function() {
console.log('Listening on port 9000');
})