blob: 994507fc3ff65bb2db0b3ac79704842e769c1bd7 [file] [log] [blame]
# TODO: Reconsile builders with explicitly set schedulers detection.
from twisted.python import log
from buildbot.plugins import schedulers, util
# Each scheduler listens only for those projects it is interested in.
# Every change comes with a comms-separated list of projects it
# affects, and we want to schedule a build if one of them is
# at interest.
def isProjectOfInterest(cp, projects_of_interest):
if cp:
changed_projects = frozenset(cp.split(','))
if changed_projects.intersection(projects_of_interest):
return True
return False
# Since we have many parametric builders, we dynamically build the minimum set
# of schedulers, which covers all actually used combinations of dependencies.
def getSingleBranchSchedulers(
builders,
explicitly_set_schedulers = None,
**kwargs):
"""
I'm taking over all of not yet assigned builders with the
declared source code dependencies, and automatically generate
a minimum set of SingleBranchSchedulers to handle all the declared
source code dependency combinations.
"""
builders_with_explicit_schedulers = set()
if explicitly_set_schedulers:
# TODO: Make a list of builder names with already set schedulers.
# builders_with_explicit_schedulers.add(builder)
pass
# For the builders created with LLVMBuildFactory or similar,
# we always use automatic schedulers,
# unless schedulers already explicitly set.
builders_with_automatic_schedulers = [
builder for builder in builders
if builder.name not in builders_with_explicit_schedulers
if getattr(builder.factory, 'depends_on_projects', None)
]
filter_branch = 'master'
treeStableTimer = kwargs.get('treeStableTimer', None)
automatic_schedulers = []
# Do we have any to take care of?
if builders_with_automatic_schedulers:
# Let's reconsile first to get a unique set of dependencies.
# We need a set of unique sets of dependent projects.
set_of_dependencies = set([
frozenset(getattr(b.factory, 'depends_on_projects'))
for b in builders_with_automatic_schedulers
])
for projects in set_of_dependencies:
sch_builders = [
b.name
for b in builders_with_automatic_schedulers
if frozenset(getattr(b.factory, 'depends_on_projects')) == projects
]
automatic_scheduler_name = filter_branch + ":" + ",".join(sorted(projects))
automatic_schedulers.append(
schedulers.SingleBranchScheduler(
name=automatic_scheduler_name,
treeStableTimer=kwargs.get('treeStableTimer', None),
reason="Merge to github %s branch" % filter_branch,
builderNames=sch_builders,
change_filter=util.ChangeFilter(
project_fn= \
lambda c, projects_of_interest=frozenset(projects):
isProjectOfInterest(c, projects_of_interest),
branch=filter_branch)
)
)
log.msg(
"Generated SingleBranchScheduler: { name='%s'" % automatic_scheduler_name,
", builderNames=", sch_builders,
", change_filter=", projects, " (branch: %s)" % filter_branch,
", treeStableTimer=%s" % treeStableTimer,
"}")
return automatic_schedulers
# TODO: Move these settings to the configuration file.
_repourl = "https://github.com/llvm/llvm-project"
_branch = "master"
def getForceSchedulers(builders):
# Walk over all builders and collect their names.
scheduler_builders = [
builder.name for builder in builders
]
# Create the force schedulers.
return [ schedulers.ForceScheduler(
name = "force-build-scheduler",
label = "Force Build",
buttonName = "Force Build",
reason = util.ChoiceStringParameter(
name = "reason",
label = "reason:",
required = True,
choices = [
"Build a particular revision",
"Force clean build",
"Narrow down blamelist",
],
default = "Build a particular revision"
),
builderNames = scheduler_builders,
codebases = [
util.CodebaseParameter(
codebase = "",
branch = util.FixedParameter(
name = "branch",
default = _branch
),
revision = util.StringParameter(
name = "revision",
label = "revision:",
size = 45,
default = ''
),
repository = util.FixedParameter(
name = "repository",
default = _repourl
),
project = util.FixedParameter(
name = "project",
default = "llvm" # All projects depend on llvm
)
)
],
properties = [
util.BooleanParameter(
name = "clean",
label = "Clean source code and build directory",
default = False
),
util.BooleanParameter(
name = "clean_obj",
label = "Clean build directory",
default = False
)
]
)
]
# TODO: Abstract this kind of scheduler better.
def getLntSchedulers():
project = "lnt"
lnt_builders = [
"publish-lnt-sphinx-docs",
]
return [
schedulers.SingleBranchScheduler(
name="lnt-scheduler",
treeStableTimer=kwargs.get('treeStableTimer', None),
reason="Merge to LNT github {} branch".format(filter_branch),
builderNames=lnt_builders,
change_filter=util.ChangeFilter(
project_fn=project,
branch=filter_branch)),
schedulers.ForceScheduler(
name = "force-build-scheduler",
label = "Force Build",
buttonName = "Force Build",
reason = util.ChoiceStringParameter(
name = "reason",
label = "reason:",
required = True,
choices = [
"Build a particular revision",
"Force clean build",
"Narrow down blamelist",
],
default = "Build a particular revision"
),
builderNames = lnt_builders,
codebases = [
util.CodebaseParameter(
codebase = "",
branch = util.FixedParameter(
name = "branch",
default = _branch
),
revision = util.StringParameter(
name = "revision",
label = "revision:",
size = 45,
default = ''
),
repository = util.FixedParameter(
name = "repository",
default = _repourl
),
project = util.FixedParameter(
name = "project",
default = project
)
)
],
properties = [
util.BooleanParameter(
name = "clean",
label = "Clean source code and build directory",
default = False
),
util.BooleanParameter(
name = "clean_obj",
label = "Clean build directory",
default = False
)
]
),
]