Merge "Catch and log url pattern formatting errors" into feature/zuulv3
This commit is contained in:
commit
2d079ab813
|
@ -14,7 +14,6 @@
|
|||
|
||||
import abc
|
||||
import copy
|
||||
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
|
@ -1251,6 +1250,7 @@ class QueueItem(object):
|
|||
holds the current `BuildSet` as well as all previous `BuildSets` that were
|
||||
produced for this `QueueItem`.
|
||||
"""
|
||||
log = logging.getLogger("zuul.QueueItem")
|
||||
|
||||
def __init__(self, queue, change):
|
||||
self.pipeline = queue.pipeline
|
||||
|
@ -1508,6 +1508,35 @@ class QueueItem(object):
|
|||
fakebuild.result = 'SKIPPED'
|
||||
self.addBuild(fakebuild)
|
||||
|
||||
def formatUrlPattern(self, url_pattern, job=None, build=None):
|
||||
url = None
|
||||
# Produce safe versions of objects which may be useful in
|
||||
# result formatting, but don't allow users to crawl through
|
||||
# the entire data structure where they might be able to access
|
||||
# secrets, etc.
|
||||
safe_change = self.change.getSafeAttributes()
|
||||
safe_pipeline = self.pipeline.getSafeAttributes()
|
||||
safe_job = job.getSafeAttributes()
|
||||
safe_build = build.getSafeAttributes()
|
||||
try:
|
||||
url = url_pattern.format(change=safe_change,
|
||||
pipeline=safe_pipeline,
|
||||
job=safe_job,
|
||||
build=safe_build)
|
||||
except KeyError as e:
|
||||
self.log.error("Error while formatting url for job %s: unknown "
|
||||
"key %s in pattern %s"
|
||||
% (job, e.message, url_pattern))
|
||||
except AttributeError as e:
|
||||
self.log.error("Error while formatting url for job %s: unknown "
|
||||
"attribute %s in pattern %s"
|
||||
% (job, e.message, url_pattern))
|
||||
except Exception:
|
||||
self.log.exception("Error while formatting url for job %s with "
|
||||
"pattern %s:" % (job, url_pattern))
|
||||
|
||||
return url
|
||||
|
||||
def formatJobResult(self, job):
|
||||
build = self.current_build_set.getBuild(job.name)
|
||||
result = build.result
|
||||
|
@ -1523,22 +1552,8 @@ class QueueItem(object):
|
|||
if job.failure_url:
|
||||
pattern = job.failure_url
|
||||
url = None
|
||||
# Produce safe versions of objects which may be useful in
|
||||
# result formatting, but don't allow users to crawl through
|
||||
# the entire data structure where they might be able to access
|
||||
# secrets, etc.
|
||||
safe_change = self.change.getSafeAttributes()
|
||||
safe_pipeline = self.pipeline.getSafeAttributes()
|
||||
safe_job = job.getSafeAttributes()
|
||||
safe_build = build.getSafeAttributes()
|
||||
if pattern:
|
||||
try:
|
||||
url = pattern.format(change=safe_change,
|
||||
pipeline=safe_pipeline,
|
||||
job=safe_job,
|
||||
build=safe_build)
|
||||
except Exception:
|
||||
pass # FIXME: log this or something?
|
||||
url = self.formatUrlPattern(pattern, job, build)
|
||||
if not url:
|
||||
url = build.url or job.name
|
||||
return (result, url)
|
||||
|
|
Loading…
Reference in New Issue