diff options
author | Zuul <zuul@review.opendev.org> | 2020-05-16 17:32:14 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2020-05-16 17:32:14 +0000 |
commit | 931eac4030cc7e8e1a13a1e32947db90f37219a5 (patch) | |
tree | 4ec0e70d458f61be7079186656c0317d405a099a /zuul | |
parent | 70dd710ed723ab0bfb96b6a7901a5a14178ed57b (diff) | |
parent | af2c919ca727a80170aeac396441e37b50fc753b (diff) | |
download | zuul-931eac4030cc7e8e1a13a1e32947db90f37219a5.tar.gz |
Merge "Report dequeued changes via Github checks API"
Diffstat (limited to 'zuul')
-rw-r--r-- | zuul/configloader.py | 7 | ||||
-rw-r--r-- | zuul/driver/github/githubreporter.py | 15 | ||||
-rw-r--r-- | zuul/manager/__init__.py | 19 | ||||
-rw-r--r-- | zuul/model.py | 5 | ||||
-rw-r--r-- | zuul/reporter/__init__.py | 9 |
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 |