summaryrefslogtreecommitdiff
path: root/zuul
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-05-16 17:32:14 +0000
committerGerrit Code Review <review@openstack.org>2020-05-16 17:32:14 +0000
commit931eac4030cc7e8e1a13a1e32947db90f37219a5 (patch)
tree4ec0e70d458f61be7079186656c0317d405a099a /zuul
parent70dd710ed723ab0bfb96b6a7901a5a14178ed57b (diff)
parentaf2c919ca727a80170aeac396441e37b50fc753b (diff)
downloadzuul-931eac4030cc7e8e1a13a1e32947db90f37219a5.tar.gz
Merge "Report dequeued changes via Github checks API"
Diffstat (limited to 'zuul')
-rw-r--r--zuul/configloader.py7
-rw-r--r--zuul/driver/github/githubreporter.py15
-rw-r--r--zuul/manager/__init__.py19
-rw-r--r--zuul/model.py5
-rw-r--r--zuul/reporter/__init__.py9
5 files changed, 47 insertions, 8 deletions
diff --git a/zuul/configloader.py b/zuul/configloader.py
index f985804c6..b999bd0c4 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -1151,6 +1151,7 @@ class PipelineParser(object):
'merge-failure': 'merge_failure_actions',
'no-jobs': 'no_jobs_actions',
'disabled': 'disabled_actions',
+ 'dequeue': 'dequeue_actions',
}
def __init__(self, pcontext):
@@ -1200,6 +1201,7 @@ class PipelineParser(object):
'merge-failure-message': str,
'no-jobs-message': str,
'footer-message': str,
+ 'dequeue-message': str,
'dequeue-on-new-patchset': bool,
'ignore-dependencies': bool,
'post-review': bool,
@@ -1218,7 +1220,7 @@ class PipelineParser(object):
pipeline['reject'] = self.getDriverSchema('reject')
pipeline['trigger'] = vs.Required(self.getDriverSchema('trigger'))
for action in ['enqueue', 'start', 'success', 'failure',
- 'merge-failure', 'no-jobs', 'disabled']:
+ 'merge-failure', 'no-jobs', 'disabled', 'dequeue']:
pipeline[action] = self.getDriverSchema('reporter')
return vs.Schema(pipeline)
@@ -1247,6 +1249,9 @@ class PipelineParser(object):
"Starting {pipeline.name} jobs.")
pipeline.enqueue_message = conf.get('enqueue-message', "")
pipeline.no_jobs_message = conf.get('no-jobs-message', "")
+ pipeline.dequeue_message = conf.get(
+ "dequeue-message", "Build canceled."
+ )
pipeline.dequeue_on_new_patchset = conf.get(
'dequeue-on-new-patchset', True)
pipeline.ignore_dependencies = conf.get(
diff --git a/zuul/driver/github/githubreporter.py b/zuul/driver/github/githubreporter.py
index 2c9ccec34..a5a509623 100644
--- a/zuul/driver/github/githubreporter.py
+++ b/zuul/driver/github/githubreporter.py
@@ -213,11 +213,16 @@ class GithubReporter(BaseReporter):
pr_number = item.change.number
sha = item.change.patchset
- # Check if the buildset is finished or not. In case it's finished, we
- # must provide additional parameters when updating the check_run via
- # the Github API later on.
- completed = item.current_build_set.result is not None
status = self._check
+ # We declare a item as completed if it either has a result
+ # (success|failure) or a dequeue reporter is called (cancelled in case
+ # of Github checks API). For the latter one, the item might or might
+ # not have a result, but we still must set a conclusion on the check
+ # run. Thus, we cannot rely on the buildset's result only, but also
+ # check the state the reporter is going to report.
+ completed = (
+ item.current_build_set.result is not None or status == "cancelled"
+ )
log.debug(
"Updating check for change %s, params %s, context %s, message: %s",
@@ -313,6 +318,6 @@ def getSchema():
'unlabel': scalar_or_list(str),
'review': v.Any('approve', 'request-changes', 'comment'),
'review-body': str,
- 'check': v.Any("in_progress", "success", "failure"),
+ 'check': v.Any("in_progress", "success", "failure", "cancelled"),
})
return github_reporter
diff --git a/zuul/manager/__init__.py b/zuul/manager/__init__.py
index ee0f2c241..fdce0c7b7 100644
--- a/zuul/manager/__init__.py
+++ b/zuul/manager/__init__.py
@@ -169,6 +169,19 @@ class PipelineManager(metaclass=ABCMeta):
self.log.error("Reporting item start %s received: %s" %
(item, ret))
+ def reportDequeue(self, item):
+ if not self.pipeline._disabled:
+ self.log.info(
+ "Reporting dequeue, action %s item%s",
+ self.pipeline.dequeue_actions,
+ item,
+ )
+ ret = self.sendReport(self.pipeline.dequeue_actions, item)
+ if ret:
+ self.log.error(
+ "Reporting item dequeue %s received: %s", item, ret
+ )
+
def sendReport(self, action_reporters, item, message=None):
"""Sends the built message off to configured reporters.
@@ -371,6 +384,12 @@ class PipelineManager(metaclass=ABCMeta):
log = get_annotated_logger(self.log, item.event)
log.debug("Removing change %s from queue", item.change)
item.queue.dequeueItem(item)
+ # In case a item is dequeued that doesn't have a result yet
+ # (success/failed/...) we report it as dequeued.
+ # Without this check, all items with a valid result would be reported
+ # twice.
+ if not item.current_build_set.result and item.live:
+ self.reportDequeue(item)
def removeItem(self, item):
log = get_annotated_logger(self.log, item.event)
diff --git a/zuul/model.py b/zuul/model.py
index a5dd8827d..a1e3d3dc4 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -261,6 +261,7 @@ class Pipeline(object):
self.footer_message = None
self.enqueue_message = None
self.start_message = None
+ self.dequeue_message = None
self.post_review = False
self.dequeue_on_new_patchset = True
self.ignore_dependencies = False
@@ -276,6 +277,7 @@ class Pipeline(object):
self.merge_failure_actions = []
self.no_jobs_actions = []
self.disabled_actions = []
+ self.dequeue_actions = []
self.disable_at = None
self._consecutive_failures = 0
self._disabled = False
@@ -295,7 +297,8 @@ class Pipeline(object):
self.failure_actions +
self.merge_failure_actions +
self.no_jobs_actions +
- self.disabled_actions
+ self.disabled_actions +
+ self.dequeue_actions
)
def __repr__(self):
diff --git a/zuul/reporter/__init__.py b/zuul/reporter/__init__.py
index ac5f371d6..da3c606b4 100644
--- a/zuul/reporter/__init__.py
+++ b/zuul/reporter/__init__.py
@@ -123,7 +123,8 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
'failure': self._formatItemReportFailure,
'merge-failure': self._formatItemReportMergeFailure,
'no-jobs': self._formatItemReportNoJobs,
- 'disabled': self._formatItemReportDisabled
+ 'disabled': self._formatItemReportDisabled,
+ 'dequeue': self._formatItemReportDequeue,
}
return format_methods[self._action]
@@ -208,6 +209,12 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
else:
return self._formatItemReport(item)
+ def _formatItemReportDequeue(self, item, with_jobs=True):
+ msg = item.pipeline.dequeue_message
+ if with_jobs:
+ msg += '\n\n' + self._formatItemReportJobs(item)
+ return msg
+
def _getItemReportJobsFields(self, item):
# Extract the report elements from an item
config = self.connection.sched.config