# -*- python -*- # ex: set syntax=python: # Dictionary that the buildmaster pays attention to. c = BuildmasterConfig = {} # BUILD SLAVES # # We load the slaves and their passwords from a separator file, so we can have # this one in SVN. from buildbot.buildslave import BuildSlave import master_private c['slaves'] = [] for slave in master_private.slaves: c['slaves'].append(BuildSlave(slave['name'], slave['password'])) # TCP port through which slaves connect c['slavePortnum'] = 9989 # CHANGE SOURCES from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller( 'https://svn.blender.org/svnroot/bf-blender/trunk/', pollinterval=1200) # BUILDERS # # The 'builders' list defines the Builders, which tell Buildbot how to perform a build: # what steps, and which slaves can execute them. Note that any particular build will # only take place on one slave. from buildbot.process.factory import BuildFactory from buildbot.steps.source import SVN from buildbot.steps.shell import ShellCommand from buildbot.steps.shell import Compile from buildbot.steps.shell import Test from buildbot.steps.transfer import FileUpload from buildbot.steps.transfer import FileDownload from buildbot.steps.master import MasterShellCommand from buildbot.config import BuilderConfig # add builder utility c['builders'] = [] buildernames = [] def add_builder(c, name, factory): slavenames = [] for slave in master_private.slaves: if name in slave['builders']: slavenames.append(slave['name']) f = factory(name) c['builders'].append(BuilderConfig(name=name, slavenames=slavenames, factory=f, category='blender')) buildernames.append(name) # common steps def svn_step(): return SVN(baseURL='https://svn.blender.org/svnroot/bf-blender/%%BRANCH%%/blender', mode='update', defaultBranch='trunk', workdir='blender') def lib_svn_step(dir): return SVN(name='lib svn', baseURL='https://svn.blender.org/svnroot/bf-blender/%%BRANCH%%/lib/' + dir, mode='update', defaultBranch='trunk', workdir='lib/' + dir) def cmake_compile_step(): return Compile(command=['make'], workdir='blender') def cmake_test_step(): return Test(workdir='blender') # make test def scons_compile_step(): return Compile(command=['python', 'scons/scons.py'], workdir='blender') class SlavePack(ShellCommand): pack_script = 'slave_pack.py' def start(self): if self.getProperty('buildername').find('scons') >= 0: self.setCommand(['python', pack_script, 'scons']) else: self.setCommand(['python', pack_script, 'cmake']) ShellCommand.start(self) def file_upload(f, id): filename = 'buildbot_upload_' + id + '.zip' pack_script = 'slave_pack.py' unpack_script = 'master_unpack.py' f.addStep(FileDownload(name='download', mastersrc=pack_script, slavedest=pack_script)) f.addStep(ShellCommand(name='package', command=['python', pack_script], description='packaging', descriptionDone='packaged')) f.addStep(FileUpload(name='upload', slavesrc='buildbot_upload.zip', masterdest=filename, maxsize=100 * 1024 * 1024)) f.addStep(MasterShellCommand(name='unpack', command=['python', unpack_script, filename], description='unpacking', descriptionDone='unpacked')) # linux cmake def linux_cmake(id): f = BuildFactory() f.addStep(svn_step()) f.addStep(cmake_compile_step()) f.addStep(cmake_test_step()) file_upload(f, id) return f add_builder(c, 'linux_x86_64_cmake', linux_cmake) # mac cmake def mac_cmake(id): f = BuildFactory() f.addStep(svn_step()) f.addStep(lib_svn_step('darwin-9.x.universal')) f.addStep(cmake_compile_step()) f.addStep(cmake_test_step()) file_upload(f, id) return f add_builder(c, 'mac_x86_64_cmake', mac_cmake) # win32 scons # TODO: add scons test target def win32_scons(id): f = BuildFactory() f.addStep(svn_step()) f.addStep(lib_svn_step('windows')) f.addStep(scons_compile_step()) file_upload(f, id) return f add_builder(c, 'win32_scons', win32_scons) # SCHEDULERS # # Decide how to react to incoming changes. from buildbot.scheduler import Scheduler from buildbot.schedulers import timed c['schedulers'] = [] #c['schedulers'].append(Scheduler(name="all", branch=None, # treeStableTimer=None, # builderNames=[])) #c['schedulers'].append(timed.Periodic(name="nightly", # builderNames=buildernames, # periodicBuildTimer=24*60*60)) c['schedulers'].append(timed.Nightly(name='nightly', builderNames=buildernames, hour=3, minute=0)) # STATUS TARGETS # # 'status' is a list of Status Targets. The results of each build will be # pushed to these targets. buildbot/status/*.py has a variety to choose from, # including web pages, email senders, and IRC bots. c['status'] = [] from buildbot.status import html from buildbot.status.web import auth, authz authz_cfg = authz.Authz( # change any of these to True to enable; see the manual for more # options gracefulShutdown=False, forceBuild=True, # use this to test your slave once it is set up forceAllBuilds=False, pingBuilder=False, stopBuild=False, stopAllBuilds=False, cancelPendingBuild=False, ) c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg)) # PROJECT IDENTITY c['projectName'] = "Blender" c['projectURL'] = "http://www.blender.org" # the 'buildbotURL' string should point to the location where the buildbot's # internal web server (usually the html.WebStatus page) is visible. This # typically uses the port number set in the Waterfall 'status' entry, but # with an externally-visible host name which the buildbot cannot figure out # without some help. c['buildbotURL'] = "http://builder.blender.org/" # DB URL # # This specifies what database buildbot uses to store change and scheduler # state. You can leave this at its default for all but the largest # installations. c['db_url'] = "sqlite:///state.sqlite"