GitHub Webhooks的实现

因为GitHub太方便,太流行,加上没被GWF拉黑(这里要感谢李开复老师)。所以即使国内淘宝,CSDN,开源中国,甚至京东等都在做分布式代码托管服务也撼动不了GitHub在国内的地位和用户量。用GitHub做代码托管除了能装逼和给自己看外(大部份都是写给自己看的,没人会去关心你的代码),确实用着太爽了!这里有一篇Git的入门文章,喜欢的朋友可点击。Git的一些使用技巧 http://blog.it2048.cn/article\_gitanything.html

比较详细的Git教程,我推荐廖雪峰老师写的。地址在这:http://www.liaoxuefeng.com/

熟话说拜师不如访友,访友不如交手。所以我在访友的时候,朋友说他的代码都是push到线上测试的(本地不搭建PHP环境)。我问他这样不是每次都要到服务器去pull,多麻烦?他说GitHub出了Webhooks工具可以自己设置。然后我去测试通过之后,发现能节约大量的时间,于是之后的项目都设置了Webhooks。

GitHub Webhooks可以监听很多事件,最常用的就是监听push事件。每次我们push代码到GitHub后,GitHub会去调用我们设置的http链接,然后我们在自己的服务器上通过脚本去执行git pull。为了安全,GitHub在访问链接的时候会传回一个加密串和明文,服务器为了安全起见需要去验证访问是否来自GitHub。

一.设置教程

首先,打开项目首页,然后点击右边栏的Settings,
然后会看到右边栏的菜单项,点击添加WebHook,然后实际填写信息就OK

服务器端的代码,需要自己去写脚本(代码的格式有点痛苦)

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
/\*\*  
\* 自动pull
\*/
public function actionGit()
{
$secret = '密钥';
//获取http 头
$headers = array();
//Apache服务器才支持getallheaders函数
if (!function\_exists('getallheaders')) {
foreach ($\_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP\_') {
$headers\[str\_replace(' ', '-', ucwords(strtolower(str\_replace('\_', ' ', substr($name, 5)))))\] = $value;
}
}
}else
{
headers = getallheaders();
}
//github发送过来的签名
$hubSignature = $headers\['X-Hub-Signature'\];
list($algo, $hash) = explode('=', $hubSignature, 2);

// 获取body内容
$payload = file\_get\_contents('php://input');

// 计算签名
$payloadHash = hash\_hmac($algo, $payload, $secret);

// 判断签名是否匹配
if ($hash === $payloadHash) {
//调用shell
echo exec("/data/Git.sh");
}
}