Skip to content
Snippets Groups Projects
Commit 073c3e8b authored by Felix Hanley's avatar Felix Hanley
Browse files

Start on webhooks.v5 with pipelines

parent 2bef1b83
No related branches found
No related tags found
No related merge requests found
......@@ -22,36 +22,69 @@ import (
"net/http"
"strings"
"gopkg.in/go-playground/webhooks.v3"
"gopkg.in/go-playground/webhooks.v3/gitlab"
"gopkg.in/go-playground/webhooks.v5/gitlab"
"maunium.net/go/mautrix"
)
func addRoomToHeaders(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
room := r.URL.Query().Get("room")
if len(room) == 0 {
func handlePayload(hook *gitlab.Webhook) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
payload, err := hook.Parse(
r,
gitlab.PushEvents,
gitlab.TagEvents,
gitlab.IssuesEvents,
gitlab.CommentEvents,
gitlab.MergeRequestEvents,
gitlab.PipelineEvents,
//gitlab.ConfidentialIssuesEvents,
//gitlab.WikiPageEvents,
//gitlab.BuildEvents,
)
if err != nil {
if err == gitlab.ErrEventNotFound {
w.WriteHeader(500)
w.Write([]byte("Event not found"))
return
}
}
roomID := r.URL.Query().Get("room")
if len(roomID) == 0 {
w.WriteHeader(400)
w.Write([]byte("No room specified."))
return
}
r.Header.Set("X-Room-Id", room)
handler.ServeHTTP(w, r)
})
room := mxbot.GetRoom(roomID)
switch payload.(type) {
//case gitlab.ConfidentialIssueEventPayload:
//case gitlab.WikiPageEventPayload:
//case gitlab.BuildEventPayload:
case gitlab.PushEventPayload:
handlePushEvent(payload, *room)
case gitlab.TagEventPayload:
handleTagEvent(payload, *room)
case gitlab.IssueEventPayload:
handleIssueEvent(payload, *room)
case gitlab.CommentEventPayload:
handleCommentEvent(payload, *room)
case gitlab.MergeRequestEventPayload:
handleMergeRequestEvent(payload, *room)
case gitlab.PipelineEventPayload:
handlePipelineEvent(payload, *room)
}
w.WriteHeader(204)
return
}
}
func startWebhook() func() {
hook := gitlab.New(&gitlab.Config{Secret: config.Webhook.Secret})
hook.RegisterEvents(handlePushEvent, gitlab.PushEvents)
hook.RegisterEvents(handleTagEvent, gitlab.TagEvents)
hook.RegisterEvents(handleIssueEvent, gitlab.IssuesEvents)
hook.RegisterEvents(handleIssueEvent, gitlab.ConfidentialIssuesEvents)
hook.RegisterEvents(handleMergeRequestEvent, gitlab.MergeRequestEvents)
hook.RegisterEvents(handleCommentEvent, gitlab.CommentEvents)
hook, _ := gitlab.New(gitlab.Options.Secret(config.Webhook.Secret))
server := &http.Server{Addr: config.Webhook.Listen}
go func() {
mux := http.NewServeMux()
mux.Handle(config.Webhook.Path, addRoomToHeaders(webhooks.Handler(hook)))
mux.Handle(config.Webhook.Path, http.HandlerFunc(handlePayload(hook)))
server.Handler = mux
......@@ -66,10 +99,8 @@ func startWebhook() func() {
}
}
func handlePushEvent(payload interface{}, header webhooks.Header) {
func handlePushEvent(payload interface{}, room mautrix.Room) {
data := payload.(gitlab.PushEventPayload)
roomID := header["X-Room-Id"][0]
room := mxbot.GetRoom(roomID)
branch := strings.TrimPrefix(data.Ref, "refs/heads/")
if data.TotalCommitsCount == 0 {
......@@ -125,13 +156,11 @@ func handlePushEvent(payload interface{}, header webhooks.Header) {
}
}
func handleTagEvent(payload interface{}, header webhooks.Header) {
func handleTagEvent(payload interface{}, room mautrix.Room) {
data := payload.(gitlab.TagEventPayload)
if data.ObjectKind != "tag_push" {
return
}
roomID := header["X-Room-Id"][0]
room := mxbot.GetRoom(roomID)
tag := strings.TrimPrefix(data.Ref, "refs/tags/")
room.SendfHTML("[%[1]s/%[2]s] %[3]s created tag <a href='%[4]s/tags/%[5]s'>%[5]s</a>",
data.Project.Namespace,
......@@ -141,7 +170,7 @@ func handleTagEvent(payload interface{}, header webhooks.Header) {
tag)
}
func handleIssueEvent(payload interface{}, header webhooks.Header) {
func handleIssueEvent(payload interface{}, room mautrix.Room) {
data, ok := payload.(gitlab.IssueEventPayload)
confidential := ""
if !ok {
......@@ -153,10 +182,8 @@ func handleIssueEvent(payload interface{}, header webhooks.Header) {
confidential = "confidential "
data = data2.IssueEventPayload
}
roomID := header["X-Room-Id"][0]
room := mxbot.GetRoom(roomID)
var action = data.ObjectAttributes.Action
action := data.ObjectAttributes.Action
if action == "update" || len(action) == 0 {
return
} else if !strings.HasSuffix(action, "e") {
......@@ -174,12 +201,10 @@ func handleIssueEvent(payload interface{}, header webhooks.Header) {
data.ObjectAttributes.IID)
}
func handleMergeRequestEvent(payload interface{}, header webhooks.Header) {
func handleMergeRequestEvent(payload interface{}, room mautrix.Room) {
data := payload.(gitlab.MergeRequestEventPayload)
roomID := header["X-Room-Id"][0]
room := mxbot.GetRoom(roomID)
var action = data.ObjectAttributes.Action
action := data.ObjectAttributes.Action
if action == "update" {
return
} else if !strings.HasSuffix(action, "e") {
......@@ -196,10 +221,8 @@ func handleMergeRequestEvent(payload interface{}, header webhooks.Header) {
data.ObjectAttributes.IID)
}
func handleCommentEvent(payload interface{}, header webhooks.Header) {
func handleCommentEvent(payload interface{}, room mautrix.Room) {
data := payload.(gitlab.CommentEventPayload)
roomID := header["X-Room-Id"][0]
room := mxbot.GetRoom(roomID)
var notebookType, title string
var notebookIdentifier rune
......@@ -228,3 +251,17 @@ func handleCommentEvent(payload interface{}, header webhooks.Header) {
id,
notebookIdentifier)
}
func handlePipelineEvent(payload interface{}, room mautrix.Room) {
data := payload.(gitlab.PipelineEventPayload)
room.SendfHTML(
"[%[1]s/%[2]s] pipeline %[7]d results: %[3]s in %[4]d seconds <a href='%[5]s'>%[6]s (!%[7]d)</a>",
data.Project.Namespace,
data.Project.Name,
data.ObjectAttributes.Status,
data.ObjectAttributes.Duration,
data.ObjectAttributes.URL,
data.ObjectAttributes.Title,
data.ObjectAttributes.IID)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment