phase1: switch to separate builders per branch per target
authorThibaut VARÈNE <hacks@slashdirt.org>
Thu, 27 Oct 2022 11:09:17 +0000 (13:09 +0200)
committerPetr Štetiar <ynezz@true.cz>
Mon, 15 May 2023 15:36:01 +0000 (17:36 +0200)
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 <hacks@slashdirt.org>
phase1/master.cfg

index 1de168a047e8e32c23087cd2567bf13cb34108ff..ee250e30bc45702352b2c9da44ef17758b3ba09f 100644 (file)
@@ -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