############### # General Setup ############### c = BuildmasterConfig = {} # Import our passwords passwd_file = open('passwd.py') exec passwd_file passwd_file.close() c['db_url'] = "mysql://buildbot:%s@localhost/buildbot?max_idle=300" % passwd["mysql"] # What port to listen on, used for try attempts as well. c['slavePortnum'] = "tcp:9899:interface=68.233.14.102" c['projectName'] = "Aegisub" c['projectURL'] = "http://devel.aegisub.org/" c['buildbotURL'] = "http://buildbot.aegisub.org/" # Used for accepting wchange notifications (svn-commit-hook) _and_ try attempts. from buildbot.changes.pb import PBChangeSource c['change_source'] = PBChangeSource(port="tcp:9900:interface=127.0.0.1") #################################### # Check if a file is worth a rebuild #################################### re_common = [ '^trunk/aegisub/.*\.c$', '^trunk/aegisub/.*\.cpp$', '^trunk/aegisub/.*\.h$', '^trunk/aegisub/FFmpegSource2/.*', '^trunk/aegisub/src/include/aegisub/.*', '^trunk/aegisub/src/boost/.*', '^trunk/aegisub/src/bitmaps/.*', '^trunk/aegisub/src/config/.*', '^trunk/aegisub/universalchardet/.*', '^trunk/aegisub/src/gl/.*', '^trunk/aegisub/libaegisub/common/.*', '^trunk/aegisub/libaegisub/include/.*', '^trunk/aegisub/*.h', '^trunk/aegisub/src/command/.*\.h$', '^trunk/aegisub/src/command/.*\.cpp$', ] re_common_unix = [ '^trunk/aegisub/configure.in$', '^trunk/aegisub/libass/.*', '^trunk/aegisub/.*Makefile.*$', '^trunk/aegisub/m4macros/.*', '^trunk/aegisub/scripts/unix-.*', '^trunk/aegisub/src/libresrc/.*', '^trunk/aegisub/po/.*', '^trunk/aegisub/acinclude.m4$', '^trunk/aegisub/desktop/.*' '^trunk/aegisub/libaegisub/unix/.*', ] re_osx = [ '^trunk/aegisub/src/libosxutil/.*', '^trunk/aegisub/packages/osx_.*', '^trunk/aegisub/scripts/osx-.*' '^trunk/aegisub/libaegisub/osx/.*', ] re_windows = [ '^trunk/aegisub/build/.*', '^trunk/contrib/csri/.*', '^trunk/contrib/lua51/.*', '^trunk/contrib/hunspell/.*', '^trunk/aegisub/packages/win_installer/.*', '^trunk/aegisub/tinderbox/windows/.*', '^trunk/aegisub/src/msvc/.*' '^trunk/aegisub/libaegisub/windows/.*', ] re_doxygen = [ '^trunk/aegisub/docs/doxygen/.*', '^trunk/aegisub/src/.*\.c$', '^trunk/aegisub/src/.*\.cpp$', '^trunk/aegisub/src/.*\.h$', '^trunk/aegisub/src/libosxutil/.*\.h$', '^trunk/aegisub/src/libosxutil/.*\.c$', '^trunk/aegisub/libaegisub/.*\.h$' '^trunk/aegisub/libaegisub/.*\.cpp$' '^trunk/aegisub/src/command/.*.h$' '^trunk/aegisub/src/command/.*.cpp$' '^trunk/aegisub/src/include/aegisub/.*' '^trunk/aegisub/reporter/.*\.c$', '^trunk/aegisub/reporter/.*\.cpp$', '^trunk/aegisub/reporter/.*\.h$', ] import re, string def check_changes(files, re_array): re_compiled = re.compile(string.joinfields(re_array, "|"), re.I) for changed_file in files: if re.match(re_compiled, changed_file): return True return False def interested_windows(change): return check_changes(change.files, re_common + re_windows) def interested_unix(change): return check_changes(change.files, re_common + re_common_unix) def interested_osx(change): return check_changes(change.files, re_common + re_common_unix + re_osx) def interested_doxygen(change): return check_changes(change.files, re_doxygen) ############# # BUILDSLAVES ############# from buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave("mochi", passwd['mochi'], max_builds=1, properties={'os':'Debian', 'version':'5.0.1', 'osname':'Squeeze'}), BuildSlave("kokoro", passwd['kokoro'], max_builds=1, properties={'os':'OSX', 'version':'10.6.3', 'osname':'Snow Leopard'}), BuildSlave("anpan", passwd['anpan'], max_builds=1, properties={'os':'Windows', 'version':'SP2', 'osname':'Vista'}), BuildSlave("tako", passwd['tako'], max_builds=1, properties={'os':'FreeBSD', 'version':'9.0', 'osname':'CURRENT'}), BuildSlave("nori", passwd['nori'], max_builds=1, properties={'os':'Ubuntu', 'version':'10.10', 'osname':'Maverick'}), BuildSlave("mokona", passwd['mokona'], max_builds=1, properties={'os':'OSX', 'version': '10.4.11', 'osname':'Tiger'}), BuildSlave("shoyu", passwd['shoyu'], max_builds=2, properties={'os':'FreeBSD', 'version': '???', 'osname':'???'}) ] ########### # FACTORIES ########### from buildbot.steps import source, shell from buildbot.steps.shell import Configure, Compile, WithProperties from buildbot.process import factory from buildbot import locks from agi_upload import agi_upload #from OOCompile import OOCompile # General settings source_unix = "http://svn.aegisub.org/trunk/aegisub/" source_windows = "http://svn.aegisub.org/branches/windows" stub = factory.BuildFactory() ############## # Factory # General Unix ############## flinux = factory.BuildFactory() flinux.addStep(source.SVN(mode="clobber", svnurl=source_unix)) flinux.addStep(shell.ShellCommand( command=["./autogen.sh", "--skip-configure"], env={ 'ACLOCAL_FLAGS': '-I /home/verm/build/wx/share/aclocal' }, name = "autogen", description = ["autogening"], descriptionDone = ["autogen"], haltOnFailure=True )) flinux.addStep(shell.ShellCommand( command=["./configure", WithProperties("--with-build-credit=BuildBot: %s (%s)", "buildername", "slavename"), "--disable-check-wx-stc", "--disable-check-wx-opengl", "--with-wx-config=/home/verm/build/wx/bin/wx-config" ], env={ 'CC': '/usr/lib/ccache/gcc', 'CXX': '/usr/lib/ccache/g++', 'LDFLAGS': '-Wl,-rpath=/home/verm/build/wx/lib', 'CCACHE_PATH': '/usr/bin', 'CCACHE_DIR': '/home/verm/.ccache', 'LUA_CFLAGS': '-I/usr/include/lua5.1', 'LUA_LDFLAGS': '-llua5.1' }, name = "configure", description = ["configuring"], descriptionDone = ["configure"], logfiles={ 'config.log': 'config.log', 'config.status': 'config.status' }, haltOnFailure=True )) flinux.addStep(Compile( command=["make"], env={ 'CCACHE_PATH': '/usr/bin', 'CCACHE_DIR': '/home/verm/.ccache' }, name = "build", description = ["building"], descriptionDone = ["build"], haltOnFailure=True )) ######### # Factory # FreeBSD ######### ffbsd = factory.BuildFactory() ffbsd.addStep(source.SVN(mode="clobber", svnurl=source_unix)) ffbsd.addStep(shell.ShellCommand( name = "autogen", description = "autogening", descriptionDone = "autogen", haltOnFailure=True, command=["./autogen.sh", "--skip-configure"], env={ 'ACLOCAL_FLAGS': '-I /usr/local/share/aclocal -I /home/verm/build/wx/share/aclocal', 'ACLOCAL': 'aclocal-1.11', 'AUTOCONF': 'autoconf-2.68', 'AUTOHEADER': 'autoheader-2.68' } )) ffbsd.addStep(shell.ShellCommand( command=["./configure", "--prefix=/usr/local", WithProperties("--with-build-credit=BuildBot: %s (%s)", "buildername", "slavename"), "--with-wx-config=/home/verm/build/wx/bin/wx-config", "--enable-maintainer-mode", "--disable-check-wx-opengl", "--disable-check-wx-stc" ], env={ 'CCACHE_PATH': '/usr/bin:/usr/local/bin', 'CCACHE_DIR': '/usr/home/verm/.ccache', 'CC': '/usr/local/libexec/ccache/gcc', 'CXX': '/usr/local/libexec/ccache/g++', 'CFLAGS': '-I/usr/local/include', 'CXXFLAGS': '-I/usr/local/include', 'LDFLAGS': '-rpath /usr/home/verm/build/wx/lib', # 'LUA_CFLAGS': '-I/usr/local/include/lua51', # 'LUA_LDFLAGS': '-L/usr/local/lib -llua-5.1' }, name = "configure", description = ["configuring"], descriptionDone = ["configure"], logfiles={ 'config.log': 'config.log', 'config.status': 'config.status' }, haltOnFailure=True )) ffbsd.addStep(Compile( command=["gmake"], name = "build", description = ["building"], descriptionDone = ["build"], env={ 'CCACHE_PATH': '/usr/bin:/usr/local/bin', 'CCACHE_DIR': '/usr/home/verm/.ccache' }, haltOnFailure=True )) ############### # Factory # Unix Snapshot ############### funix_dist = factory.BuildFactory() funix_dist.addStep(source.SVN(mode="clobber", svnurl=source_unix)) funix_dist.addStep(shell.ShellCommand( name = "dist", description = "disting", descriptionDone = "dist", command=[ "sh", "-x", "tinderbox/unix/dist.sh", WithProperties("%s", "got_revision"), WithProperties("%s", "slavename"), ], haltOnFailure=True )) #funix_dist.addStep(agi_upload( # blocksize=640*1024, # slavesrc="dist.tar.bz2", # mode=0644, # masterdest=WithProperties("tinderbox/snapshot/aegisub-snap-r%s.tar.bz2", "got_revision"), # name = "upload", # description = ["uploading"], # descriptionDone = ["uploaded"], # haltOnFailure=False, # flunkOnFailure=False #)) ############ # Factory # OS X Intel ############ fosx = factory.BuildFactory() fosx.addStep(source.SVN(mode="clobber", svnurl=source_unix)) fosx.addStep(shell.ShellCommand( name = "autogen", description = "autogening", descriptionDone = "autogen", haltOnFailure=True, command=["./autogen.sh", "--skip-configure"], env={ 'ACLOCAL_FLAGS': '-I /Users/verm/prefix/share/aclocal -I /Developer/usr/share/aclocal -I /opt/local/share/aclocal', 'AUTOMAKE': '/Users/verm/prefix/bin/automake-1.10', 'ACLOCAL': '/Users/verm/prefix/bin/aclocal-1.10', 'AUTOCONF': '/Users/verm/prefix/bin/autoconf', 'AUTOHEADER': '/Users/verm/prefix/bin/autoheader', 'BIN_CONVERT': '/Users/verm/prefix/bin/convert' } )) fosx.addStep(shell.ShellCommand( command=["./configure", "--prefix=/Users/verm/prefix", WithProperties("--with-build-credit=BuildBot: %s (%s)", "buildername", "slavename"), "--with-apple-opengl-framework", "--with-wx-config=/Users/verm/prefix/bin/wx-config", "--enable-debug", "--disable-check-wx-opengl", "--disable-check-wx-stc" ], env={ 'CCACHE_PATH': '/usr/bin', 'CCACHE_DIR': '/Users/verm/.ccache', 'CC': '/opt/local/libexec/ccache/gcc', 'CXX': '/opt/local/libexec/ccache/g++', 'PKG_CONFIG': '/Users/verm/prefix/bin/pkg-config', 'PKG_CONFIG_PATH': '/Users/verm/prefix/lib/pkgconfig', 'CXXFLAGS': '-I/Users/verm/prefix/include', 'LDFLAGS': '-L/Users/verm/prefix/lib -Wl,-rpath=/Users/verm/prefix/lib', 'LUA_CFLAGS': '-I/Users/verm/prefix/include/lua51', 'LUA_LDFLAGS': '-L/Users/verm/prefix/lib/lua51 -llua', 'OPENAL_CFLAGS': '-framework OpenAL', 'OPENAL_LIBS': '-framework OpenAL', 'CFLAGS': '-I/Developer/SDKs/MacOSX10.5.sdk/usr/include', 'ICONV_LDFLAGS': '/usr/lib/libiconv.dylib', }, name = "configure", description = ["configuring"], descriptionDone = ["configure"], logfiles={ 'config.log': 'config.log', 'config.status': 'config.status' }, haltOnFailure=True )) fosx.addStep(Compile( command=["make"], name = "build", description = ["building"], descriptionDone = ["build"], env={ 'CCACHE_PATH': '/usr/bin', 'CCACHE_DIR': '/Users/verm/.ccache' }, haltOnFailure=True )) fosx.addStep(shell.ShellCommand( command=["make", "osx-tinderbox-bundle"], env={ 'T_BUNDLE': WithProperties("aegisub-%s-%s-%s-r%s", "buildername", "slavename", "buildnumber", "got_revision"), }, name = "bundle", description = ["bundling"], descriptionDone = ["bundle"], haltOnFailure=True )) fosx.addStep(shell.ShellCommand( command=["make", "osx-tinderbox-dmg"], env={ 'T_BUNDLE': WithProperties("aegisub-%s-%s-%s-r%s", "buildername", "slavename", "buildnumber", "got_revision"), 'T_DMG': WithProperties("aegisub-%s-%s-%s-r%s", "buildername", "slavename", "buildnumber", "got_revision"), }, name = "dmg", description = ["dmging"], descriptionDone = ["dmg"], haltOnFailure=True )) #fosx.addStep(agi_upload( # blocksize=640*1024, # slavesrc="bundle.dmg", # mode=0644, # masterdest=WithProperties("tinderbox/osx/aegisub-%s-%s-%s-r%s.dmg", "buildername", "slavename", "buildnumber", "got_revision")), # name = "upload", # description = ["uploading"], # descriptionDone = ["uploaded"], # haltOnFailure=False, # flunkOnFailure=False #) ######### # Factory # Windows ######### fwin = factory.BuildFactory() fwin.addStep(source.SVN(mode="clobber", svnurl=source_windows)) fwin.addStep(shell.ShellCommand( command=["copy aegisub\\tinderbox\\windows\\config_windows.h aegisub\\src\\config\\config_windows.h"], name = "configure", description = ["configuring"], descriptionDone = ["configure"], haltOnFailure=True )) fwin.addStep(Compile( command=["aegisub\\tinderbox\\windows\\anpan.bat", "Release", "Win32"], name = "build", description = ["building"], descriptionDone = ["build"], haltOnFailure=True )) fwin.addStep(shell.ShellCommand( command=[WithProperties("aegisub\\tinderbox\\windows\\dist.bat %s %s %s %s", "buildername", "slavename", "buildnumber", "got_revision")], name = "dist", description = ["dist"], descriptionDone = ["dist"], haltOnFailure=True )) #fwin.addStep(agi_upload( # blocksize=640*1024, # slavesrc="dist.7z", # mode=0644, # masterdest=WithProperties("tinderbox/windows/aegisub-%s-%s-%s-r%s.7z", "buildername", "slavename", "buildnumber", "got_revision")), # name = "upload", # description = ["uploading"], # descriptionDone = ["uploaded"], # haltOnFailure=False, # flunkOnFailure=False #) fwin64 = factory.BuildFactory() fwin64.addStep(source.SVN(mode="clobber", svnurl=source_windows)) fwin64.addStep(shell.ShellCommand( command=["copy aegisub\\tinderbox\\windows\\config_windows.h aegisub\\src\\config\\config_windows.h"], name = "configure", description = ["configuring"], descriptionDone = ["configure"], haltOnFailure=True )) fwin64.addStep(Compile( name = "build", command=["aegisub\\tinderbox\\windows\\anpan.bat", "Release", "x64"], description = ["building"], descriptionDone = ["build"], haltOnFailure=True )) fwin64.addStep(shell.ShellCommand( command=[WithProperties("aegisub\\tinderbox\\windows\\dist.bat %s %s %s %s", "buildername", "slavename", "buildnumber", "got_revision")], name = "dist", description = ["dist"], descriptionDone = ["dist"], haltOnFailure=True )) #fwin64.addStep(agi_upload( # blocksize=640*1024, # slavesrc="dist.7z", # mode=0644, # masterdest=WithProperties("tinderbox/windows/aegisub-%s-%s-%s-r%s.7z", "buildername", "slavename", "buildnumber", "got_revision")), # name = "upload", # description = ["uploading"], # descriptionDone = ["uploaded"], # haltOnFailure=False, # flunkOnFailure=False #) ######### # Factory # WWW ######### fwww_dox = factory.BuildFactory() fwww_dox.addStep(source.SVN(mode="clobber", svnurl=source_unix)) fwww_dox.addStep(shell.ShellCommand( name = "aegisub", description = "generating", descriptionDone = "aegisub", logfiles={ 'doxygen.log': 'doxygen.log' }, command=[ "sh", "-x", "tinderbox/www/doxygen.sh", "aegisub" ], haltOnFailure=True )) fwww_dox.addStep(shell.ShellCommand( name = "libaegisub", description = "generating", descriptionDone = "libaegisub", logfiles={ 'doxygen.log': 'doxygen.log' }, command=[ "sh", "-x", "tinderbox/www/doxygen.sh", "libaegisub" ], haltOnFailure=True )) fwww_dox.addStep(shell.ShellCommand( name = "reporter", description = "generating", descriptionDone = "reporter", logfiles={ 'doxygen.log': 'doxygen.log' }, command=[ "sh", "-x", "tinderbox/www/doxygen.sh", "reporter" ], haltOnFailure=True )) ########## # BUILDERS ########## slave_win = ["anpan"] slave_freebsd = ["tako"] slave_debian = ["mochi"] slave_ubuntu = ["nori"] slave_osx = ["kokoro"] slave_www = ['shoyu'] Windowsx8632 = { 'name': "Windows-x86_32", 'slavenames': slave_win, 'builddir': "full_Windows-x86_32", 'factory': fwin } Windowsx8664 = { 'name': "Windows-x86_64", 'slavenames': slave_win, 'builddir': "full_Windows-x86_64", 'factory': fwin64 } Darwinx8664 = { 'name': "Darwin-x86_64", 'slavenames': slave_osx, 'builddir': "full_Darwin-x86_64", 'factory': fosx } FreeBSDx8664 = { 'name': "FreeBSD-x86_64", 'slavenames': slave_freebsd, 'builddir': "full_FreeBSD-x86_64", 'factory': ffbsd } Ubuntux8664 = { 'name': "Ubuntu-x86_64", 'slavenames': slave_ubuntu, 'builddir': "full_Ubuntu-x86_64", 'factory': flinux } Debianx8632 = { 'name': "Debian-x86_32", 'slavenames': slave_debian, 'builddir': "full_Debian-x86_32", 'factory': flinux } UNIXDist = { 'name': "UNIX Dist", 'slavenames': slave_debian + slave_ubuntu + slave_freebsd, 'builddir': "UNIX_Dist", 'factory': funix_dist } Doxygen = { 'name': "Doxygen", 'slavenames': slave_www, 'builddir': "www_Doxygen", 'factory': fwww_dox } c['builders'] = [ Windowsx8632, Windowsx8664, Darwinx8664, FreeBSDx8664, Ubuntux8664, Debianx8632, UNIXDist, Doxygen ] builder_name_windows = [ "Windows-x86_32", "Windows-x86_64" ] builder_name_unix = [ "FreeBSD-x86_64", "Ubuntu-x86_64", "Debian-x86_32" ] builder_name_darwin = [ "Darwin-x86_64" ] builder_name_www = [ "Doxygen" ] ############ # SCHEDULERS ############ from buildbot.scheduler import Scheduler from buildbot.scheduler import Dependent full_windows = Scheduler(name="full_windows", branch=None, treeStableTimer=901, builderNames=builder_name_windows, fileIsImportant=interested_windows) full_unix = Scheduler(name="full_unix", branch=None, treeStableTimer=901, builderNames=builder_name_unix, fileIsImportant=interested_unix) full_darwin = Scheduler(name="full_darwin", branch=None, treeStableTimer=901, builderNames=builder_name_darwin, fileIsImportant=interested_osx) full_www = Scheduler(name="full_www", branch=None, treeStableTimer=901, builderNames=builder_name_www, fileIsImportant=interested_doxygen) unix_dist = Dependent("unix_dist", full_unix, builderNames=["UNIX Dist"]) from buildbot.scheduler import Try_Jobdir try_job = Try_Jobdir("try", builder_name_windows + builder_name_unix + builder_name_darwin, jobdir="jobdir") c['schedulers'] = [full_windows, full_unix, full_darwin, full_www, unix_dist] from buildbot import scheduler ################ # STATUS TARGETS ################ c['status'] = [] # Website http://builder.aegisub.org/ from buildbot.status import html c['status'].append(html.WebStatus(http_port="tcp:8001:interface=127.0.0.1", allowForce=1)) # Send out status emails. from buildbot.status import mail from buildbot.status.builder import Results from datetime import datetime def message(attrs): text = list() text.append("STATUS : %s" % attrs['result'].title()) text.append("REVISION : %s" % attrs['revision']) text.append("BUILD URL : %s" % attrs['buildURL']) text.append("COMMITTERS : %s" % ' '.join(sorted(attrs['responsibleUsers']))) text.append("") text.append("LOG FILES") for log in attrs['logs']: name, url, lines, logstatus = log text.append(" %s (%s):\n %s" % (name, Results[logstatus], url)) text.append("") if attrs['changes']: text.append("CHANGES") for change in attrs['changes']: text.append(" Committer : %s" % change.who) text.append(" Revision : %s" % change.revision) text.append(" Changeset : http://devel.aegisub.org/changeset/%s" % change.revision) text.append(" Time : %s" % datetime.fromtimestamp(change.when).strftime("%Y-%m-%d %H:%M:%S")) text.append("") text.append(" Files") for file in change.files: text.append(" %s" % file) text.append(" Log:\n%s" % ' ' + change.comments.replace("\n", "\n ")) text.append("") text.append("---------------------------------------------------------------") text.append("") text.append("") text.append("- %s" % attrs['buildbotURL']) return ("\n".join(text), 'plain') c['status'].append(mail.MailNotifier(fromaddr="tinderbox@aegisub.org", extraRecipients=["aegisub-tinderbox@aegisub.org"], sendToInterestedUsers=False, customMesg=message, mode="problem", extraHeaders={'Reply-To':'aegisub-tinderbox@aegisub.org'})) # IRC! from buildbot.status import words c['status'].append(words.IRC( host="irc.rizon.net", nick="aegibuild", channels=["#aegisub"], notify_events={ 'exception': 1, 'successToFailure': 1, 'failureToSuccess': 1 } )) c['status'].append(words.IRC( host="irc.freenode.net", nick="aegibuild", channels=["#aegisub"], notify_events={ 'exception': 1, 'successToFailure': 1, 'failureToSuccess': 1 } )) # Realtime client # from buildbot.status import client # c['status'].append(client.PBListener(9988))