This is a simple webhook dispatcher for Gitlab. It listens for incoming webhooks and dispatches them to the appropriate handler.
- π Very convenient registration of listeners
- π A single listener can implement multiple different webhook functions
- β‘ Support asynchronous and efficient processing
- π Multiple dispatch methods
go get github.com/flc1125/go-gitlab-webhook/v2
package main
import (
"context"
"net/http"
"github.com/flc1125/go-gitlab-webhook/v2"
"gitlab.com/gitlab-org/api/client-go"
)
var (
_ gitlabwebhook.BuildListener = (*testBuildListener)(nil)
_ gitlabwebhook.CommitCommentListener = (*testCommitCommentListener)(nil)
_ gitlabwebhook.BuildListener = (*testBuildAndCommitCommentListener)(nil)
_ gitlabwebhook.CommitCommentListener = (*testBuildAndCommitCommentListener)(nil)
)
type testBuildListener struct{}
func (l *testBuildListener) OnBuild(ctx context.Context, event *gitlab.BuildEvent) error {
// do something
return nil
}
type testCommitCommentListener struct{}
func (l *testCommitCommentListener) OnCommitComment(ctx context.Context, event *gitlab.CommitCommentEvent) error {
// do something
return nil
}
type testBuildAndCommitCommentListener struct{}
func (l *testBuildAndCommitCommentListener) OnBuild(ctx context.Context, event *gitlab.BuildEvent) error {
// do something
return nil
}
func (l *testBuildAndCommitCommentListener) OnCommitComment(ctx context.Context, event *gitlab.CommitCommentEvent) error {
// do something
return nil
}
func main() {
dispatcher := gitlabwebhook.NewDispatcher(
gitlabwebhook.RegisterListeners(
&testBuildListener{},
&testCommitCommentListener{},
&testBuildAndCommitCommentListener{},
),
)
dispatcher.RegisterListeners(
&testBuildListener{},
&testCommitCommentListener{},
&testBuildAndCommitCommentListener{},
)
http.Handle("/webhook", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if err := dispatcher.DispatchRequest(r,
gitlabwebhook.DispatchRequestWithContext(context.Background()), // custom context
); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusNoContent)
}))
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
MIT License. See LICENSE for the full license text.
- gitlab-org/api/client-go(Formerly known as: xanzy/go-gitlab): Go library for accessing the GitLab API
- stretchr/testify: A toolkit with common assertions and mocks that plays nicely with the standard library