func (sq *SubmitQueue) doGithubE2EAndMerge(obj *github.MungeObject) { _, err := obj.RefreshPR() if err != nil { glog.Errorf("%d: unknown err: %v", *obj.Issue.Number, err) sq.SetMergeStatus(obj, unknown, true) return } if m, err := obj.IsMerged(); err != nil { glog.Errorf("%d: unknown err: %v", *obj.Issue.Number, err) sq.SetMergeStatus(obj, unknown, true) return } else if m { sq.SetMergeStatus(obj, merged, true) return } if mergeable, err := obj.IsMergeable(); err != nil { sq.SetMergeStatus(obj, undeterminedMergability, true) return } else if !mergeable { sq.SetMergeStatus(obj, unmergeable, true) return } body := "@k8s-bot test this [submit-queue is verifying that this PR is safe to merge]" if err := obj.WriteComment(body); err != nil { glog.Errorf("%d: unknown err: %v", *obj.Issue.Number, err) sq.SetMergeStatus(obj, unknown, true) return } // Wait for the build to start sq.SetMergeStatus(obj, ghE2EWaitingStart, true) err = obj.WaitForPending([]string{sq.E2EStatusContext, sq.UnitStatusContext}) if err != nil { s := fmt.Sprintf("Failed waiting for PR to start testing: %v", err) sq.SetMergeStatus(obj, s, true) return } // Wait for the status to go back to something other than pending sq.SetMergeStatus(obj, ghE2ERunning, true) err = obj.WaitForNotPending([]string{sq.E2EStatusContext, sq.UnitStatusContext}) if err != nil { s := fmt.Sprintf("Failed waiting for PR to finish testing: %v", err) sq.SetMergeStatus(obj, s, true) return } // Check if the thing we care about is success if ok := obj.IsStatusSuccess([]string{sq.E2EStatusContext, sq.UnitStatusContext}); !ok { sq.SetMergeStatus(obj, ghE2EFailed, true) return } if !sq.e2e.Stable() { sq.flushGithubE2EQueue(e2eFailure) sq.SetMergeStatus(obj, e2eFailure, true) return } obj.MergePR("submit-queue") sq.SetMergeStatus(obj, merged, true) return }