Github 支持为指定的仓库添加 Webhook 。借助 go-github 库可以快速实现一个 Webhook Server 。
首先为仓库添加 Webhooks 配置:
Setting
- Webhooks
- Add webhook
:
在 Payload URL
下填写服务器接口地址,Content type
选择你将要接收的数据格式类型,Secret
填写一个你喜欢的密码,用于验证数据是否来自 Github,确保其有效性。
下面也可以选择你希望响应的 Event 。
Go 代码简单实现:
1package main
2
3import (
4 "log"
5 "net/http"
6 "sync"
7
8 "github.com/google/go-github/v39/github"
9)
10
11func main() {
12 var secret = "1234567890"
13
14 http.HandleFunc("/wh", func(w http.ResponseWriter, r *http.Request) {
15 payload, err := github.ValidatePayload(r, []byte(secret))
16 if err != nil {
17 log.Printf("error validating request body: err=%s\n", err)
18 return
19 }
20 defer r.Body.Close()
21
22 event, err := github.ParseWebHook(github.WebHookType(r), payload)
23 if err != nil {
24 log.Printf("could not parse webhook: err=%s\n", err)
25 return
26 }
27 switch e := event.(type) {
28 case *github.PingEvent:
29 log.Println("Receive Ping Event", e)
30 default:
31 log.Printf("receive event : %s\n", github.WebHookType(r))
32 return
33 }
34 })
35 log.Fatal(http.ListenAndServe("127.0.0.1:5055", nil))
36}
关于布署
如果是没有线上服务器,或者想要在局域网内使用的话,可以借助内网穿透工具实现。例如 ngrok
使用方法:
进入 ngrok 官网,注册一个账号,并下载客户端
在本地服务器上,运行ngrok
./ngrok authoken 授权码
映射本地服务端口
./ngrok http 5055
ngrok 成功启动后会显示映射的外网地址,然后可以将 ngrok 地址填入上面的 Palyload URL
中了。完成整个服务的搭建。
参考