mirror of
https://github.com/macports/mpbot-github.git
synced 2026-07-13 03:18:39 -07:00
graceful shutdown, fix tests
This commit is contained in:
+16
-1
@@ -4,6 +4,8 @@ import (
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/macports/mpbot-github/pr/cron"
|
||||
"github.com/macports/mpbot-github/pr/db"
|
||||
@@ -40,5 +42,18 @@ func main() {
|
||||
}
|
||||
go cronManager.Start()
|
||||
|
||||
webhook.NewReceiver(*webhookAddr, hookSecret, botSecret, prodFlag, dbHelper).Start()
|
||||
receiver := webhook.NewReceiver(*webhookAddr, hookSecret, botSecret, prodFlag, dbHelper)
|
||||
go receiver.Start()
|
||||
|
||||
sigChan := make(chan os.Signal)
|
||||
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
||||
// TODO: SIGTERM cancels PR processing.
|
||||
sigLoop:
|
||||
for sig := range sigChan {
|
||||
switch sig {
|
||||
case syscall.SIGINT, syscall.SIGTERM:
|
||||
receiver.Shutdown()
|
||||
break sigLoop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,10 @@ func (receiver *Receiver) handleIssueComment(body []byte) {
|
||||
if r := recover(); r != nil {
|
||||
log.Println(r)
|
||||
}
|
||||
|
||||
if !receiver.testing {
|
||||
receiver.wg.Done()
|
||||
}
|
||||
}()
|
||||
|
||||
event := &github.IssueCommentEvent{}
|
||||
|
||||
@@ -17,6 +17,10 @@ func (receiver *Receiver) handlePullRequest(body []byte) {
|
||||
if r := recover(); r != nil {
|
||||
log.Println(r)
|
||||
}
|
||||
|
||||
if !receiver.testing {
|
||||
receiver.wg.Done()
|
||||
}
|
||||
}()
|
||||
|
||||
event := &github.PullRequestEvent{}
|
||||
@@ -29,6 +33,8 @@ func (receiver *Receiver) handlePullRequest(body []byte) {
|
||||
owner := *event.Repo.Owner.Login
|
||||
repo := *event.Repo.Name
|
||||
|
||||
log.Println("PR #" + strconv.Itoa(number) + " " + *event.Action)
|
||||
|
||||
ports, files, err := receiver.githubClient.ListChangedPortsAndFiles(owner, repo, number)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
|
||||
@@ -13,6 +13,10 @@ func (receiver *Receiver) handlePullRequestReview(body []byte) {
|
||||
if r := recover(); r != nil {
|
||||
log.Println(r)
|
||||
}
|
||||
|
||||
if !receiver.testing {
|
||||
receiver.wg.Done()
|
||||
}
|
||||
}()
|
||||
|
||||
event := &github.PullRequestReviewEvent{}
|
||||
|
||||
@@ -66,7 +66,7 @@ func TestHandlePullRequest(t *testing.T) {
|
||||
{number: 1, sender: "jverne", title: "z: update to 1.1", body: "Fixes CVE-0000-0.", labels: []string{"maintainer: none", "type: update", "type: security fix"}},
|
||||
{number: 2, sender: "jverne", title: "upx-devel: new port", labels: []string{"type: submission"}},
|
||||
{number: 3, sender: "l2dy", title: "upx: update to 1.1", labels: []string{"maintainer", "maintainer: open", "type: update", "by: member"}},
|
||||
{number: 3, sender: "jverne", title: "upx: update to 1.1", comment: "Notifying maintainers:\n@_l2dy for port upx.\n\nBy a harmless bot.", labels: []string{"maintainer: open", "type: update"}},
|
||||
{number: 3, sender: "jverne", title: "upx: update to 1.1", comment: "Notifying maintainers:\n@_l2dy for port upx.\n", labels: []string{"maintainer: open", "type: update"}},
|
||||
{number: 3, sender: "jverne", title: "upx: update to 1.1", body: "<!-- [skip notification] -->", labels: []string{"maintainer: open", "type: update"}},
|
||||
}
|
||||
for _, prt := range prTests {
|
||||
|
||||
+20
-3
@@ -1,6 +1,7 @@
|
||||
package webhook
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/hmac"
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
@@ -15,19 +16,20 @@ import (
|
||||
)
|
||||
|
||||
type Receiver struct {
|
||||
listenAddr string
|
||||
server *http.Server
|
||||
hookSecret []byte
|
||||
production bool
|
||||
testing bool
|
||||
githubClient githubapi.Client
|
||||
dbHelper db.DBHelper
|
||||
wg sync.WaitGroup
|
||||
members *map[string]bool
|
||||
membersLock sync.RWMutex
|
||||
}
|
||||
|
||||
func NewReceiver(listenAddr string, hookSecret []byte, botSecret string, production bool, dbHelper db.DBHelper) *Receiver {
|
||||
return &Receiver{
|
||||
listenAddr: listenAddr,
|
||||
server: &http.Server{Addr: listenAddr},
|
||||
hookSecret: hookSecret,
|
||||
production: production,
|
||||
githubClient: githubapi.NewClient(botSecret),
|
||||
@@ -51,20 +53,25 @@ func (receiver *Receiver) Start() {
|
||||
return
|
||||
}
|
||||
|
||||
receiver.wg.Add(1)
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
receiver.wg.Done()
|
||||
return
|
||||
}
|
||||
|
||||
if !receiver.checkMAC(body, sig) {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
receiver.wg.Done()
|
||||
return
|
||||
}
|
||||
|
||||
switch r.Header.Get("X-GitHub-Event") {
|
||||
case "":
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
receiver.wg.Done()
|
||||
return
|
||||
case "pull_request":
|
||||
go receiver.handlePullRequest(body)
|
||||
@@ -72,6 +79,10 @@ func (receiver *Receiver) Start() {
|
||||
go receiver.handlePullRequestReview(body)
|
||||
case "issue_comment":
|
||||
go receiver.handleIssueComment(body)
|
||||
default:
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
receiver.wg.Done()
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
@@ -79,7 +90,13 @@ func (receiver *Receiver) Start() {
|
||||
|
||||
go receiver.updateMembers()
|
||||
|
||||
http.ListenAndServe(receiver.listenAddr, mux)
|
||||
receiver.server.Handler = mux
|
||||
receiver.server.ListenAndServe()
|
||||
}
|
||||
|
||||
func (receiver *Receiver) Shutdown() {
|
||||
receiver.server.Shutdown(context.Background())
|
||||
receiver.wg.Wait()
|
||||
}
|
||||
|
||||
func (receiver *Receiver) updateMembers() {
|
||||
|
||||
Reference in New Issue
Block a user