in prow/githubeventserver/githubeventserver.go [212:426]
func (s *serveMuxHandler) handleEvent(eventType, eventGUID string, payload []byte, h http.Header) error {
var org string
var repo string
l := logrus.WithFields(logrus.Fields{eventTypeField: eventType, github.EventGUID: eventGUID})
// We don't want to fail the webhook due to a metrics error.
if counter, err := s.metrics.WebhookCounter.GetMetricWithLabelValues(eventType); err != nil {
l.WithError(err).Warn("Failed to get metric for eventType " + eventType)
} else {
counter.Inc()
}
switch eventType {
case issuesEvent:
var i github.IssueEvent
if err := json.Unmarshal(payload, &i); err != nil {
return err
}
i.GUID = eventGUID
org = i.Repo.Owner.Login
repo = i.Repo.Name
for _, issueEventHandler := range s.issueEventHandlers {
fn := issueEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: i.Repo.Owner.Login,
github.RepoLogField: i.Repo.Name,
github.PrLogField: i.Issue.Number,
"author": i.Issue.User.Login,
"url": i.Issue.HTMLURL,
}), i)
}()
}
case issueCommentEvent:
var ic github.IssueCommentEvent
if err := json.Unmarshal(payload, &ic); err != nil {
return err
}
ic.GUID = eventGUID
org = ic.Repo.Owner.Login
repo = ic.Repo.Name
for _, issueCommentEventHandler := range s.issueCommentEventHandlers {
fn := issueCommentEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: ic.Repo.Owner.Login,
github.RepoLogField: ic.Repo.Name,
github.PrLogField: ic.Issue.Number,
"author": ic.Comment.User.Login,
"url": ic.Comment.HTMLURL,
}), ic)
}()
}
case pullRequestEvent:
var pr github.PullRequestEvent
if err := json.Unmarshal(payload, &pr); err != nil {
return err
}
pr.GUID = eventGUID
org = pr.Repo.Owner.Login
repo = pr.Repo.Name
for _, pullRequestHandler := range s.pullRequestHandlers {
fn := pullRequestHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: pr.Repo.Owner.Login,
github.RepoLogField: pr.Repo.Name,
github.PrLogField: pr.Number,
"author": pr.PullRequest.User.Login,
"url": pr.PullRequest.HTMLURL,
}), pr)
}()
}
case pullRequestReviewEvent:
var re github.ReviewEvent
if err := json.Unmarshal(payload, &re); err != nil {
return err
}
re.GUID = eventGUID
org = re.Repo.Owner.Login
repo = re.Repo.Name
for _, reviewEventHandler := range s.reviewEventHandlers {
fn := reviewEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: re.Repo.Owner.Login,
github.RepoLogField: re.Repo.Name,
github.PrLogField: re.PullRequest.Number,
"review": re.Review.ID,
"reviewer": re.Review.User.Login,
"url": re.Review.HTMLURL,
}), re)
}()
}
case pullRequestReviewCommentEvent:
var rce github.ReviewCommentEvent
if err := json.Unmarshal(payload, &rce); err != nil {
return err
}
rce.GUID = eventGUID
org = rce.Repo.Owner.Login
repo = rce.Repo.Name
for _, reviewCommentEventHandler := range s.reviewCommentEventHandlers {
fn := reviewCommentEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: rce.Repo.Owner.Login,
github.RepoLogField: rce.Repo.Name,
github.PrLogField: rce.PullRequest.Number,
"review": rce.Comment.ReviewID,
"commenter": rce.Comment.User.Login,
"url": rce.Comment.HTMLURL,
}), rce)
}()
}
case pushEvent:
var pe github.PushEvent
if err := json.Unmarshal(payload, &pe); err != nil {
return err
}
pe.GUID = eventGUID
org = pe.Repo.Owner.Login
repo = pe.Repo.Name
for _, pushEventHandler := range s.pushEventHandlers {
fn := pushEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: pe.Repo.Owner.Name,
github.RepoLogField: pe.Repo.Name,
"ref": pe.Ref,
"head": pe.After,
}), pe)
}()
}
case statusEvent:
var se github.StatusEvent
if err := json.Unmarshal(payload, &se); err != nil {
return err
}
se.GUID = eventGUID
org = se.Repo.Owner.Login
repo = se.Repo.Name
for _, statusEventHandler := range s.statusEventHandlers {
fn := statusEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: se.Repo.Owner.Login,
github.RepoLogField: se.Repo.Name,
"context": se.Context,
"sha": se.SHA,
"state": se.State,
"id": se.ID,
}), se)
}()
}
case workflowRunEvent:
var wre github.WorkflowRunEvent
if err := json.Unmarshal(payload, &wre); err != nil {
return err
}
wre.GUID = eventGUID
org = wre.Repo.Owner.Login
repo = wre.Repo.Name
for _, workflowRunEventHandler := range s.workflowRunEventHandler {
fn := workflowRunEventHandler
s.wg.Add(1)
go func() {
defer s.wg.Done()
fn(l.WithFields(logrus.Fields{
github.OrgLogField: wre.Repo.Owner.Login,
github.RepoLogField: wre.Repo.Name,
"workflow_id": wre.WorkflowRun.WorkflowID,
}), wre)
}()
}
default:
l.Debug("Ignoring unhandled event type.")
}
// Redirect event to external plugins if necessary
s.demuxExternal(l, s.getExternalPluginsForEvent(org, repo, eventType), payload, h, s.wg)
return nil
}