// This is called on a potentially mergeable PR func (e *e2eTester) runE2ETests(client *github_api.Client, pr *github_api.PullRequest, issue *github_api.Issue) error { e.locked(func() { e.state.CurrentPR = pr }) defer e.locked(func() { e.state.CurrentPR = nil }) e.msg("Considering PR %d", *pr.Number) e.waitForStableBuilds() // if there is a 'e2e-not-required' label, just merge it. if len(*dontRequireE2E) > 0 && github.HasLabel(issue.Labels, *dontRequireE2E) { e.msg("Merging %d since %s is set", *pr.Number, *dontRequireE2E) return e.merge(client, org, project, pr) } // Ask for a fresh build e.msg("Asking PR builder to build %d", *pr.Number) body := "@k8s-bot test this [submit-queue is verifying that this PR is safe to merge]" if _, _, err := client.Issues.CreateComment(org, project, *pr.Number, &github_api.IssueComment{Body: &body}); err != nil { e.error(err) return err } // Wait for the build to start err := github.WaitForPending(client, org, project, *pr.Number) // Wait for the status to go back to 'success' ok, err := github.ValidateStatus(client, org, project, *pr.Number, []string{}, true) if err != nil { e.error(err) return err } if !ok { e.msg("Status after build is not 'success', skipping PR %d", *pr.Number) return nil } return e.merge(client, org, project, pr) }
// This is called on a potentially mergeable PR func (e *e2eTester) runE2ETests(client *github_api.Client, pr *github_api.PullRequest, issue *github_api.Issue) error { func() { e.Lock() defer e.Unlock() e.CurrentPR = pr }() // Test if the build is stable in Jenkins jenkinsClient := &jenkins.JenkinsClient{Host: *jenkinsHost} builds := strings.Split(*jobs, ",") for _, build := range builds { stable, err := jenkinsClient.IsBuildStable(build) e.msg(fmt.Sprintf("Checking build stability for %s", build)) if err != nil { e.error(err) return err } if !stable { glog.Errorf("Build %s isn't stable, skipping!", build) err := errors.New("Unstable build") e.error(err) return err } } e.msg("Build is stable.") // if there is a 'safe-to-merge' label, just merge it. if len(*dontRequireE2E) > 0 && github.HasLabel(issue.Labels, *dontRequireE2E) { e.msg(fmt.Sprintf("Merging %d since %s is set", *pr.Number, *dontRequireE2E)) return e.merge(client, org, project, pr) } // Ask for a fresh build e.msg(fmt.Sprintf("Asking PR builder to build %d", *pr.Number)) body := "@k8s-bot test this [testing build queue, sorry for the noise]" if _, _, err := client.Issues.CreateComment(org, project, *pr.Number, &github_api.IssueComment{Body: &body}); err != nil { e.error(err) return err } // Wait for the build to start err := github.WaitForPending(client, org, project, *pr.Number) // Wait for the status to go back to 'success' ok, err := github.ValidateStatus(client, org, project, *pr.Number, []string{}, true) if err != nil { e.error(err) return err } if !ok { e.msg(fmt.Sprintf("Status after build is not 'success', skipping PR %d", *pr.Number)) return nil } return e.merge(client, org, project, pr) }
// This is called on a potentially mergeable PR func runE2ETests(client *github_api.Client, pr *github_api.PullRequest, issue *github_api.Issue) error { // Test if the build is stable in Jenkins jenkinsClient := &jenkins.JenkinsClient{Host: *jenkinsHost} builds := strings.Split(*jobs, ",") for _, build := range builds { stable, err := jenkinsClient.IsBuildStable(build) glog.V(2).Infof("Checking build stability for %s", build) if err != nil { return err } if !stable { glog.Errorf("Build %s isn't stable, skipping!", build) return errors.New("Unstable build") } } glog.V(2).Infof("Build is stable.") // Ask for a fresh build glog.V(4).Infof("Asking PR builder to build %d", *pr.Number) body := "@k8s-bot test this [testing build queue, sorry for the noise]" if _, _, err := client.Issues.CreateComment(org, project, *pr.Number, &github_api.IssueComment{Body: &body}); err != nil { return err } // Wait for the build to start err := github.WaitForPending(client, org, project, *pr.Number) // Wait for the status to go back to 'success' ok, err := github.ValidateStatus(client, org, project, *pr.Number, []string{}, true) if err != nil { return err } if !ok { glog.Infof("Status after build is not 'success', skipping PR %d", *pr.Number) return nil } if !*dryrun { glog.Infof("Merging PR: %d", *pr.Number) mergeBody := "Automatic merge from SubmitQueue" if _, _, err := client.Issues.CreateComment(org, project, *pr.Number, &github_api.IssueComment{Body: &mergeBody}); err != nil { glog.Warningf("Failed to create merge comment: %v", err) return err } _, _, err := client.PullRequests.Merge(org, project, *pr.Number, "Auto commit by PR queue bot") return err } glog.Infof("Skipping actual merge because --dry-run is set") return nil }