def create_schedulers(repos_and_packages): return [ DependencyTreeScheduler( 'dependency-tree', build_dependency_tree=create_build_dependency_tree(repo['artifacts']), builds_from_change=builds_from_change_func(repo['artifacts']), change_filter=util.ChangeFilter( repository=repo['repo'], branch='master')) for repo in repos_and_packages ] + [ schedulers.ForceScheduler( artifact['artifact'] + '-force', builderNames=[artifact['artifact']], buttonName='Force' ) for repo in repos_and_packages for artifact in repo['artifacts'] ] + _flatten([ (schedulers.SingleBranchScheduler( 'artifactsrc-yml', fileIsImportant=_artifactsrc_needs_rebuilding, onlyImportant=True, change_filter=util.ChangeFilter( repository=repo['repo'], branch='master'), builderNames=['build-artifactsrc-yml'] ), schedulers.ForceScheduler( 'artifactsrc-yml-force', builderNames=['build-artifactsrc-yml'], buttonName='Force' )) for repo in repos_and_packages ])
def setupSchedulers(self, _schedulers, spawner_name, try_name, deploy_name, importantManager, codebases, dep_properties): # branch filtering is already made by the changesource _schedulers.append( schedulers.AnyBranchScheduler( name=spawner_name, builderNames=[spawner_name], change_filter=util.GerritChangeFilter( project=self.name, eventtype_re="ref-updated"), onlyImportant=True, fileIsImportant=importantManager.fileIsImportant, codebases=codebases, )) _schedulers.append( schedulers.AnyBranchScheduler( name=try_name, builderNames=[try_name], change_filter=util.GerritChangeFilter( project=self.name, eventtype="patchset-created"), onlyImportant=True, fileIsImportant=importantManager.fileIsImportant, codebases=codebases, )) _schedulers.append( schedulers.ForceScheduler( name="force" + spawner_name, builderNames=[spawner_name], codebases=self.createCodebaseParams(codebases))) _schedulers.append( schedulers.ForceScheduler( name=deploy_name, builderNames=[deploy_name], codebases=self.createCodebaseParamsForDeploy(codebases), properties=dep_properties))
def setupSchedulers(self, _schedulers, spawner_name, try_name, deploy_name, importantManager, codebases, dep_properties): _schedulers.append( schedulers.AnyBranchScheduler( name=spawner_name, builderNames=[spawner_name], change_filter=self.getPushChangeFilter(), onlyImportant=True, fileIsImportant=importantManager.fileIsImportant, codebases=codebases, )) if self.supportsTry: _schedulers.append( schedulers.AnyBranchScheduler( name=try_name, builderNames=[try_name], change_filter=self.getTryChangeFilter(), onlyImportant=True, fileIsImportant=importantManager.fileIsImportant, codebases=codebases, )) _schedulers.append( schedulers.ForceScheduler( name="force" + spawner_name, builderNames=[spawner_name], codebases=self.createCodebaseParams(codebases))) _schedulers.append( schedulers.ForceScheduler( name=deploy_name, builderNames=[deploy_name], codebases=self.createCodebaseParamsForDeploy(codebases), properties=dep_properties))
def masterGlobConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.ForceScheduler( name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep(steps.StringDownload("filecontent", workerdest="dir/file1.txt")) f.addStep( steps.StringDownload( "filecontent2", workerdest="dir/notafile1.txt")) f.addStep(steps.StringDownload("filecontent2", workerdest="dir/only1.txt")) f.addStep( steps.MultipleFileUpload( workersrcs=["dir/file*.txt", "dir/not*.txt", "dir/only?.txt"], masterdest="dest/", glob=True)) c['builders'] = [ BuilderConfig( name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import schedulers, steps c['services'] = [FakeSecretReporter('http://example.com/hook', auth=('user', Interpolate('%(secret:httppasswd)s')))] c['schedulers'] = [ schedulers.ForceScheduler( name="force", builderNames=["testy"])] c['secretsProviders'] = [FakeSecretStorage( secretdict={"foo": "bar", "something": "more", 'httppasswd': 'myhttppasswd'})] f = BuildFactory() if os.name == "posix": f.addStep(steps.ShellCommand(command=Interpolate( 'echo %(secret:foo)s | sed "s/bar/The password was there/"'))) else: f.addStep(steps.ShellCommand(command=Interpolate( 'echo %(secret:foo)s'))) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f)] return c
def add_all_schedulers(cfg): for s_name in SERVICES: for branch in get_all_possible_branch_names(): realm = BRANCH_TO_REALM_MAPPING[branch] buildername = f"{s_name}_{realm}" cfg['schedulers'].append( schedulers.ForceScheduler( name=f"force-{s_name}-{realm}", codebases=[ util.CodebaseParameter( "", label="Repository", branch=util.FixedParameter(name="branch", default=branch), revision=util.StringParameter(name="revision", default=""), repository=util.FixedParameter( name="repository", default=SERVICES[s_name]['giturl']), project=util.FixedParameter(name="project", default=s_name), ) ], builderNames=[buildername], )) cfg['schedulers'].append( schedulers.SingleBranchScheduler( name=f"commit-{s_name}-{realm}", builderNames=[buildername], treeStableTimer=0, change_filter=util.ChangeFilter(branch=branch, project=s_name), ))
def masterConfig(num_concurrent, extra_steps=None): if extra_steps is None: extra_steps = [] c = {} c['schedulers'] = [ schedulers.ForceScheduler( name="force", builderNames=["testy"])] triggereables = [] for i in range(num_concurrent): c['schedulers'].append( schedulers.Triggerable( name="trigsched" + str(i), builderNames=["build"])) triggereables.append("trigsched" + str(i)) f = BuildFactory() f.addStep(steps.ShellCommand(command='echo hello')) f.addStep(steps.Trigger(schedulerNames=triggereables, waitForFinish=True, updateSourceStamp=True)) f.addStep(steps.ShellCommand(command='echo world')) f2 = BuildFactory() f2.addStep(steps.ShellCommand(command='echo ola')) for step in extra_steps: f2.addStep(step) c['builders'] = [ BuilderConfig(name="testy", workernames=["marathon0"], factory=f), BuilderConfig(name="build", workernames=["marathon" + str(i) for i in range(num_concurrent)], factory=f2)] url = os.environ.get('BBTEST_MARATHON_URL') creds = os.environ.get('BBTEST_MARATHON_CREDS') if creds is not None: user, password = creds.split(":") else: user = password = None masterFQDN = os.environ.get('masterFQDN') marathon_extra_config = { } c['workers'] = [ MarathonLatentWorker('marathon' + str(i), url, user, password, 'buildbot/buildbot-worker:master', marathon_extra_config=marathon_extra_config, masterFQDN=masterFQDN) for i in range(num_concurrent) ] # un comment for debugging what happens if things looks locked. # c['www'] = {'port': 8080} # if the masterFQDN is forced (proxy case), then we use 9989 default port # else, we try to find a free port if masterFQDN is not None: c['protocols'] = {"pb": {"port": "tcp:9989"}} else: c['protocols'] = {"pb": {"port": "tcp:0"}} return c
def masterConfig(use_with=False): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import schedulers, steps c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] c['secretsProviders'] = [ FakeSecretStorage(secretdict={ "foo": "bar", "something": "more" }) ] f = BuildFactory() if use_with: secrets_list = [("pathA", Interpolate('%(secret:something)s'))] with f.withSecrets(secrets_list): f.addStep( steps.ShellCommand(command=Interpolate('echo %(secret:foo)s'))) else: f.addSteps( [steps.ShellCommand(command=Interpolate('echo %(secret:foo)s'))], withSecrets=[("pathA", Interpolate('%(secret:something)s'))]) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def add_schedulers(cfg): for branch in config['branch_deployment_configs']: realm = config['branch_deployment_configs'][branch]['namespace'] buildername = 'vs-' + realm cfg['schedulers'].append( schedulers.ForceScheduler( name="force-vs" + realm, codebases=[ util.CodebaseParameter( "", label="Repository", branch=util.FixedParameter(name="branch", default=branch), revision=util.StringParameter(name="revision", default=""), repository=util.FixedParameter( name="repository", default= "https://github.com/klaital/volunteer-savvy-backend" ), project=util.FixedParameter( name="project", default='volunteer-savvy-backend'), ) ], builderNames=[buildername]))
def masterGlobConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers from buildbot.steps.worker import CompositeStepMixin class CustomStep(steps.BuildStep, CompositeStepMixin): @defer.inlineCallbacks def run(self): content = yield self.getFileContentFromWorker( "dir/file1.txt", abandonOnFailure=True) assert content == "filecontent" return SUCCESS c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep(steps.StringDownload("filecontent", workerdest="dir/file1.txt")) f.addStep( steps.StringDownload("filecontent2", workerdest="dir/notafile1.txt")) f.addStep(steps.StringDownload("filecontent2", workerdest="dir/only1.txt")) f.addStep( steps.MultipleFileUpload( workersrcs=["dir/file*.txt", "dir/not*.txt", "dir/only?.txt"], masterdest="dest/", glob=True)) f.addStep(CustomStep()) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(bigfilename): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() # do a bunch of transfer to exercise the protocol f.addStep(steps.StringDownload("filecontent", workerdest="dir/file1.txt")) f.addStep(steps.StringDownload("filecontent2", workerdest="dir/file2.txt")) # create 8 MB file with open(bigfilename, 'w') as o: buf = "xxxxxxxx" * 1024 for i in range(1000): o.write(buf) f.addStep( steps.FileDownload(mastersrc=bigfilename, workerdest="bigfile.txt")) f.addStep( steps.FileUpload(workersrc="dir/file2.txt", masterdest="master.txt")) f.addStep( steps.FileDownload(mastersrc="master.txt", workerdest="dir/file3.txt")) f.addStep(steps.DirectoryUpload(workersrc="dir", masterdest="dir")) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(): c = {} from buildbot.plugins import schedulers, steps, util class SleepAndInterrupt(steps.ShellSequence): @defer.inlineCallbacks def run(self): if self.worker.worker_system == "nt": sleep = "waitfor SomethingThatIsNeverHappening /t 100 >nul 2>&1" else: sleep = ["sleep", "100"] d = self.runShellSequence([util.ShellArg(sleep)]) yield asyncSleep(1) self.interrupt("just testing") res = yield d return res c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = util.BuildFactory() f.addStep(SleepAndInterrupt()) c['builders'] = [ util.BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def master_config(secret_specifier): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import schedulers c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] # note that as of August 2021, the vault docker image default to kv # version 2 to be enabled by default c['secretsProviders'] = [ HashiCorpVaultKvSecretProvider(authenticator=VaultAuthenticatorToken('my_vaulttoken'), vault_server="http://localhost:8200", secrets_mount="secret") ] f = BuildFactory() f.addStep(ShellCommand(command=Interpolate(f'echo {secret_specifier} | base64'))) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(secret_specifier): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import schedulers c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] # note that as of December 2018, the vault docker image default to kv # version 2 to be enabled by default c['secretsProviders'] = [ HashiCorpVaultSecretProvider(vaultToken='my_vaulttoken', vaultServer="http://localhost:8200", apiVersion=2) ] f = BuildFactory() f.addStep( ShellCommand( command=Interpolate('echo {} | base64'.format(secret_specifier)))) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.ForceScheduler( name="force", builderNames=["testy"])] f = BuildFactory() # do a bunch of transfer to exercise the protocol f.addStep(steps.StringDownload("filecontent", workerdest="dir/file1.txt")) f.addStep(steps.StringDownload("filecontent2", workerdest="dir/file2.txt")) f.addStep( steps.FileUpload(workersrc="dir/file2.txt", masterdest="master.txt")) f.addStep( steps.FileDownload(mastersrc="master.txt", workerdest="dir/file3.txt")) f.addStep(steps.DirectoryUpload(workersrc="dir", masterdest="dir")) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def get_schedulers(): return [ schedulers.SingleBranchScheduler( name="all", change_filter=util.ChangeFilter(branch='master'), treeStableTimer=None, builderNames=["runtests"]), schedulers.ForceScheduler(name="force", builderNames=["runtests"]) ]
def masterConfig(num_concurrent, extra_steps=None): if extra_steps is None: extra_steps = [] c = {} c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] triggereables = [] for i in range(num_concurrent): c['schedulers'].append( schedulers.Triggerable(name="trigsched" + str(i), builderNames=["build"])) triggereables.append("trigsched" + str(i)) f = BuildFactory() f.addStep(steps.ShellCommand(command='echo hello')) f.addStep( steps.Trigger(schedulerNames=triggereables, waitForFinish=True, updateSourceStamp=True)) f.addStep(steps.ShellCommand(command='echo world')) f2 = BuildFactory() f2.addStep(steps.ShellCommand(command='echo ola')) for step in extra_steps: f2.addStep(step) c['builders'] = [ BuilderConfig(name="testy", workernames=["hyper0"], factory=f), BuilderConfig( name="build", workernames=["hyper" + str(i) for i in range(num_concurrent)], factory=f2) ] hyperconfig = workerhyper.Hyper.guess_config() if isinstance(hyperconfig, string_types): hyperconfig = json.load(open(hyperconfig)) hyperhost, hyperconfig = hyperconfig['clouds'].items()[0] masterFQDN = os.environ.get('masterFQDN') c['workers'] = [ HyperLatentWorker('hyper' + str(i), 'passwd', hyperhost, hyperconfig['accesskey'], hyperconfig['secretkey'], 'buildbot/buildbot-worker:master', masterFQDN=masterFQDN) for i in range(num_concurrent) ] # un comment for debugging what happens if things looks locked. # c['www'] = {'port': 8080} # if the masterFQDN is forced (proxy case), then we use 9989 default port # else, we try to find a free port if masterFQDN is not None: c['protocols'] = {"pb": {"port": "tcp:9989"}} else: c['protocols'] = {"pb": {"port": "tcp:0"}} return c
def scheduler_force_wintools(name, builders, codebases_wintools): return schedulers.ForceScheduler( name=name, buttonName="Wintools build", label="Manual Windows Tools build", reason=util.StringParameter(name="reason", label="Reason:", required=False, size=140), builderNames=builders, codebases=codebases_to_params(codebases_wintools))
def setupSchedulers(self, _schedulers, spawner_name, try_name, deploy_name, importantManager, codebases, dep_properties): filt = dict(repository=self.repository) if self.branch is not None: filt['branch'] = self.branch _schedulers.append(schedulers.AnyBranchScheduler( name=spawner_name, builderNames=[spawner_name], change_filter=util.ChangeFilter(**filt), onlyImportant=True, fileIsImportant=importantManager.fileIsImportant, codebases=codebases, )) _schedulers.append(schedulers.ForceScheduler( name="force" + spawner_name, builderNames=[spawner_name], codebases=self.createCodebaseParams(codebases))) _schedulers.append(schedulers.ForceScheduler( name=deploy_name, builderNames=[deploy_name], codebases=self.createCodebaseParamsForDeploy(codebases), properties=dep_properties))
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) ]), ]
def masterConfig(num_concurrent, extra_steps=None): if extra_steps is None: extra_steps = [] c = {} c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] triggereables = [] for i in range(num_concurrent): c['schedulers'].append( schedulers.Triggerable( name="trigsched" + str(i), builderNames=["build"])) triggereables.append("trigsched" + str(i)) f = BuildFactory() f.addStep(steps.ShellCommand(command='echo hello')) f.addStep( steps.Trigger( schedulerNames=triggereables, waitForFinish=True, updateSourceStamp=True)) f.addStep(steps.ShellCommand(command='echo world')) f2 = BuildFactory() f2.addStep(steps.ShellCommand(command='echo ola')) for step in extra_steps: f2.addStep(step) c['builders'] = [ BuilderConfig(name="testy", workernames=["kubernetes0"], factory=f), BuilderConfig( name="build", workernames=["kubernetes" + str(i) for i in range(num_concurrent)], factory=f2) ] masterFQDN = os.environ.get('masterFQDN') c['workers'] = [ kubernetes.KubeLatentWorker( 'kubernetes' + str(i), 'buildbot/buildbot-worker', kube_config=kubeclientservice.KubeCtlProxyConfigLoader( namespace=os.getenv("KUBE_NAMESPACE", "default")), masterFQDN=masterFQDN) for i in range(num_concurrent) ] # un comment for debugging what happens if things looks locked. # c['www'] = {'port': 8080} c['protocols'] = {"pb": {"port": "tcp:9989"}} return c
def scheduler_force_stable(name, builders, template_dfl, codebases_stable): return schedulers.ForceScheduler( name=name, buttonName="Stable build", label="Trigger stable build", reason=util.StringParameter(name="reason", label="Reason:", required=False, size=140), builderNames=builders, codebases=codebases_to_params(codebases_stable), properties=[ util.StringParameter(name="template", label="Configuration Template:", default=template_dfl) ])
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps c['schedulers'] = [ schedulers.AnyBranchScheduler(name="sched1", builderNames=["testy1"]), schedulers.ForceScheduler(name="sched2", builderNames=["testy2"]) ] f = BuildFactory() f.addStep(steps.ShellCommand(command='echo hello')) c['builders'] = [ BuilderConfig(name=name, workernames=["local1"], factory=f) for name in ['testy1', 'testy2'] ] return c
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers, util c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() # do a bunch of transfer to exercise the protocol f.addStep(steps.ShellCommand(command=["echo", util.URLForBuild])) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
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) ]) ]
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.AnyBranchScheduler(name="sched", builderNames=["testy"]), schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep(steps.ShellCommand(command='sleep 100', name='sleep')) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import schedulers c['schedulers'] = [ schedulers.AnyBranchScheduler(name="sched", builderNames=["testy"]), schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep(DisconnectingStep()) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(): global num_reconfig num_reconfig += 1 c = {} from buildbot.plugins import schedulers, steps, util c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = util.BuildFactory() f.addStep( steps.SetPropertyFromCommand(property="test", command=["echo", "foo"])) c['builders'] = [ util.BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def get_config_single_step(self, step): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep( steps.FileUpload(workersrc="dir/noexist_path", masterdest="master_dest")) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c
def masterConfig(usePTY): c = {} from buildbot.config import BuilderConfig from buildbot.process.factory import BuildFactory from buildbot.plugins import steps, schedulers c['schedulers'] = [ schedulers.ForceScheduler(name="force", builderNames=["testy"]) ] f = BuildFactory() f.addStep( steps.ShellCommand( command= 'if [ -t 1 ] ; then echo in a terminal; else echo "not a terminal"; fi', usePTY=usePTY)) c['builders'] = [ BuilderConfig(name="testy", workernames=["local1"], factory=f) ] return c