def test_compare_username(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[]), ForceScheduler(name="testched", builderNames=[], username=FixedParameter("username", "The Fisher King <*****@*****.**>")))
def test_compare_properties(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[], properties=[]), ForceScheduler(name="testched", builderNames=[], properties=[FixedParameter("prop", "thanks for the fish!")]))
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)) # 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')] if USE_BUILDBOT_VERSION2: forceScheduler = ForceScheduler(name='force', builderNames=builderNames, reason=reason, properties=properties) else: forceScheduler = ForceScheduler( name='force', builderNames=builderNames, reason=reason, # 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=properties) 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 test_compare_reason(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[], reason=FixedParameter("reason", "no fish for you!")), ForceScheduler(name="testched", builderNames=[], reason=FixedParameter("reason", "thanks for the fish!")))
def loadBuilderConfig(c): # FIXME: These file handles are leaked. passwords = json.load(open('passwords.json')) 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"]] kls = 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(kls(**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": 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' else: builder["category"] = 'misc' if (builder['category'] in ('AppleMac', 'AppleWin', 'iOS')) and builderType != 'Build': builder['nextBuild'] = pickLatestBuild c['builders'].append(builder)
def test_compare_branch(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[]), ForceScheduler(name="testched", builderNames=[], branch=FixedParameter("branch", "fishing/pole")))
def addSimpleProject(self, name, category, repourl, builderconfigs): """Private. Add a project which builds when the source changes or when Force is clicked. """ # FACTORIES # FIXME: get list of steps from buildshim here # factory = BuildFactory() # check out the source # This fails with git-1.8 and up unless you specify the branch, so do this down lower where we now the branch # factory.addStep(Git(repourl=repourl, mode='full', method='copy')) # for step in ["patch", "install_deps", "configure", "compile", "check", "package", "upload", "uninstall_deps"]: # factory.addStep(ShellCommand(command=["../../srclink/" + name + "/buildshim", step], description=step)) # BUILDERS AND SCHEDULERS # For each builder in config file, see what OS they want to # run on, and assign them to suitable slaves. # Also create a force scheduler that knows about all the builders. branchnames = [] buildernames = [] for builderconfig in builderconfigs: bparams = '' if "params" in builderconfig: bparams = builderconfig["params"].encode('ascii', 'ignore') bsuffix = '' if "suffix" in builderconfig: bsuffix = builderconfig["suffix"].encode('ascii', 'ignore') sbranch = builderconfig["branch"].encode('ascii', 'ignore') if sbranch not in branchnames: branchnames.append(sbranch) sosses = builderconfig["os"].encode('ascii', 'ignore').split('>') sosses.reverse() # The first OS in the list triggers when there's a source change sos = sosses.pop() buildername = name + '-' + sos + '-' + sbranch + bsuffix factory = self.addSimpleBuilder(name, buildername, category, repourl, builderconfig, sos, sbranch, bparams) self['schedulers'].append( SingleBranchScheduler( name=buildername, change_filter=filter.ChangeFilter(branch=sbranch, repository=repourl), # Set this just high enough so you don't swamp the slaves, # or to None if you don't want changes batched treeStableTimer=1 * 60, builderNames=[buildername])) buildernames.append(buildername) # The rest of the OSes in the list, if any, are triggered when the # previous OS in the list finishes while len(sosses) > 0: prev_factory = factory sos = sosses.pop() buildername = name + '-' + sos + '-' + sbranch + bsuffix factory = self.addSimpleBuilder(name, buildername, category, repourl, builderconfig, sos, sbranch, bparams) self['schedulers'].append( triggerable.Triggerable(name=buildername, builderNames=[buildername])) prev_factory.addStep( trigger.Trigger(schedulerNames=[buildername], waitForFinish=False)) self['schedulers'].append( ForceScheduler( name=name + "-force", builderNames=buildernames, branch=FixedParameter(name="branch", default=""), revision=FixedParameter(name="revision", default=""), repository=FixedParameter(name="repository", default=""), project=FixedParameter(name="project", default=""), properties=[], )) # CHANGESOURCES # It's a git git git git git world already = False for cs in self['change_source']: if cs.repourl == repourl: log.msg( "There's already a changesource for %s. Hope it has the branch you wanted." % cs.repourl) already = True if not already: self['change_source'].append( # Fuzz the interval to avoid slamming the git server and hitting the MaxStartups or MaxSessions limits # If you hit them, twistd.log will have lots of "ssh_exchange_identification: Connection closed by remote host" errors # See http://trac.buildbot.net/ticket/2480 GitPoller(repourl, branches=branchnames, workdir='gitpoller-workdir-' + name, pollinterval=60 + random.uniform(-10, 10)))
from buildbot.schedulers.basic import SingleBranchScheduler from buildbot.schedulers.forcesched import ForceScheduler, FixedParameter, ChoiceStringParameter from metabbotcfg import builders from metabbotcfg.common import GIT_URL schedulers = [] schedulers.append( SingleBranchScheduler(name="all", branch='master', treeStableTimer=2, builderNames=[b['name'] for b in builders.builders])) #schedulers.append(SingleBranchScheduler( # name="release", # branch='buildbot-0.8.9', # treeStableTimer=10, # builderNames=[b['name'] for b in builders.builders if b['name'] not in ('docs',)])) schedulers.append( ForceScheduler(name="force", repository=FixedParameter(name="repository", default=GIT_URL), branch=ChoiceStringParameter(name="branch", default="master", choices=["master", "eight"]), project=FixedParameter(name="project", default=""), properties=[], builderNames=[b['name'] for b in builders.builders]))
def test_compare_project(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[], project=FixedParameter("project","fisher")), ForceScheduler(name="testched", builderNames=[], project=FixedParameter("project","trawler")))
def test_compare_repository(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[], repository=FixedParameter("repository","git://pond.org/fisher.git")), ForceScheduler(name="testched", builderNames=[], repository=FixedParameter("repository","svn://ocean.com/trawler/")))
def test_compare_revision(self): self.assertNotEqual( ForceScheduler(name="testched", builderNames=[], revision=FixedParameter("revision","fish-v1")), ForceScheduler(name="testched", builderNames=[], revision=FixedParameter("revision","fish-v2")))