Skip to content

Commit a1e5ce3

Browse files
authored
respond immediately to github webhook (#1819)
* resond to github webhook immediately and process request in the background
1 parent 6ea944a commit a1e5ce3

File tree

2 files changed

+24
-35
lines changed

2 files changed

+24
-35
lines changed

backend/controllers/github.go

+23-34
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,6 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9-
"log"
10-
"math/rand"
11-
"net/http"
12-
"net/url"
13-
"os"
14-
"path"
15-
"reflect"
16-
"strconv"
17-
"strings"
18-
199
"github.com/diggerhq/digger/backend/ci_backends"
2010
"github.com/diggerhq/digger/backend/locking"
2111
"github.com/diggerhq/digger/backend/segment"
@@ -27,6 +17,15 @@ import (
2717
orchestrator_scheduler "github.com/diggerhq/digger/libs/scheduler"
2818
"github.com/google/uuid"
2919
"gorm.io/gorm"
20+
"log"
21+
"math/rand"
22+
"net/http"
23+
"net/url"
24+
"os"
25+
"path"
26+
"reflect"
27+
"strconv"
28+
"strings"
3029

3130
"github.com/diggerhq/digger/backend/middleware"
3231
"github.com/diggerhq/digger/backend/models"
@@ -96,35 +95,16 @@ func (d DiggerController) GithubAppWebHook(c *gin.Context) {
9695
c.String(http.StatusOK, "OK")
9796
return
9897
}
99-
err = handleIssueCommentEvent(gh, event, d.CiBackendProvider, appId64)
100-
if err != nil {
101-
log.Printf("handleIssueCommentEvent error: %v", err)
102-
c.String(http.StatusAccepted, err.Error())
103-
return
104-
}
105-
106-
log.Printf("executing issue comment event post hooks:")
107-
for _, hook := range d.GithubWebhookPostIssueCommentHooks {
108-
err := hook(gh, event, d.CiBackendProvider)
109-
if err != nil {
110-
log.Printf("handleIssueCommentEvent post hook error: %v", err)
111-
c.String(http.StatusAccepted, err.Error())
112-
return
113-
}
114-
}
98+
handleIssueCommentEvent(gh, event, d.CiBackendProvider, appId64, d.GithubWebhookPostIssueCommentHooks)
11599
case *github.PullRequestEvent:
116100
log.Printf("Got pull request event for %d", *event.PullRequest.ID)
117-
err = handlePullRequestEvent(gh, event, d.CiBackendProvider, appId64)
118-
if err != nil {
119-
log.Printf("handlePullRequestEvent error: %v", err)
120-
c.String(http.StatusAccepted, err.Error())
121-
return
122-
}
101+
// run it as a goroutine to avoid timeouts
102+
go handlePullRequestEvent(gh, event, d.CiBackendProvider, appId64)
123103
default:
124104
log.Printf("Unhandled event, event type %v", reflect.TypeOf(event))
125105
}
126106

127-
c.JSON(200, "ok")
107+
c.JSON(http.StatusAccepted, "ok")
128108
}
129109

130110
func GithubAppSetup(c *gin.Context) {
@@ -641,7 +621,7 @@ func getBatchType(jobs []orchestrator_scheduler.Job) orchestrator_scheduler.Digg
641621
}
642622
}
643623

644-
func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.IssueCommentEvent, ciBackendProvider ci_backends.CiBackendProvider, appId int64) error {
624+
func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.IssueCommentEvent, ciBackendProvider ci_backends.CiBackendProvider, appId int64, postCommentHooks []IssueCommentHook) error {
645625
installationId := *payload.Installation.ID
646626
repoName := *payload.Repo.Name
647627
repoOwner := *payload.Repo.Owner.Login
@@ -871,6 +851,15 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
871851
commentReporterManager.UpdateComment(fmt.Sprintf(":x: TriggerDiggerJobs error: %v", err))
872852
return fmt.Errorf("error triggering Digger Jobs")
873853
}
854+
855+
log.Printf("executing issue comment event post hooks:")
856+
for _, hook := range postCommentHooks {
857+
err := hook(gh, payload, ciBackendProvider)
858+
if err != nil {
859+
log.Printf("handleIssueCommentEvent post hook error: %v", err)
860+
return fmt.Errorf("error during postevent hooks: %v", err)
861+
}
862+
}
874863
return nil
875864
}
876865

backend/controllers/github_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ func TestGithubHandleIssueCommentEvent(t *testing.T) {
706706
var payload github.IssueCommentEvent
707707
err := json.Unmarshal([]byte(issueCommentPayload), &payload)
708708
assert.NoError(t, err)
709-
err = handleIssueCommentEvent(gh, &payload, nil, 0)
709+
err = handleIssueCommentEvent(gh, &payload, nil, 0, make([]IssueCommentHook, 0))
710710
assert.NoError(t, err)
711711

712712
jobs, err := models.DB.GetPendingParentDiggerJobs(nil)

0 commit comments

Comments
 (0)