graceful shutdown, fix tests

This commit is contained in:
Zero King
2017-08-22 11:00:41 +00:00
parent dd73a99f18
commit a2f819d2e8
6 changed files with 51 additions and 5 deletions
+16 -1
View File
@@ -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
}
}
}
+4
View File
@@ -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{}
+6
View File
@@ -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)
+4
View File
@@ -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{}
+1 -1
View File
@@ -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
View File
@@ -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() {