diff --git a/buildbot/osuosl/master/config/schedulers.py b/buildbot/osuosl/master/config/schedulers.py --- a/buildbot/osuosl/master/config/schedulers.py +++ b/buildbot/osuosl/master/config/schedulers.py @@ -3,7 +3,11 @@ from twisted.python import log from buildbot.plugins import schedulers, util +from buildbot.schedulers.forcesched import BaseParameter +import datetime +import json +import urllib3 # Each scheduler listens only for those projects it is interested in. # Every change comes with a comms-separated list of projects it @@ -163,19 +167,78 @@ "}") return automatic_schedulers + +class BranchParameter(BaseParameter): + spec_attributes = ["strict", "choices"] + type = "list" + strict = True + required = True + + def __init__(self, name="branch", default=None, **kwargs): + super().__init__(name, **kwargs) + self._default = default + self._choices = None + self._timestamp = None + + def parse_from_arg(self, s): + return s + + def __getattribute__(self, name: str): + if name == 'choices': + return self.get_choices() + elif name == 'default': + return self.get_default() + else: + return object.__getattribute__(self, name) + + def get_choices(self, **kwargs): + now = datetime.datetime.now() + if (self._choices is None or self._timestamp is None or + (now - self._timestamp).total_seconds() > 5*60): + self._timestamp = now + http = urllib3.PoolManager(1) + resp = http.request("GET", + "https://api.github.com/repos/llvm/llvm-project/branches", + headers={"User-Agent": "Buildbot"}) + if resp.status == 200: + branches = json.loads(resp.data) + self._choices = [b["name"] for b in branches] + self._choices.reverse() + else: + self._choices = [f"Error requesting llvm-project branches. " + "Got HTTP Status {resp.status}, response={resp.reason}"] + return self._choices + + def get_default(self): + if self._default and self.choices and self._default in self.choices: + return self._default + if self.choices: + return self.choices[0] + return None + + def getForceSchedulers(builders): # TODO: Move these settings to the configuration file. _repourl = "https://github.com/llvm/llvm-project" _branch = "main" # Walk over all builders and collect their names. + release_builders = [ + builder.name for builder in builders + if 'release' in getattr(builder, 'tags', []) + ] + scheduler_builders = [ builder.name for builder in builders + if builder.name not in release_builders ] # Create the force schedulers. + name = ["force-build-scheduler", "force-release-build-scheduler"] + builderNames = [scheduler_builders, release_builders] + defaultBranch = [_branch, None] return [ schedulers.ForceScheduler( - name = "force-build-scheduler", + name = name[i], label = "Force Build", buttonName = "Force Build", reason = util.ChoiceStringParameter( @@ -189,15 +252,13 @@ ], default = "Build a particular revision" ), - builderNames = scheduler_builders, + builderNames = builderNames[i], codebases = [ util.CodebaseParameter( codebase = "", - branch = util.StringParameter( - name = "branch", + branch = BranchParameter( label = "branch:", - size = 64, - default = _branch + default = defaultBranch[i] ), revision = util.StringParameter( name = "revision", @@ -227,7 +288,7 @@ default = False ) ] - ) + ) for i in range(2) ] # TODO: Abstract this kind of scheduler better.