[Go] 添加 Github Webhook

Github 支持为指定的仓库添加 Webhook 。借助 go-github 库可以快速实现一个 Webhook Server 。

首先为仓库添加 Webhooks 配置:

Setting - Webhooks - Add webhook :

https://cdn.jsdelivr.net/gh/roninro/blog@main/img/github-webhook.png

Payload URL 下填写服务器接口地址,Content type 选择你将要接收的数据格式类型,Secret 填写一个你喜欢的密码,用于验证数据是否来自 Github,确保其有效性。 下面也可以选择你希望响应的 Event 。

Go 代码简单实现:

 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
36
package main

import (
	"log"
	"net/http"
	"sync"

	"github.com/google/go-github/v39/github"
)

func main() {
	var secret = "1234567890"

	http.HandleFunc("/wh", func(w http.ResponseWriter, r *http.Request) {
		payload, err := github.ValidatePayload(r, []byte(secret))
		if err != nil {
			log.Printf("error validating request body: err=%s\n", err)
			return
		}
		defer r.Body.Close()

		event, err := github.ParseWebHook(github.WebHookType(r), payload)
		if err != nil {
			log.Printf("could not parse webhook: err=%s\n", err)
			return
		}
		switch e := event.(type) {
		case *github.PingEvent:
			log.Println("Receive Ping Event", e)
		default:
			log.Printf("receive event : %s\n", github.WebHookType(r))
			return
		}
	})
	log.Fatal(http.ListenAndServe("127.0.0.1:5055", nil))
}

关于布署

如果是没有线上服务器,或者想要在局域网内使用的话,可以借助内网穿透工具实现。例如 ngrok

使用方法:

  1. 进入 ngrok 官网,注册一个账号,并下载客户端

  2. 在本地服务器上,运行ngrok

    ./ngrok authoken 授权码

  3. 映射本地服务端口

    ./ngrok http 5055

https://cdn.jsdelivr.net/gh/roninro/blog@main/img/WX20210918-150216.png

ngrok 成功启动后会显示映射的外网地址,然后可以将 ngrok 地址填入上面的 Palyload URL 中了。完成整个服务的搭建。

参考