github的webhook是个有用的功能,容许开发人员指定一个服务器的url。当开发者对github仓库施加操做,好比提交代码,建立issue时,github网站会自动向该url指定的服务器推送事件。借助webhook,咱们能够实现不少自动化流程。好比部署一个应用在AWS上,本地提交代码后,github网站自动触发webhook,调用AWS上应用的逻辑,在AWS上将本地提交的最新代码用git pull抓取到AWS上并从新部署。node
下面咱们经过一个具体的例子来学习github webhook的用法。git
新建一个github仓库,点击Settings连接:github
在Payload url里指定一个应用的url,该url对应的应用监听github网站推送的事件。web
Content Type指定成application/json便于咱们在nodejs应用里解析payload。 json
建立后点Add webhook保存,github会发送一个json paload到这个url指定的应用上。 服务器
在Recent Deliveries里查看负载明细: app
负载明细以下:框架
咱们如今来作个实验,把webhook指定的url对应的应用设置一个断点,而后在github仓库里新建一个issue:frontend
断点当即触发了。学习
从调试器里能观察到这个create issue事件的全部负载。
我部署在AWS上监听github webhook框架推送github repository发生变化的事件的应用源代码,能够从个人github上获取: https://github.com/i042416/webhookstudy
代码很短,个人同事Haytham写的:
var http = require('http') var createHandler = require('github-webhook-handler') var handler = createHandler({ path: '/push', secret: 'dis-koi' }) function run_cmd(cmd, args, callback) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = ""; child.stdout.on('data', function(buffer) { resp += buffer.toString(); }); child.stdout.on('end', function() { callback (resp) }); } http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404 res.end('no such location') }) }).listen(8083) handler.on('error', function (err) { console.error('Error:', err.message); }) handler.on('push', function (event) { switch(event.payload.repository.name) { case 'githubHook': //this push event is from my persional github account, as SAP github.tool's github hook do not work, so I use this one to test push event console.log("reveive a push event from githubHook"); run_cmd('sh', ['./webshop.sh'], function(text){ console.log(text) }); break; case 'frontend-web': //push event from frontend-web console.log("reveive a push event from frontend-web"); run_cmd('sh', ['./webshop.sh'], function(text){ console.log(text) }); break; case 'backend-ms': //push event from backenf-ms console.log("reveive a push event from backend-ms"); run_cmd('sh', ['./backend_ms.sh'], function(text){ console.log(text) }); break; } }) 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); })
要获取更多Jerry的原创文章,请关注公众号"汪子熙":