使用Github的Webhook实现代码库与应用的交互
很早之前,博主的的网站评论模块已经更改为了 gitalk,Gitalk是一个基于GitHub Issue和Preact的现代评论组件。更换评论组件后有一个问题:我不想每次去github上查看别人的评论,如果别人评论了文章,然后我能够在网站后台看到,这样就很方便了。此时,github的webhook功能就可以登场了。 1. 简介 Webhook,翻译过来可以称为网络钩子,用来将Github上的一系列事件信息回传到某一回调地址上,从而完成与外部应用的交互,它是github提供的一种与外部交互的入口。Github上提供了很多交互事件,当某一事件被触发后,如果设置了Webhook的回调地址,Github将会通过HTTP POST请求将事件信息发送到回调地址上,回调处理应用通过接收事件信息然后实现自身的业务需求。 目前,每个组织或代码库上最多只能创建20个webhook。 一个典型的业务场景是:代码保存在github上,如果稳定的master分支上提交了代码,就触发持续集成系统如Jenkins进行代码构建、打包、部署等系列操作。 2. 事件 配置webhook时,可以选择订阅的事件。一般情况下,我们只需要订阅关注的事件,github也支持一个匹配所有支持事件的通配符(*),添加通配符事件时,github将使用通配符事件替换您配置的任何现有事件,并为所有支持的事件发送有效负载。如果将来添加了新的可匹配的事件,那么将会自动订阅。您可以随时通过API或UI更改订阅事件列表。默认情况下,webhooks仅订阅push事件。 每个事件对应于您的组织和/或存储库可能发生的某组操作。例如,如果您订阅了问题事件,则每次打开,关闭,标记等issue时您都会收到详细的有效负载。github现支持的事件列表见 #events[附录一]。 2.1. 有效负载 有效负载,简单理解就是消息所携带的内容和信息。 每种事件类型都具有特定的有效负载格式以及相关的事件信息,事件的有效负载来源于具体的事件类型的有效负载,但原始push事件除外,它的具有更详细的webhook有效负载。 除了为每个事件记录的字段之外,webhook有效负载还包括执行事件的用户(发送者)、组织和事件发生的存储库。GitHub app的webhook有效负载还可能包括安装事件。 一个marketplace_purchase事件类型的有效负载的示例如下: { "action":"purchased", "effective_date":"2017-10-25T00:00:00+00:00", "sender":{ "login":"username", "id":3877742, "avatar_url":"https://avatars2.githubusercontent.com/u/3877742?v=4", "gravatar_id":"", "url":"https://api.github.com/users/username", "html_url":"https://github.com/username", "followers_url":"https://api.github.com/users/username/followers", "following_url":"https://api.github.com/users/username/following{/other_user}", "gists_url":"https://api.github.com/users/username/gists{/gist_id}", "starred_url":"https://api.github.com/users/username/starred{/owner}{/repo}", "subscriptions_url":"https://api.github.com/users/username/subscriptions", "organizations_url":"https://api.github.com/users/username/orgs", "repos_url":"https://api.github.com/users/username/repos", "events_url":"https://api.github.com/users/username/events{/privacy}", "received_events_url":"https://api.github.com/users/username/received_events", "type":"User", "site_admin":true, "email":"username@email.com" }, "marketplace_purchase":{ "account":{ "type":"Organization", "id":18404719, "login":"username", "organization_billing_email":"username@email.com" }, "billing_cycle":"monthly", "unit_count":1, "on_free_trial":false, "free_trial_ends_on":null, "next_billing_date":"2017-11-05T00:00:00+00:00", "plan":{ "id":435, "name":"Basic Plan", "description":"Basic Plan", "monthly_price_in_cents":1000, "yearly_price_in_cents":10000, "price_model":"per-unit", "has_free_trial":true, "unit_name":"seat", "bullets":[ "Is Basic", "Because Basic " ] } } } 2....