From 924e16b31aa7feccde0029d0247cab58734d8970 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Thibaut=20VAR=C3=88NE?= Date: Thu, 27 Oct 2022 13:09:17 +0200 Subject: [PATCH] phase1: switch to separate builders per branch per target MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This will simplify reporting and ensure consistent build statistics. It will also simplify prioritizing builders by branch. This also introduces a single "trigger" scheduler that will handle all trigger requests for each branch/target combination, speeding up the forcing of builds. Signed-off-by: Thibaut VARÈNE --- phase1/master.cfg | 57 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/phase1/master.cfg b/phase1/master.cfg index 1de168a..ee250e3 100644 --- a/phase1/master.cfg +++ b/phase1/master.cfg @@ -370,12 +370,45 @@ class TagChoiceParameter(BaseParameter): raise ValidationError("'%s' does not belong to list of available choices '%s'" % (s, self._choice_list)) return s +@util.renderer +@defer.inlineCallbacks +def builderNames(props): + """ since we have per branch and per target builders, + address the relevant builder for each new buildrequest + based on the request's desired branch and target. + """ + branch = props.getProperty("branch") + target = props.getProperty("target", "") + + if target == "all": + target = "" + + # if that didn't work, try sourcestamp to find a branch + if not branch: + # match builders with target branch + ss = props.sourcestamps[0] + if ss: + branch = ss['branch'] + else: + log.msg("couldn't find builder") + return [] # nothing works + + bname = branch + "_" + target + builders = [] + + for b in (yield props.master.data.get(('builders',))): + if not b['name'].startswith(bname): + continue + builders.append(b['name']) + + return builders + c['schedulers'] = [] c['schedulers'].append(AnyBranchScheduler( name = "all", change_filter = util.ChangeFilter(branch=branchNames), treeStableTimer = 15*60, - builderNames = list(targets))) + builderNames = builderNames)) c['schedulers'].append(ForceScheduler( name = "force", @@ -417,6 +450,8 @@ c['schedulers'].append(ForceScheduler( ] )) +c['schedulers'].append(schedulers.Triggerable(name="trigger", builderNames=builderNames)) + ####### BUILDERS # The 'builders' list defines the Builders, which tell Buildbot how to perform a build: @@ -559,6 +594,12 @@ for worker in c['workers']: c['workers'].append(LocalWorker("__local_force_build", max_builds=1)) force_factory = BuildFactory() +force_factory.addStep(steps.Trigger( + name = "trigger_build", + schedulerNames = [ "trigger" ], + sourceStamps = [{ "codebase": "", "branch": Property("force_branch"), "revision": Property("force_revision"), "repository": repo_url, "project": "" }], + set_properties = { "reason": Property("reason"), "tag": Property("tag"), "target": Property("target") }, +)) c['builders'].append(BuilderConfig( name = "00_force_build", @@ -1186,17 +1227,9 @@ for target in targets: hideStepIf = lambda r, s: r==results.FAILURE, )) - c['builders'].append(BuilderConfig(name=target, workernames=workerNames, factory=factory, nextBuild=GetNextBuild)) - - c['schedulers'].append(schedulers.Triggerable(name="trigger_%s" % target, builderNames=[ target ])) - force_factory.addStep(steps.Trigger( - name = "trigger_%s" % target, - description = "Triggering %s build" % target, - schedulerNames = [ "trigger_%s" % target ], - sourceStamps = [{ "codebase": "", "branch": Property("force_branch"), "revision": Property("force_revision"), "repository": repo_url, "project": "" }], - set_properties = { "reason": Property("reason"), "tag": Property("tag"), }, - doStepIf = IsTargetSelected(target), - )) + for brname in branchNames: + bldrname = brname + "_" + target + c['builders'].append(BuilderConfig(name=bldrname, workernames=workerNames, factory=factory, nextBuild=GetNextBuild)) ####### STATUS TARGETS -- 2.30.2