Merge "Don't load dynamic layout twice unless needed" into feature/zuulv3

This commit is contained in:
Zuul 2017-10-06 21:42:45 +00:00 committed by Gerrit Code Review
commit 51e8e28fc8
2 changed files with 43 additions and 12 deletions

View File

@ -430,27 +430,39 @@ class PipelineManager(object):
import zuul.configloader
loader = zuul.configloader.ConfigLoader()
self.log.debug("Loading dynamic layout")
(trusted_updates, untrusted_updates) = item.includesConfigUpdates()
build_set = item.current_build_set
try:
# First parse the config as it will land with the
# full set of config and project repos. This lets us
# catch syntax errors in config repos even though we won't
# actually run with that config.
self.log.debug("Loading dynamic layout (phase 1)")
loader.createDynamicLayout(
item.pipeline.layout.tenant,
build_set.files,
include_config_projects=True,
scheduler=self.sched,
connections=self.sched.connections)
if trusted_updates:
self.log.debug("Loading dynamic layout (phase 1)")
loader.createDynamicLayout(
item.pipeline.layout.tenant,
build_set.files,
include_config_projects=True,
scheduler=self.sched,
connections=self.sched.connections)
# Then create the config a second time but without changes
# to config repos so that we actually use this config.
self.log.debug("Loading dynamic layout (phase 2)")
layout = loader.createDynamicLayout(
item.pipeline.layout.tenant,
build_set.files,
include_config_projects=False)
if untrusted_updates:
self.log.debug("Loading dynamic layout (phase 2)")
layout = loader.createDynamicLayout(
item.pipeline.layout.tenant,
build_set.files,
include_config_projects=False)
else:
# We're a change to a config repo (with no untrusted
# items ahead), so just use the most recently
# generated layout.
if item.item_ahead:
return item.item_ahead.layout
else:
return item.queue.pipeline.layout
self.log.debug("Loading dynamic layout complete")
except zuul.configloader.ConfigurationSyntaxError as e:
self.log.info("Configuration syntax error "

View File

@ -1520,6 +1520,25 @@ class QueueItem(object):
def wasDequeuedNeedingChange(self):
return self.dequeued_needing_change
def includesConfigUpdates(self):
includes_trusted = False
includes_untrusted = False
tenant = self.pipeline.layout.tenant
item = self
while item:
if item.change.updatesConfig():
(trusted, project) = tenant.getProject(
item.change.project.canonical_name)
if trusted:
includes_trusted = True
else:
includes_untrusted = True
if includes_trusted and includes_untrusted:
# We're done early
return (includes_trusted, includes_untrusted)
item = item.item_ahead
return (includes_trusted, includes_untrusted)
def isHoldingFollowingChanges(self):
if not self.live:
return False