# -*- python -*- # ex: set syntax=python: # dictionary for configuration c = BuildmasterConfig = {} # project def c['projectName'] = "ALICE TRD" c['projectURL'] = "https://alice.physi.uni-heidelberg.de/" c['buildbotURL'] = "http://trdro1.physi.uni-heidelberg.de:8010/" # DB for state and change storage c['db_url'] = "sqlite:///state.sqlite" # define our build slaves from buildbot.buildslave import BuildSlave import trd_passwords c['slaves'] = [ # BuildSlave("debian5", "debian5"), BuildSlave("slc4", trd_passwords.trdpwd), BuildSlave("slc5", trd_passwords.trdpwd), BuildSlave("slc5-x86_64", trd_passwords.trdpwd), BuildSlave("slc6-x86_64", trd_passwords.trdpwd), ] c['slavePortnum'] = 9989 # change sources from buildbot.changes.svnpoller import SVNPoller, split_file_branches from twisted.python import log # split path into (branch, relative path name) def my_split_file_branches(path): # log.msg("Hello, World! %s" % path) pieces = path.split('/') # Check for trunk/tags/branches in 2nd or 3rd part of path name. Not very nice, might be better # to do it with regular expressions. The previous implementation only searched in the 2nd position, # failing for paths like TRAP_compilers/trapcc/trunk. if pieces[1] == 'trunk': return ('/'.join(pieces[0:2]), '/'.join(pieces[2:])) elif pieces[1] == 'branches' or pieces[1] == 'tags': return ('/'.join(pieces[0:3]), '/'.join(pieces[3:])) elif pieces[2] == 'trunk': return ('/'.join(pieces[0:3]), '/'.join(pieces[3:])) elif pieces[2] == 'branches' or pieces[2] == 'tags': return ('/'.join(pieces[0:4]), '/'.join(pieces[4:])) elif pieces[3] == 'trunk': return ('/'.join(pieces[0:4]), '/'.join(pieces[4:])) elif pieces[3] == 'branches' or pieces[3] == 'tags': return ('/'.join(pieces[0:5]), '/'.join(pieces[5:])) else: return None source_code_svn_url='https://alice.physi.uni-heidelberg.de/svn/trd/' svn_poller = SVNPoller( svnurl=source_code_svn_url, project="trd", split_file=my_split_file_branches, pollinterval=10, # seconds histmax=10, svnbin='/usr/bin/svn', ) c['change_source'] = [ svn_poller ] # Change Filters & schedulers from buildbot.schedulers.filter import ChangeFilter from buildbot.scheduler import Scheduler c['schedulers'] = [] from buildbot import locks seq_lock = locks.SlaveLock("slave_builds", maxCount = 1) from buildbot.process import factory from buildbot.steps import source, shell from buildbot.steps.source import SVN from buildbot.steps.shell import Compile, ShellCommand from buildbot.steps.python_twisted import Trial from buildbot.process.buildstep import BuildStep from buildbot.status.builder import SUCCESS, FAILURE from buildbot.process.properties import WithProperties import re def is_tag(self, step): if re.search("(branches|tags)", step.getProperty("branch")) == None: return False else: return True def is_ipkg(self, step): if re.search("ipkg", step.getProperty("buildername")) == None: return False else: return True class Checkout(SVN): def __init__(self, **kwargs): SVN.__init__(self, **kwargs) def start(self): if self.branch == None and self.getProperty("branch") == None: if re.search("libtrd", self.build.getProperty("buildername")): self.branch = "libTRD/trunk" elif re.search("libdim", self.build.getProperty("buildername")): self.branch = "libdim/trunk" elif re.search("trdce", self.build.getProperty("buildername")): self.branch = "trdce/trunk" elif re.search("pvss_mockup", self.build.getProperty("buildername")): self.branch = "pvss_mockup/trunk" elif re.search("wingdb", self.build.getProperty("buildername")): self.branch = "wingDB/trunk" elif re.search("coco", self.build.getProperty("buildername")): self.branch = "CommandCoder/trunk" elif re.search("fxsproxy", self.build.getProperty("buildername")): self.branch = "fxsproxy/trunk" elif re.search("iseg2dim", self.build.getProperty("buildername")): self.branch = "hv/iseg2dim/trunk" elif re.search("dim2shell", self.build.getProperty("buildername")): self.branch = "dim2shell/trunk" elif re.search("dimarch", self.build.getProperty("buildername")): self.branch = "dimarch/trunk" elif re.search("scudim", self.build.getProperty("buildername")): self.branch = "scudim/trunk" elif re.search("trapasm", self.build.getProperty("buildername")): self.branch = "TRAP_compilers/trapasm/trunk" elif re.search("libptrg", self.build.getProperty("buildername")): self.branch = "pretrigger/libptrg/trunk" elif re.search("ptfsmd", self.build.getProperty("buildername")): self.branch = "pretrigger/application/ptfsmd/trunk" else: return FAILURE self.setProperty("branch", self.branch) SVN.start(self) class Configure(Compile): name = "configure" description = "configuring" descriptionDone = "configured" command = "(([ -x bootstrap ] && ./bootstrap) || true) && (echo configuring; ./configure)" def __init__(self, **kwargs): Compile.__init__(self, **kwargs) def start(self): if re.search("ipkg", self.build.getProperty("buildername")): if re.search("tags", self.build.getProperty("branch")): self.command = "./bootstrap && ARM_ROOTFS=/home/trd/buildbot/armfs/tags/ ipkg/rules configure" else: self.command = "./bootstrap && ARM_ROOTFS=/home/trd/buildbot/armfs/trunk/ ipkg/rules configure" Compile.start(self) class BuildPackage(Compile): name = "packaging" description = "building package" descriptionDone = "built package" command = ["make", "rpm"] doStepIf = is_tag # packages are only built for tagged versions def __init__(self, **kwargs): Compile.__init__(self, **kwargs) def start(self): if re.search("slc4", self.build.getProperty("buildername")): self.command = "rm /usr/local/buildbot/rpm/RPMS/i386/*; rpm_env=buildbot rpm_os=slc4 make rpm && cp /usr/local/buildbot/rpm/RPMS/i386/* /home/trd/buildbot/packages/slc4/" elif re.search("slc5-x86_64", self.build.getProperty("buildername")): self.command = "rm /usr/local/buildbot/rpm/RPMS/x86_64/*; make rpm && cp /usr/local/buildbot/rpm/RPMS/x86_64/* /home/trd/buildbot/packages/slc5/" elif re.search("slc5", self.build.getProperty("buildername")): self.command = "rm /usr/local/buildbot/rpm/RPMS/i386/*; make rpm && cp /usr/local/buildbot/rpm/RPMS/i386/* /home/trd/buildbot/packages/slc5/" elif re.search("slc6-x86_64", self.build.getProperty("buildername")): self.command = "rm /usr/local/buildbot/rpm/RPMS/x86_64/*; make rpm && cp /usr/local/buildbot/rpm/RPMS/x86_64/* /home/trd/buildbot/packages/slc6/" elif re.search("ipkg", self.build.getProperty("buildername")): self.command = "rm ../*.ipk; ARM_ROOTFS=/home/trd/buildbot/armfs/tags/ make ipkg && cp ../*.ipk /home/trd/buildbot/packages/ipkg/" else: self.command = "echo no package building for this architecture" Compile.start(self) def createSummary(self, log): Compile.createSummary(self, log) rev = self.getProperty("revision") branch = self.getProperty("branch") url = "https://alice.physi.uni-heidelberg.de/viewvc/trd/%s" % branch self.addURL("src", url) class UploadPackage(ShellCommand): name = "uploading" description = "uploading" descriptionDone = "upload" doStepIf = is_tag def __init__(self, **kwargs): ShellCommand.__init__(self, **kwargs) def start(self): if re.search("slc4", self.build.getProperty("buildername")): # self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/i386/*`; do curl -ubuildbot:trd123 -F rpm=@${pkg} http://alice.physi.uni-heidelberg.de/software/upload/rpm-upload.cgi; done;" self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/i386/*`; do curl -ubuildbot:trd123 -F pkgfile=@${pkg} -F pkgtype=slc4-i386 http://alice.physi.uni-heidelberg.de/pkgrepo.cgi; done;" elif re.search("slc5-x86_64", self.build.getProperty("buildername")): self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/x86_64/*`; do curl -ubuildbot:trd123 -F pkgfile=@${pkg} -F pkgtype=slc5-x86_64 http://alice.physi.uni-heidelberg.de/pkgrepo.cgi; done;" elif re.search("slc5", self.build.getProperty("buildername")): self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/i386/*`; do curl -ubuildbot:trd123 -F pkgfile=@${pkg} -F pkgtype=slc5-i386 http://alice.physi.uni-heidelberg.de/pkgrepo.cgi; done;" # elif re.search("slc5", self.build.getProperty("buildername")): # self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/i386/*`; do curl -ubuildbot:trd123 -F rpm=@${pkg} http://alice.physi.uni-heidelberg.de/software/upload/rpm-upload-slc5.cgi; done;" elif re.search("slc6-x86_64", self.build.getProperty("buildername")): self.command = "for pkg in `ls /usr/local/buildbot/rpm/RPMS/x86_64/*`; do curl -ubuildbot:trd123 -F pkgfile=@${pkg} -F pkgtype=slc6-x86_64 http://alice.physi.uni-heidelberg.de/pkgrepo.cgi; done;" elif re.search("ipkg", self.build.getProperty("buildername")): self.command = "for pkg in `ls ../*.ipk`; do curl -ubuildbot:trd123 -F pkgfile=@${pkg} -F pkgtype=ipkg http://alice.physi.uni-heidelberg.de/pkgrepo.cgi; done;" # elif re.search("ipkg", self.build.getProperty("buildername")): # self.command = "for pkg in `ls ../*.ipk`; do curl -ubuildbot:trd123 -F ipkg=@${pkg} http://alice.physi.uni-heidelberg.de/software/upload/ipkg-upload.cgi; done;" else: self.command = "echo 'no package to upload for this architecture'" ShellCommand.start(self) class Install(Compile): name = "installation" description = "installing" descriptionDone = "installed" doStepIf = is_ipkg def __init__(self, **kwargs): Compile.__init__(self, **kwargs) def start(self): if re.search("tags", self.build.getProperty("branch")): self.command = "make DESTDIR=%s install-strip && find %s -name *.la -exec rm {} \;" % ("/home/trd/buildbot/armfs/tags/", "/home/trd/buildbot/armfs/tags/") else: self.command = "make DESTDIR=%s install-strip && find %s -name *.la -exec rm {} \;" % ("/home/trd/buildbot/armfs/trunk/", "/home/trd/buildbot/armfs/trunk/") Compile.start(self) class FinishBuild(ShellCommand): name = "finish" description = "finish" descriptionDone = "finished" def __init__(self, **kwargs): ShellCommand.__init__(self, **kwargs) def start(self): ShellCommand.start(self) def determine_foo(props): return 'blub' f = factory.GNUAutoconf(Checkout(baseURL='https://alice.physi.uni-heidelberg.de/svn/trd/', defaultBranch=None, mode='copy'), configure=None, compile=None, test=None) f.addStep(Configure()) f.addStep(Compile(command="make")) f.addStep(Install()) f.addStep(BuildPackage()) f.addStep(UploadPackage()) #f.addStep(FinishBuild(command=["echo", "done"])) # very simple debug factory, can be used to clean up stuck processes fdeb = factory.BuildFactory() fdeb.addStep(shell.Compile(command=["echo", "bla"])) c['builders'] = [ # libtrd # { 'name': "libtrd-deb5", 'slavename': "debian5", 'builddir': "libtrd-deb5", 'factory': f }, { 'name': "libtrd-slc4", 'slavename': "slc4", 'builddir': "libtrd-slc4", 'factory': f }, { 'name': "libtrd-slc5", 'slavename': "slc5", 'builddir': "libtrd-slc5", 'factory': f }, { 'name': "libtrd-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "libtrd-slc5-x86_64", 'factory': f }, { 'name': "libtrd-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "libtrd-slc6-x86_64", 'factory': f }, { 'name': "libtrd-ipkg", 'slavename': "slc4", 'builddir': "libtrd-ipkg", 'factory': f, 'locks': [seq_lock.access('counting')] }, # libdim # { 'name': "libdim-deb5", 'slavename': "debian5", 'builddir': "libdim-deb5", 'factory': f }, { 'name': "libdim-slc4", 'slavename': "slc4", 'builddir': "libdim-slc4", 'factory': f }, { 'name': "libdim-slc5", 'slavename': "slc5", 'builddir': "libdim-slc5", 'factory': f }, { 'name': "libdim-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "libdim-slc5-x86_64", 'factory': f }, { 'name': "libdim-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "libdim-slc6-x86_64", 'factory': f }, { 'name': "libdim-ipkg", 'slavename': "slc4", 'builddir': "libdim-ipkg", 'factory': f, 'locks': [seq_lock.access('counting')] }, # trdce { 'name': "trdce-ipkg", 'slavename': "slc4", 'builddir': "trdce-ipkg", 'factory': f, 'locks': [seq_lock.access('counting')] }, # CommandCoder # { 'name': "coco-deb5", 'slavename': "debian5", 'builddir': "coco-deb5", 'factory': f }, { 'name': "coco-slc4", 'slavename': "slc4", 'builddir': "coco-slc4", 'factory': f }, { 'name': "coco-slc5", 'slavename': "slc5", 'builddir': "coco-slc5", 'factory': f }, { 'name': "coco-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "coco-slc5-x86_64", 'factory': f }, { 'name': "coco-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "coco-slc6-x86_64", 'factory': f }, # pvss_mockup # { 'name': "pvss_mockup-deb5", 'slavename': "debian5", 'builddir': "pvss_mockup-deb5", 'factory': f }, { 'name': "pvss_mockup-slc5", 'slavename': "slc5", 'builddir': "pvss_mockup-slc5", 'factory': f }, { 'name': "pvss_mockup-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "pvss_mockup-slc5-x86_64", 'factory': f }, { 'name': "pvss_mockup-slc4", 'slavename': "slc4", 'builddir': "pvss_mockup-slc4", 'factory': f }, { 'name': "pvss_mockup-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "pvss_mockup-slc6-x86_64", 'factory': f }, # wingDB # { 'name': "wingdb-deb5", 'slavename': "debian5", 'builddir': "wingdb-deb5", 'factory': f }, { 'name': "wingdb-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "wingdb-slc6-x86_64", 'factory': f }, { 'name': "wingdb-slc5", 'slavename': "slc5", 'builddir': "wingdb-slc5", 'factory': f }, { 'name': "wingdb-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "wingdb-slc5-x86_64", 'factory': f }, { 'name': "wingdb-slc4", 'slavename': "slc4", 'builddir': "wingdb-slc4", 'factory': f }, # libptrg { 'name': "libptrg-slc5", 'slavename': "slc5", 'builddir': "libptrg-slc5", 'factory': f }, { 'name': "libptrg-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "libptrg-slc5-x86_64", 'factory': f }, { 'name': "libptrg-slc4", 'slavename': "slc4", 'builddir': "libptrg-slc4", 'factory': f }, { 'name': "libptrg-ipkg", 'slavename': "slc4", 'builddir': "libptrg-ipkg", 'factory': f, 'locks': [seq_lock.access('counting')] }, # ptfsmd { 'name': "ptfsmd-slc5", 'slavename': "slc5", 'builddir': "ptfsmd-slc5", 'factory': f }, { 'name': "ptfsmd-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "ptfsmd-slc5-x86_64", 'factory': f }, # trapcc # { 'name': "trapcc-deb5", 'slavename': "debian5", 'builddir': "trapcc-deb5", 'factory': f }, { 'name': "trapcc-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "trapcc-slc6-x86_64", 'factory': f }, { 'name': "trapcc-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "trapcc-slc5-x86_64", 'factory': f }, { 'name': "trapcc-slc5", 'slavename': "slc5", 'builddir': "trapcc-slc5", 'factory': f }, { 'name': "trapcc-slc4", 'slavename': "slc4", 'builddir': "trapcc-slc4", 'factory': f }, # trapasm # { 'name': "trapasm-deb5", 'slavename': "debian5", 'builddir': "trapasm-deb5", 'factory': f }, { 'name': "trapasm-slc5", 'slavename': "slc5", 'builddir': "trapasm-slc5", 'factory': f }, { 'name': "trapasm-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "trapasm-slc5-x86_64", 'factory': f }, { 'name': "trapasm-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "trapasm-slc6-x86_64", 'factory': f }, # fxsproxy { 'name': "fxsproxy-slc5", 'slavename': "slc5", 'builddir': "fxsproxy-slc5", 'factory': f }, { 'name': "fxsproxy-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "fxsproxy-slc5-x86_64", 'factory': f }, { 'name': "fxsproxy-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "fxsproxy-slc6-x86_64", 'factory': f }, # iseg2dim # { 'name': "iseg2dim-slc5", 'slavename': "slc5", 'builddir': "iseg2dim-slc5", 'factory': f }, # { 'name': "iseg2dim-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "iseg2dim-slc5-x86_64", 'factory': f }, { 'name': "iseg2dim-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "iseg2dim-slc6-x86_64", 'factory': f }, # dim2shell { 'name': "dim2shell-slc5", 'slavename': "slc5", 'builddir': "dim2shell-slc5", 'factory': f }, { 'name': "dim2shell-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "dim2shell-slc5-x86_64", 'factory': f }, { 'name': "dim2shell-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "dim2shell-slc6-x86_64", 'factory': f }, # dimarch { 'name': "dimarch-slc5", 'slavename': "slc5", 'builddir': "dimarch-slc5", 'factory': f }, { 'name': "dimarch-slc5-x86_64", 'slavename': "slc5-x86_64", 'builddir': "dimarch-slc5-x86_64", 'factory': f }, { 'name': "dimarch-slc6-x86_64", 'slavename': "slc6-x86_64", 'builddir': "dimarch-slc6-x86_64", 'factory': f }, # scudim { 'name': "scudim-ipkg", 'slavename': "slc4", 'builddir': "scudim-ipkg", 'factory': f }, ] def schedule(name, branch): builders_sel=filter(lambda x: re.search(name, x['name']) , c['builders']) c['schedulers'].append(Scheduler(name="%s_sched" % name, treeStableTimer=30, change_filter=ChangeFilter( branch_re = "^%s" % branch), builderNames=[builder['name'] for builder in builders_sel])) schedule("libtrd", "libTRD") schedule("libdim", "libdim") schedule("trdce", "trdce") schedule("coco", "CommandCoder") schedule("pvss_mockup", "pvss_mockup") schedule("wingdb", "wingDB") schedule("iseg2dim", "hv/iseg2dim") schedule("libptrg", "pretrigger/libptrg") schedule("ptfsmd", "pretrigger/application/ptfsmd") schedule("trapcc", "TRAP_compilers/trapcc") schedule("trapasm", "TRAP_compilers/trapasm") schedule("fxsproxy", "fxsproxy") schedule("dim2shell", "dim2shell") schedule("dimarch", "dimarch") schedule("scudim", "scudim") c['status'] = [] # web interface from buildbot.status import html from buildbot.status.web import auth, authz from buildbot.status.web.auth import HTPasswdAuth, BasicAuth authz_cfg=authz.Authz( # change any of these to True to enable; see the manual for more # options auth = BasicAuth([ ('jkl', trd_passwords.trdpwd), ('tom', trd_passwords.trdpwd) ]), gracefulShutdown = False, forceBuild = True, forceAllBuilds = auth, pingBuilder = True, stopBuild = auth, stopAllBuilds = auth, cancelPendingBuild = auth, ) c['status'].append(html.WebStatus(http_port="tcp:8010:interface=10.160.0.170", authz=authz_cfg))