[Go] 添加 Github Webhook

Posted by RoninRo on Sat, Sep 18, 2021

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

使用方法:

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

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

    ./ngrok authoken 授权码

  3. 映射本地服务端口

    ./ngrok http 5055

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

参考