def test_good_codebases(self): sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar')]) res = yield sched.force('user', builderNames=['a'], reason='because', foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p', bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2' ) bsid, brids = res expProperties = { u'owner': ('user', 'Force Build Form'), u'reason': ('because', 'Force Build Form'), } self.assertEqual(self.addBuildsetCalls, [ ('addBuildsetForSourceStampsWithDefaults', dict( builderNames=['a'], waited_for=False, properties=expProperties, reason=u"A build was forced by 'user': because", sourcestamps=[ {'branch': 'a', 'project': 'p', 'repository': 'd', 'revision': 'c', 'codebase': 'foo'}, {'branch': 'a2', 'project': 'p2', 'repository': 'd2', 'revision': 'c2', 'codebase': 'bar'}, ])), ])
def test_codebase_with_patch(self): sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar', patch=PatchParameter())]) res = yield sched.force('user', builderNames=['a'], reason='because', foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p', bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2', bar_patch_body="xxx" ) bsid, brids = res expProperties = { 'owner': ('user', 'Force Build Form'), 'reason': ('because', 'Force Build Form'), } self.assertEqual(self.addBuildsetCalls, [ ('addBuildsetForSourceStampsWithDefaults', dict( builderNames=['a'], waited_for=False, properties=expProperties, reason="A build was forced by 'user': because", sourcestamps=[ {'branch': 'a2', 'project': 'p2', 'repository': 'd2', 'revision': 'c2', 'codebase': 'bar', 'patch_body': 'xxx', 'patch_author': '', 'patch_subdir': '.', 'patch_comment': '', 'patch_level': 1}, {'branch': 'a', 'project': 'p', 'repository': 'd', 'revision': 'c', 'codebase': 'foo'}, ])), ])
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 test_good_codebases(self): sched = self.makeScheduler(codebases=['foo', CodebaseParameter('bar')]) res = yield sched.force('user', builderNames=['a'], reason='because', foo_branch='a', foo_revision='c', foo_repository='d', foo_project='p', bar_branch='a2', bar_revision='c2', bar_repository='d2', bar_project='p2', property1_name='p1',property1_value='e', property2_name='p2',property2_value='f', property3_name='p3',property3_value='g', property4_name='p4',property4_value='h' ) bsid,brids = res self.db.buildsets.assertBuildset\ (bsid, dict(reason="A build was forced by 'user': because", brids=brids, external_idstring=None, properties=[ ('owner', ('user', 'Force Build Form')), ('p1', ('e', 'Force Build Form')), ('p2', ('f', 'Force Build Form')), ('p3', ('g', 'Force Build Form')), ('p4', ('h', 'Force Build Form')), ('reason', ('because', 'Force Build Form')), ('scheduler', ('testsched', 'Scheduler')), ], sourcestampsetid=100), {'foo': dict(codebase='foo', sourcestampsetid=100, branch='a', revision='c', repository='d', project='p', ), 'bar': dict(codebase='bar', sourcestampsetid=100, branch='a2', revision='c2', repository='d2', project='p2', ), })
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 createCodebaseParamsForDeploy(self, codebases): codebases_params = [] for name, codebase in codebases.items(): codebases_params.append( CodebaseParameter(name, project="", repository=codebase['repository'], branch=codebase.get('branch'), revision=util.StringParameter( name='revision', hide=False, size=50))) return codebases_params
def genMergeBaseParameters(self, **kwargs): repos = kwargs.pop('repos', self.repos) branches = kwargs.pop('branches', self.branches) parms = [] for repo in repos: parms.append( CodebaseParameter(codebase=repo + '_merge', label="Merge %s with test branch" % repo, project=FixedParameter(name='project', default=''))) return parms
def createCodebaseParams(self, codebases): codebases_params = [] for name, codebase in codebases.items(): codebases_params.append( CodebaseParameter( name, project="", repository=codebase['repository'], branch=codebase.get('branch'), revision=None, )) return codebases_params
def genBaseParameters(self, **kwargs): repos = kwargs.pop('repos', self.repos) branches = kwargs.pop('branches', self.branches) parms = [] for repo in repos: parms.append( CodebaseParameter( codebase=repo, label=repo, branch=ChoiceStringParameter(name='branch', choices=self.branches, default=self.branches[0]), repository=FixedParameter(name='repository', default=self.genRepoURL( self.baseURL, self.owner, repo)), project=FixedParameter(name='project', default=''))) return parms
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 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
return '--version' # dummy action return pick_buildbot_action steps = [] for slave in slaves: steps.append( ShellCommand( name="Act-%s" % slave, command = ["ssh", slave, Interpolate("~/run_buildslave.sh %(kw:action)s", action=get_action(slave))], doStepIf=skip_if_no_action(slave)) ) return { 'factory': BuildFactory(steps), 'name': "ManageSlaves", 'slavenames': [ MAIN_SLAVE ], } c['builders'].append(create_slave_management(BUILD_SLAVES)) c['schedulers'].append( ForceScheduler(name="Force-ManageSlaves", builderNames=['ManageSlaves'], codebases=[CodebaseParameter(codebase='', hide=True)], reason=StringParameter(name="reason", default="Manage Slaves", length=20, hide=True), reasonString="%(reason)s", properties=[ ChoiceStringParameter(label=slave, name='%s_action' % slave, choices=['None', 'Start', 'Restart', 'Stop']) for slave in BUILD_SLAVES ]),
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