Merge "Catch and log url pattern formatting errors" into feature/zuulv3

This commit is contained in:
Jenkins 2017-04-26 21:14:12 +00:00 committed by Gerrit Code Review
commit 2d079ab813
1 changed files with 31 additions and 16 deletions

View File

@ -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)