package main import ( "log" "net/http" "os" "os/exec" "gopkg.in/go-playground/webhooks.v5/github" ) const path = "/" func onPush(w http.ResponseWriter, payload github.PushPayload) { if (payload.Ref != "refs/heads/master") { log.Printf("No-op: ref '%s' isn't of interest", payload.Ref) return } cmd := exec.Command("/bin/bash", "on-push.sh") cmd.Stdout = w cmd.Stderr = w err := cmd.Run() if err != nil { log.Println("Bash exec error: %s", err.Error()) return } log.Println("Bash exec successful") } func main() { secret := os.Getenv("GITHUB_WEBHOOK_SECRET") if secret == "" { log.Println("Please provide a webhook secret with the GITHUB_WEBHOOK_SECRET environment variable.") return } hook, _ := github.New(github.Options.Secret(secret)) http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { log.Println("New payload") payload, err := hook.Parse(r, github.PushEvent) if err != nil { if err != github.ErrEventNotFound { log.Println("Error: %#v\n", err) } return } switch typedPayload := payload.(type) { case github.PushPayload: onPush(w, typedPayload) default: log.Printf("Unknown payload type.\n%#v\n", typedPayload) } }) log.Println("Listening") http.ListenAndServe(":4000", nil) }