def loadBuilderConfig(c, is_test_mode_enabled=False, master_prefix_path='./'): config = json.load(open(os.path.join(master_prefix_path, 'config.json'))) if is_test_mode_enabled: passwords = {} else: passwords = json.load(open(os.path.join(master_prefix_path, 'passwords.json'))) checkWorkersAndBuildersForConsistency(config, config['workers'], config['builders']) checkValidSchedulers(config, config['schedulers']) c['workers'] = [Worker(worker['name'], passwords.get(worker['name'], 'password'), max_builds=worker.get('max_builds', 1)) for worker in config['workers']] if is_test_mode_enabled: c['workers'].append(Worker('local-worker', 'password', max_builds=1)) c['builders'] = [] for builder in config['builders']: builder['tags'] = getTagsForBuilder(builder) factory = globals()[builder['factory']] builder['description'] = builder.pop('shortname') if 'icon' in builder: del builder['icon'] factorykwargs = {} for key in ['platform', 'configuration', 'architectures', 'triggers', 'remotes', 'additionalArguments', 'runTests', 'triggered_by']: value = builder.pop(key, None) if value: factorykwargs[key] = value builder['factory'] = factory(**factorykwargs) if is_test_mode_enabled: builder['workernames'].append('local-worker') c['builders'].append(builder) c['prioritizeBuilders'] = prioritizeBuilders c['schedulers'] = [] for scheduler in config['schedulers']: schedulerClassName = scheduler.pop('type') schedulerClass = globals()[schedulerClassName] if (schedulerClassName == 'Try_Userpass'): # FIXME: Read the credentials from local file on disk. scheduler['userpass'] = [(os.getenv('BUILDBOT_TRY_USERNAME', 'sampleuser'), os.getenv('BUILDBOT_TRY_PASSWORD', 'samplepass'))] c['schedulers'].append(schedulerClass(**scheduler)) if is_test_mode_enabled: forceScheduler = ForceScheduler( name="force_build", buttonName="Force Build", builderNames=[str(builder['name']) for builder in config['builders']], # Disable default enabled input fields: branch, repository, project, additional properties codebases=[CodebaseParameter("", revision=FixedParameter(name="revision", default=""), repository=FixedParameter(name="repository", default=""), project=FixedParameter(name="project", default=""), branch=FixedParameter(name="branch", default=""))], # Add custom properties needed properties=[StringParameter(name="patch_id", label="Patch attachment id number (not bug number)", required=True, maxsize=7), StringParameter(name="ews_revision", label="WebKit git sha1 hash to checkout before trying patch (optional)", required=False, maxsize=40)], ) c['schedulers'].append(forceScheduler)
def test_bad_codebases(self): # cant specify both codebases and branch/revision/project/repository: self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=['foo'], branch=StringParameter('name'))) self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=['foo'], revision=StringParameter('name'))) self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=['foo'], project=StringParameter('name'))) self.assertRaisesConfigError("ForceScheduler: Must either specify 'codebases' or the 'branch/revision/repository/project' parameters:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=['foo'], repository=StringParameter('name'))) # codebases must be a list of either string or BaseParameter types self.assertRaisesConfigError("ForceScheduler: 'codebases' must be a list of strings or CodebaseParameter objects:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=[123],)) self.assertRaisesConfigError("ForceScheduler: 'codebases' must be a list of strings or CodebaseParameter objects:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=[IntParameter('foo')],)) # codebases cannot be empty self.assertRaisesConfigError("ForceScheduler: 'codebases' cannot be empty; use CodebaseParameter(codebase='', hide=True) if needed:", lambda: ForceScheduler(name='foo', builderNames=['bar'], codebases=[]))
def test_bad_codebases(self): # cant specify both codebases and branch/revision/project/repository: self.assertRaises(ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=['foo'], branch=StringParameter('name')) self.assertRaises(ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=['foo'], revision=StringParameter('name')) self.assertRaises(ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=['foo'], project=StringParameter('name')) self.assertRaises(ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=['foo'], repository=StringParameter('name')) # codebases must be a list of either string or BaseParameter types self.assertRaises( ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=[123], ) self.assertRaises( ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=[IntParameter('foo')], ) # codebases cannot be empty self.assertRaises(ValidationError, ForceScheduler, name='foo', builderNames=['bar'], codebases=[])
def get_schedulers(): from buildbot.schedulers.basic import SingleBranchScheduler from buildbot.schedulers.basic import AnyBranchScheduler from buildbot.schedulers.forcesched import ForceScheduler from buildbot.schedulers.forcesched import StringParameter from buildbot.schedulers.forcesched import FixedParameter from buildbot.plugins import util import builders return [ SingleBranchScheduler( name='master', reason='main repository source code modification', builderNames=['coverity'], treeStableTimer=20, change_filter=util.ChangeFilter(branch='master')), AnyBranchScheduler(name='default', reason='main repository source code modification', builderNames=builders.get_builder_names(), treeStableTimer=20), ForceScheduler( name='force', reason=StringParameter(name="reason", default="manual build", size=100), builderNames=builders.get_builder_names(), codebases=[ util.CodebaseParameter( "", label="Codebase", branch=StringParameter(name="branch", default="master", size=100), revision=StringParameter(name="revision", default="", size=100), repository=StringParameter( name="repository", default="https://github.com/SFML/SFML.git", regex=r"^https://github.com/[\w-]*/[\w-]*\.git$", size=100), project=StringParameter(name="project", default="SFML", size=100), ) ], properties=[util.FixedParameter(name="trigger", default="force")]) ]
def test_NestedParameter_nullname(self): # same as above except "p1" and "any" are skipped fields = [ NestedParameter(name="inner", fields=[ StringParameter(name='str'), AnyPropertyParameter(name='') ]), IntParameter(name="foo"), NestedParameter(name='bar', fields=[ NestedParameter( name='', fields=[AnyPropertyParameter(name='a')]), NestedParameter( name='', fields=[AnyPropertyParameter(name='b')]) ]) ] self.do_ParameterTest(req=dict(foo='123', inner_str="bar", inner_name="hello", inner_value="world", reason="because", bar_a_name="a", bar_a_value="7", bar_b_name="b", bar_b_value="8"), expect=dict(foo=123, inner=dict(str="bar", hello="world"), bar={'a': '7', 'b': '8'}), expectKind=dict, klass=NestedParameter, fields=fields, name='')
def getSchedulers(): return [ AnyBranchScheduler( name="flocker", treeStableTimer=5, builderNames=BUILDERS, # Only build certain branches because problems arise when we build # many branches such as queues and request limits. change_filter=ChangeFilter(branch_fn=build_automatically), codebases={ "flocker": { "repository": GITHUB + b"/flocker" }, }, ), ForceScheduler( name="force-flocker", codebases=[ CodebaseParameter( "flocker", branch=StringParameter("branch", default="master", size=80), repository=FixedParameter("repository", default=GITHUB + b"/flocker"), ), ], properties=[ report_expected_failures_parameter, ], builderNames=BUILDERS, ), ]
def get_schedulers() : from buildbot.schedulers.basic import AnyBranchScheduler from buildbot.schedulers.forcesched import ForceScheduler from buildbot.schedulers.forcesched import StringParameter from buildbot.schedulers.forcesched import FixedParameter from buildbot.plugins import util import builders return [ AnyBranchScheduler( name = 'default', reason = 'main repository source code modification', builderNames = builders.get_builder_names(), treeStableTimer = 20, change_filter = util.ChangeFilter( repository_fn = lambda repository : bool('github.com/SFML/SFML' in repository) ), properties = { 'trigger' : 'internal' } ), AnyBranchScheduler( name = 'foreign', builderNames = builders.get_builder_names(), change_filter = util.ChangeFilter( repository_fn = lambda repository : bool('github.com/SFML/SFML' not in repository) ), properties = { 'trigger' : 'external' } ), ForceScheduler( name = 'force', reason = StringParameter(name = "reason", default = "manual build", size = 100), builderNames = builders.get_builder_names(), branch = StringParameter(name = "branch", default = "master", size = 100), revision = StringParameter(name = "revision", default = "", size = 100), repository = StringParameter(name = "repository", default = "https://github.com/SFML/SFML.git", regex = r"^https://github.com/[\w-]*/[\w-]*\.git$", size = 100), project = StringParameter(name = "project", default = "SFML", size = 100), properties = [ util.FixedParameter(name = "trigger", default = "force") ] ) ]
def test_NestedNestedParameter(self): fields = [ NestedParameter(name="inner", fields=[ StringParameter(name='str'), AnyPropertyParameter(name='any') ]), IntParameter(name="foo") ] self.do_ParameterTest(req=dict(p1_foo='123', p1_inner_str="bar", p1_inner_any_name="hello", p1_inner_any_value="world", reason="because"), expect=dict(foo=123, inner=dict(str="bar", hello="world")), klass=NestedParameter, fields=fields)
def makeForceScheduler(): return ForceScheduler( name="force", builderNames=["runtests", "runtests2", "runtests1"], codebases=[ CodebaseParameter('', branch=StringParameter(name="branch", label="Branch", default='master'), repository=FixedParameter( name="repository", default='repo')) ], properties=[ BooleanParameter(name="force_rebuild", label="Force Rebuild", default=True), BooleanParameter(name="force_chain_rebuild", label="Force Chain Rebuild", default=False) ])
def __init__(self, **kw): pizzaInput = StringParameter(label="type the name of your pizza", name=self.PIZZA, required=True) ingredientsInput = ChoiceStringParameter( name=self.INGREDIENTS, label="ingredients necessary to make the pizza", multiple=True, strict=False, default="", choices=[]) self.params = { self.PIZZA: pizzaInput, self.INGREDIENTS: ingredientsInput } self.allIngredients = set( sum([ingr for ingr in Api.pizzaIngredients.values()], [])) fields = self.params.values() super(NestedExample, self).__init__(self.type, label='', fields=fields, **kw)
def getSchedulers(): schedulers = [ ForceScheduler( name="force-flocker-acceptance", codebases=[ CodebaseParameter( "flocker", branch=StringParameter("branch", default="master", size=80), repository=FixedParameter("repository", default=GITHUB + b"/flocker"), ), ], properties=[ report_expected_failures_parameter, ], builderNames=BUILDERS, ), ] for distribution in OMNIBUS_DISTRIBUTIONS: builders = [ configuration.builder_name for configuration in ACCEPTANCE_CONFIGURATIONS if configuration.distribution == distribution ] schedulers.append( Triggerable( name='trigger/built-packages/%s' % (distribution, ), builderNames=builders, codebases={ "flocker": { "repository": GITHUB + b"/flocker" }, }, )) return schedulers
from codebases import Codebases from builders import BuilderNames Schedulers = [] Schedulers.append( ForceScheduler(name='force', builderNames=BuilderNames, codebases=Codebases.genBaseParameters() + Codebases.genMergeBaseParameters(), properties=[ ChoiceStringParameter(name='build_type', label='build type', choices=['debug', 'release'], default='release'), StringParameter(name='cmake_definitions', label='cmake definitions', default=''), StringParameter(name='disable_tests', label='disable accuracy tests', default='rgbd, shape'), StringParameter(name='disable_perf_tests', label='disable performance tests', default='stereo, tracking'), StringParameter(name='filter_tests', label='filter accuracy tests', default=''), StringParameter(name='filter_perf_tests', label='filter performance tests', default='') ]))
def loadBuilderConfig(c, is_test_mode_enabled=False): # FIXME: These file handles are leaked. if is_test_mode_enabled: passwords = {} else: passwords = json.load(open('passwords.json')) results_server_api_key = passwords.get('results-server-api-key') if results_server_api_key: os.environ['RESULTS_SERVER_API_KEY'] = results_server_api_key config = json.load(open('config.json')) if USE_BUILDBOT_VERSION2: c['workers'] = [Worker(worker['name'], passwords.get(worker['name'], 'password'), max_builds=1) for worker in config['workers']] else: c['slaves'] = [BuildSlave(worker['name'], passwords.get(worker['name'], 'password'), max_builds=1) for worker in config['workers']] c['schedulers'] = [] for scheduler in config['schedulers']: if "change_filter" in scheduler: scheduler["change_filter"] = globals()[scheduler["change_filter"]] schedulerClassName = scheduler.pop('type') schedulerClass = globals()[schedulerClassName] c['schedulers'].append(schedulerClass(**scheduler)) forceScheduler = ForceScheduler( name="force", builderNames=[str(builder['name']) for builder in config['builders']], reason=StringParameter(name="reason", default="", size=40), # Validate SVN revision: number or empty string revision=StringParameter(name="revision", default="", regex=re.compile(r'^(\d*)$')), # Disable default enabled input fields: branch, repository, project, additional properties branch=FixedParameter(name="branch"), repository=FixedParameter(name="repository"), project=FixedParameter(name="project"), properties=[BooleanParameter(name="is_clean", label="Force Clean build")] ) c['schedulers'].append(forceScheduler) c['builders'] = [] for builder in config['builders']: for workerName in builder['workernames']: for worker in config['workers']: if worker['name'] != workerName or worker['platform'] == '*': continue if worker['platform'] != builder['platform']: raise Exception('Builder {} is for platform {} but has worker {} for platform {}!'.format(builder['name'], builder['platform'], worker['name'], worker['platform'])) break if not USE_BUILDBOT_VERSION2: builder['slavenames'] = builder.pop('workernames') platform = builder['platform'] factoryName = builder.pop('factory') factory = globals()[factoryName] factorykwargs = {} for key in "platform", "configuration", "architectures", "triggers", "additionalArguments", "device_model": value = builder.pop(key, None) if value: factorykwargs[key] = value builder["factory"] = factory(**factorykwargs) builder_name = builder['name'] if len(builder_name) > BUILDER_NAME_LENGTH_LIMIT: raise Exception('Builder name "{}" is longer than maximum allowed by Buildbot ({} characters).'.format(builder_name, BUILDER_NAME_LENGTH_LIMIT)) if not buildbot_identifiers_re.match(builder_name): raise Exception('Builder name "{}" is not a valid buildbot identifier.'.format(builder_name)) for step in builder["factory"].steps: if USE_BUILDBOT_VERSION2: step_name = step.buildStep().name else: step_name = step[0].name if len(step_name) > STEP_NAME_LENGTH_LIMIT: raise Exception('step name "{}" is longer than maximum allowed by Buildbot ({} characters).'.format(step_name, STEP_NAME_LENGTH_LIMIT)) if not buildbot_identifiers_re.match(step_name): raise Exception('step name "{}" is not a valid buildbot identifier.'.format(step_name)) if platform.startswith('mac'): category = 'AppleMac' elif platform.startswith('ios'): category = 'iOS' elif platform == 'win': category = 'AppleWin' elif platform.startswith('gtk'): category = 'GTK' elif platform.startswith('wpe'): category = 'WPE' elif platform == 'wincairo': category = 'WinCairo' elif platform.startswith('playstation'): category = 'PlayStation' else: category = 'misc' if (category in ('AppleMac', 'AppleWin', 'iOS')) and factoryName != 'BuildFactory': builder['nextBuild'] = pickLatestBuild if USE_BUILDBOT_VERSION2: builder['tags'] = getTagsForBuilder(builder) else: builder['category'] = category c['builders'].append(builder)
def loadBuilderConfig(c, test_mode_is_enabled=False): # FIXME: These file handles are leaked. if test_mode_is_enabled: passwords = make_passwords_json.create_mock_slave_passwords_dict() else: passwords = json.load(open('passwords.json')) results_server_api_key = passwords.get('results-server-api-key') if results_server_api_key: os.environ['RESULTS_SERVER_API_KEY'] = results_server_api_key config = json.load(open('config.json')) c['slaves'] = [ BuildSlave(slave['name'], passwords[slave['name']], max_builds=1) for slave in config['slaves'] ] c['schedulers'] = [] for scheduler in config['schedulers']: if "change_filter" in scheduler: scheduler["change_filter"] = globals()[scheduler["change_filter"]] schedulerType = globals()[scheduler.pop('type')] # Python 2.6 can't handle unicode keys as keyword arguments: # http://bugs.python.org/issue2646. Modern versions of json return # unicode strings from json.load, so we map all keys to str objects. scheduler = dict( map( lambda key_value_pair: (str(key_value_pair[0]), key_value_pair[1]), scheduler.items())) c['schedulers'].append(schedulerType(**scheduler)) forceScheduler = ForceScheduler( name="force", builderNames=[str(builder['name']) for builder in config['builders']], reason=StringParameter(name="reason", default="", size=40), # Validate SVN revision: number or empty string revision=StringParameter(name="revision", default="", regex=re.compile(r'^(\d*)$')), # Disable default enabled input fields: branch, repository, project, additional properties branch=FixedParameter(name="branch"), repository=FixedParameter(name="repository"), project=FixedParameter(name="project"), properties=[ BooleanParameter(name="is_clean", label="Force Clean build") ]) c['schedulers'].append(forceScheduler) c['builders'] = [] for builder in config['builders']: for slaveName in builder['slavenames']: for slave in config['slaves']: if slave['name'] != slaveName or slave['platform'] == '*': continue if slave['platform'] != builder['platform']: raise Exception, "Builder %r is for platform %r but has slave %r for platform %r!" % ( builder['name'], builder['platform'], slave['name'], slave['platform']) break platform = builder['platform'] builderType = builder.pop('type') factory = globals()["%sFactory" % builderType] factorykwargs = {} for key in "platform", "configuration", "architectures", "triggers", "additionalArguments", "SVNMirror", "device_model": value = builder.pop(key, None) if value: factorykwargs[key] = value builder["factory"] = factory(**factorykwargs) if platform.startswith('mac'): builder["category"] = 'AppleMac' elif platform.startswith('ios'): builder['category'] = 'iOS' elif platform == 'win': builder["category"] = 'AppleWin' elif platform.startswith('gtk'): builder["category"] = 'GTK' elif platform.startswith('wpe'): builder["category"] = 'WPE' elif platform == 'wincairo': builder["category"] = 'WinCairo' elif platform.startswith('playstation'): builder["category"] = 'PlayStation' else: builder["category"] = 'misc' if (builder['category'] in ('AppleMac', 'AppleWin', 'iOS')) and builderType != 'Build': builder['nextBuild'] = pickLatestBuild c['builders'].append(builder)
def define_travis_builder(self, name, repository, tags=None, **kwargs): name = str(name) repository = str(repository) job_name = "%s-job" % name try_name = "%s-try" % name deploy_name = "%s-deploy" % name spawner_name = name if tags is None: tags = [] def formatTag(tag): if isinstance(tag, string_types): return str(tag) return str(tag['text']) def uniq(tags): """tags needs to be unique list, so we need to filter them into a set""" return list(set(tags)) tags = [formatTag(tag) for tag in tags] if 'username' not in kwargs and 'password' not in kwargs: p = urlparse(repository) k = (p.scheme, p.netloc) if k in self.passwords: kwargs['username'], kwargs['password'] = self.passwords[k] codebases = {spawner_name: {'repository': repository}} for subrepo in kwargs.get('subrepos', []): codebases[subrepo['project']] = { 'repository': subrepo['repository'] } vcsManager = addRepository( name, dict(name=name, repository=repository, **kwargs)) vcsManager.vardir = self.vardir # Define the builder for the main job f = factory.BuildFactory() vcsManager.addSourceSteps(f) f.addStep(TravisSetupSteps()) self.config['builders'].append( BuilderConfig(name=job_name, workernames=self.get_runner_workers(), properties=self.properties, collapseRequests=False, env=self.defaultEnv, tags=uniq(["job", name] + tags), factory=f)) self.config['schedulers'].append( Triggerable( name=job_name, builderNames=[job_name], codebases=codebases, )) # Define the builder for a spawner f = factory.BuildFactory() vcsManager.addSourceSteps(f) f.addStep(TravisTrigger(scheduler=job_name, )) properties = dict(TRAVIS_PULL_REQUEST=False) properties.update(self.properties) self.config['builders'].append( BuilderConfig(name=spawner_name, workernames=self.get_spawner_workers(), properties=properties, tags=uniq(["trunk", name] + tags), factory=f)) # no need for deployment builder if no stage is configured if kwargs.get('stages', []): # Define the builder for the deployment of the project f = factory.BuildFactory() vcsManager.addSourceSteps(f) f.addStep(TravisSetupSteps()) # To manage deployment properly (with change traceability), # we need the version and the target deployment environment or "stage" version = StringParameter(name='version', label='GIT tag', hide=False, required=False, size=20) stage = StringParameter(name='stage', label='Stage', hide=False, required=False, size=20) dep_properties = [version, stage] self.config['builders'].append( BuilderConfig(name=deploy_name, workernames=self.get_runner_workers(), env=self.defaultEnv, tags=uniq(["deploy", name] + tags), factory=f)) else: dep_properties = [] if vcsManager.supportsTry: properties = dict(TRAVIS_PULL_REQUEST=True) properties.update(self.properties) # Define the builder for try job f = factory.BuildFactory() vcsManager.addSourceSteps(f) f.addStep(TravisTrigger(scheduler=job_name, )) self.config['builders'].append( BuilderConfig(name=try_name, workernames=self.get_spawner_workers(), properties=properties, tags=uniq(["try", name] + tags), factory=f)) vcsManager.setupSchedulers(self.config['schedulers'], spawner_name, try_name, deploy_name, self.importantManager, codebases, dep_properties) vcsManager.setupReporters(self.config['services'], spawner_name, try_name, codebases) res = vcsManager.setupChangeSource(self.config['services']) if res is not None: self.change_hook_dialects.update(res)
from buildbot.changes.filter import ChangeFilter from config.builders import builder_names, polled_builder_names all_builder_names = builder_names + polled_builder_names schedulers = [] manual_builder = ChangeFilter(project=builder_names, branch='master') schedulers.append( SingleBranchScheduler(name="all", treeStableTimer=15, change_filter=manual_builder, builderNames=builder_names)) polled_builder = ChangeFilter(project=polled_builder_names, branch='master') schedulers.append( SingleBranchScheduler(name="mongodb", treeStableTimer=15, change_filter=polled_builder, builderNames=polled_builder_names)) schedulers.append( ForceScheduler(name="force", repository=FixedParameter(name="repository"), branch=StringParameter(name="branch", default="master"), project=FixedParameter(name="project", default=""), properties=[], builderNames=all_builder_names))
def loadBuilderConfig(c, is_test_mode_enabled=False, master_prefix_path='./'): # FIXME: These file handles are leaked. config = json.load(open(os.path.join(master_prefix_path, 'config.json'))) if is_test_mode_enabled: passwords = {} else: passwords = json.load( open(os.path.join(master_prefix_path, 'passwords.json'))) results_server_api_key = passwords.get('results-server-api-key') if results_server_api_key: os.environ['RESULTS_SERVER_API_KEY'] = results_server_api_key checkWorkersAndBuildersForConsistency(config, config['workers'], config['builders']) checkValidSchedulers(config, config['schedulers']) c['workers'] = [ Worker(worker['name'], passwords.get(worker['name'], 'password'), max_builds=1) for worker in config['workers'] ] c['schedulers'] = [] for scheduler in config['schedulers']: if "change_filter" in scheduler: scheduler["change_filter"] = globals()[scheduler["change_filter"]] schedulerClassName = scheduler.pop('type') schedulerClass = globals()[schedulerClassName] c['schedulers'].append(schedulerClass(**scheduler)) # Setup force schedulers builderNames = [str(builder['name']) for builder in config['builders']] reason = StringParameter(name='reason', default='', size=40) properties = [BooleanParameter(name='is_clean', label='Force Clean build')] forceScheduler = ForceScheduler(name='force', builderNames=builderNames, reason=reason, properties=properties) c['schedulers'].append(forceScheduler) c['builders'] = [] for builder in config['builders']: builder['tags'] = getTagsForBuilder(builder) platform = builder['platform'] factoryName = builder.pop('factory') factory = globals()[factoryName] factorykwargs = {} for key in [ 'platform', 'configuration', 'architectures', 'triggers', 'additionalArguments', 'device_model' ]: value = builder.pop(key, None) if value: factorykwargs[key] = value builder['factory'] = factory(**factorykwargs) builder_name = builder['name'] for step in builder["factory"].steps: step_name = step.buildStep().name if len(step_name) > STEP_NAME_LENGTH_LIMIT: raise Exception( 'step name "{}" is longer than maximum allowed by Buildbot ({} characters).' .format(step_name, STEP_NAME_LENGTH_LIMIT)) if not buildbot_identifiers.ident_re.match(step_name): raise Exception( 'step name "{}" is not a valid buildbot identifier.'. format(step_name)) if platform.startswith('mac'): category = 'AppleMac' elif platform.startswith('ios'): category = 'iOS' elif platform == 'win': category = 'AppleWin' elif platform.startswith('gtk'): category = 'GTK' elif platform.startswith('wpe'): category = 'WPE' elif platform == 'wincairo': category = 'WinCairo' elif platform.startswith('playstation'): category = 'PlayStation' else: category = 'misc' if (category in ('AppleMac', 'AppleWin', 'iOS')) and factoryName != 'BuildFactory': builder['nextBuild'] = pickLatestBuild c['builders'].append(builder)
def getGlobalSchedulers(self, platforms): ret = list() change_filter = ChangeFilter(repository=self.baseurl, branch=self.branch) # Fetch scheduler (triggered by event source) ret.append( SingleBranchScheduler(name="fetch-{0}".format(self.name), change_filter=change_filter, treeStableTimer=5, builderNames=["fetch-{0}".format(self.name) ])) # Nightly scheduler (started by time) # It's triggered after regular builds to take note of the last fetched source # Note that build is not started by trigger if self.nightly is not None: ret.append( NightlyTriggerable( name="nightly-{0}".format(self.name), branch=self.branch, builderNames=["nightly-{0}".format(self.name)], hour=self.nightly[0], minute=self.nightly[1], onlyIfChanged=True)) # All compiling builders comp_builders = [ "{0}-{1}".format(self.name, p.name) for p in platforms if p.canBuild(self) ] # Global build scheduler (triggered by fetch build) ret.append(Triggerable(name=self.name, builderNames=comp_builders)) # Force schedulers if self.enable_force: ret.append( ForceScheduler( name="force-scheduler-{0}-fetch".format(self.name), reason=StringParameter(name="reason", label="Reason:", required=True, size=80), builderNames=["fetch-{0}".format(self.name)], codebases=[CodebaseParameter(codebase='', hide=True)], properties=[ BooleanParameter(name="clean", label="Clean", default=False), BooleanParameter(name="package", label="Package", default=False), ])) ret.append( ForceScheduler( name="force-scheduler-{0}-build".format(self.name), reason=StringParameter(name="reason", label="Reason:", required=True, size=80), builderNames=comp_builders, codebases=[CodebaseParameter(codebase='', hide=True)], properties=[ BooleanParameter(name="clean", label="Clean", default=False), BooleanParameter(name="package", label="Package", default=False), ])) return ret