func handlePullRequest(w http.ResponseWriter, r *http.Request) { log.Debugf("Got a pull request hook") // parse the pull request body, err := ioutil.ReadAll(r.Body) if err != nil { log.Errorf("Error reading github pull request handler body: %v", err) w.WriteHeader(500) return } prHook, err := octokat.ParsePullRequestHook(body) if err != nil { log.Errorf("Error parsing pull request hook: %v", err) w.WriteHeader(500) return } pr := prHook.PullRequest baseRepo := fmt.Sprintf("%s/%s", pr.Base.Repo.Owner.Login, pr.Base.Repo.Name) log.Infof("Received GitHub pull request notification for %s %d (%s): %s", baseRepo, pr.Number, pr.URL, prHook.Action) // ignore everything we don't care about if prHook.Action != "opened" && prHook.Action != "reopened" && prHook.Action != "synchronize" { log.Debugf("Ignoring PR hook action %q", prHook.Action) return } g := github.GitHub{ AuthToken: config.GHToken, User: config.GHUser, } valid, err := g.DcoVerified(prHook) if err != nil { log.Errorf("Error validating DCO: %v", err) w.WriteHeader(500) return } // DCO not valid, we don't start the build if !valid { log.Errorf("Invalid DCO for %s #%d. Aborting build", baseRepo, pr.Number) w.WriteHeader(200) return } mergeable, err := g.IsMergeable(prHook) if err != nil { log.Errorf("Error checking if PR is mergeable: %v", err) w.WriteHeader(500) return } // PR is not mergeable, so don't start the build if !mergeable { log.Errorf("Unmergeable PR for %s #%d. Aborting build", baseRepo, pr.Number) w.WriteHeader(200) return } // get the builds builds, err := config.getBuilds(baseRepo, false) if err != nil { log.Error(err) w.WriteHeader(500) return } // schedule the jenkins builds for _, build := range builds { if err := config.scheduleJenkinsBuild(baseRepo, pr.Number, build); err != nil { log.Error(err) w.WriteHeader(500) } } return }