Merge "Comment on PRs if a remote call to merge a change failed" into feature/zuulv3

This commit is contained in:
Jenkins 2017-05-25 17:13:26 +00:00 committed by Gerrit Code Review
commit 932575741e
3 changed files with 23 additions and 9 deletions

View File

@ -2,6 +2,7 @@
name: merge
description: Pipeline for merging the pull request
manager: independent
merge-failure-message: 'Merge failed'
trigger:
github:
- event: pull_request

View File

@ -335,6 +335,8 @@ class TestGithubDriver(ZuulTestCase):
self.fake_github.emitEvent(D.getCommentAddedEvent('merge me'))
self.waitUntilSettled()
self.assertFalse(D.is_merged)
self.assertEqual(len(D.comments), 1)
self.assertEqual(D.comments[0], 'Merge failed')
@simple_layout('layouts/dependent-github.yaml', driver='github')
def test_parallel_changes(self):

View File

@ -49,11 +49,14 @@ class GithubReporter(BaseReporter):
if (self._merge and
hasattr(item.change, 'number')):
self.mergePull(item)
if not item.change.is_merged:
msg = self._formatItemReportMergeFailure(pipeline, item)
self.addPullComment(pipeline, item, msg)
if self._labels or self._unlabels:
self.setLabels(item)
def addPullComment(self, pipeline, item):
message = self._formatItemReport(pipeline, item)
def addPullComment(self, pipeline, item, comment=None):
message = comment or self._formatItemReport(pipeline, item)
project = item.change.project.name
pr_number = item.change.number
self.log.debug(
@ -92,13 +95,21 @@ class GithubReporter(BaseReporter):
self.log.debug('Reporting change %s, params %s, merging via API' %
(item.change, self.config))
message = self._formatMergeMessage(item.change)
try:
self.connection.mergePull(project, pr_number, message, sha)
except MergeFailure:
time.sleep(2)
self.log.debug('Trying to merge change %s again...' % item.change)
self.connection.mergePull(project, pr_number, message, sha)
item.change.is_merged = True
for i in [1, 2]:
try:
self.connection.mergePull(project, pr_number, message, sha)
item.change.is_merged = True
return
except MergeFailure:
self.log.debug(
'Merge attempt of change %s %s/2 failed.' %
(i, item.change))
if i == 1:
time.sleep(2)
self.log.debug(
'Merge of change %s failed after 2 attempts, giving up' %
item.change)
def setLabels(self, item):
project = item.change.project.name