Index: masters/master.client.dart.fyi/master.cfg |
=================================================================== |
--- masters/master.client.dart.fyi/master.cfg (revision 0) |
+++ masters/master.client.dart.fyi/master.cfg (revision 0) |
@@ -0,0 +1,333 @@ |
+# -*- python -*- |
+# ex: set syntax=python: |
+ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# It has one job: define a dictionary named BuildmasterConfig. This |
+# dictionary has a variety of keys to control different aspects of the |
+# buildmaster. They are documented in docs/config.xhtml . |
+ |
+from buildbot import locks |
+from buildbot.changes import svnpoller |
+from buildbot.scheduler import Dependent |
+from buildbot.scheduler import Scheduler |
+from buildbot.scheduler import Periodic |
+ |
+from common import chromium_utils |
+from master import build_utils |
+from master import chromium_step |
+from master import master_utils |
+from master import slaves_list |
+from master.factory import chromium_factory |
+from master.factory import gclient_factory |
+from master.factory import dart_factory |
+from buildbot.process.buildstep import RemoteShellCommand |
+ |
+import config |
+ActiveMaster = config.Master.DartFYI |
+ |
+# Hack to increase timeout for steps, dart2js debug checked mode takes more than |
+# 8 hours. |
+RemoteShellCommand.__init__.im_func.func_defaults = (None, |
+ 1, |
+ 1, |
+ 1200, |
+ 48*60*60, {}, |
+ 'slave-config', |
+ True) |
+ |
+MASTER_HOST = ActiveMaster.master_host |
+WEB_STATUS = True |
+MAIL_NOTIFIER = False |
+TREE_GATE_KEEPER = False |
+GOOD_REVISIONS = False |
+MASTER_PORT = ActiveMaster.master_port |
+ |
+ |
+# This is the dictionary that the buildmaster pays attention to. We also use |
+# a shorter alias to save typing. |
+c = BuildmasterConfig = {} |
+ |
+config.DatabaseSetup(c, require_dbconfig=ActiveMaster.is_production_host) |
+ |
+# 'slavePortnum' defines the TCP port to listen on. This must match the value |
+# configured into the buildslaves (with their --master option) |
+c['slavePortnum'] = ActiveMaster.slave_port |
+ |
+# Setup a per slave lock to prevent more than one thing running at once on |
+# a single slave. |
+slave_lock = locks.SlaveLock('overload_lock', maxCount=1) |
+ |
+ |
+# Slave allocation |
+# build-base-name, category, platform, builder, tester |
+variants = [] |
+ |
+ |
+slaves = slaves_list.SlavesList('slaves.cfg', 'Dart') |
+ |
+ |
+####### CHANGESOURCES |
+ |
+def DartTreeFileSplitter(path): |
+ pieces = path.split('/') |
+ if pieces[0] == 'trunk': |
+ return ('trunk', '/'.join(pieces[1:])) |
+ elif pieces[0] == 'branches': |
+ return ('/'.join(pieces[0:2]), |
+ '/'.join(pieces[2:])) |
+ else: |
+ return None |
+ |
+dart_revision_url = "http://code.google.com/p/dart/source/detail?r=%s" |
+ |
+# Polls config.Master.dart_url for changes |
+poller = svnpoller.SVNPoller(svnurl=config.Master.dart_url, |
+ split_file=DartTreeFileSplitter, |
+ pollinterval=10, |
+ revlinktmpl=dart_revision_url) |
+ |
+c['change_source'] = [poller] |
+ |
+####### SCHEDULERS |
+ |
+## configure the Schedulers |
+ |
+builder_names = [] |
+for v in variants: |
+ builder_names.append(v['name']) |
+ |
+s = Scheduler( |
+ name='main', |
+ branch="branches/bleeding_edge", |
+ treeStableTimer=0, |
+ builderNames=builder_names |
+) |
+ |
+c['schedulers'] = [s] |
+ |
+ |
+####### BUILDERS |
+ |
+# buildbot/process/factory.py provides several BuildFactory classes you can |
+# start with, which implement build processes for common targets (GNU |
+# autoconf projects, CPAN perl modules, etc). The factory.BuildFactory is the |
+# base class, and is configured with a series of BuildSteps. When the build |
+# is run, the appropriate buildslave is told to execute each Step in turn. |
+ |
+# the first BuildStep is typically responsible for obtaining a copy of the |
+# sources. There are source-obtaining Steps in buildbot/process/step.py for |
+# CVS, SVN, and others. |
+ |
+builders = [] |
+ |
+# ---------------------------------------------------------------------------- |
+# FACTORIES |
+ |
+factory_base = { |
+ 'vm-mac': dart_factory.DartFactory('dart', 'vm-mac'), |
+ 'vm-linux': dart_factory.DartFactory('dart', 'vm-linux'), |
+ 'vm-win32': dart_factory.DartFactory('dart', 'vm-win32'), |
+ 'dartc-linux': dart_factory.DartFactory('dart', 'dartc-linux'), |
+ 'dart_client': dart_factory.DartFactory('dart', 'dart_client'), |
+ 'dart-editor': dart_factory.DartFactory('dart', 'dart-editor'), |
+ 'frog': dart_factory.DartFactory('dart', 'frog'), |
+ 'frogsh': dart_factory.DartFactory('dart', 'frogsh'), |
+} |
+ |
+for v in variants: |
+ platform = v['platform'] |
+ base = factory_base[platform] |
+ if platform in ['dart_client', 'dart-editor']: |
+ v['factory_builder'] = base.DartAnnotatedFactory( |
+ python_script='dart/client/tools/buildbot_annotated_steps.py', |
+ ) |
+ else: |
+ v['factory_builder'] = base.DartFactory( |
+ slave_type='BuilderTester', |
+ clobber=False, |
+ options={ |
+ 'mode': v['mode'], |
+ 'arch': v['arch'], |
+ 'name': v['name'], |
+ }, |
+ ) |
+ |
+ |
+factories = [] |
+ |
+ |
+primary_builders = [] |
+for f in factories: |
+ primary_builders.append(f[0]) |
+ |
+s_dartium = Scheduler( |
+ name='dartium', |
+ branch='branches/bleeding_edge', |
+ treeStableTimer=0, |
+ builderNames=primary_builders) |
+c['schedulers'].append(s_dartium) |
+ |
+# ---------------------------------------------------------------------------- |
+# BUILDER DEFINITIONS |
+ |
+# The 'builders' list defines the Builders. Each one is configured with a |
+# dictionary, using the following keys: |
+# name (required): the name used to describe this builder |
+# slavename (required): which slave to use, must appear in c['slaves'] |
+# builddir (required): which subdirectory to run the builder in |
+# factory (required): a BuildFactory to define how the build is run |
+# periodicBuildTime (optional): if set, force a build every N seconds |
+# category (optional): it is not used in the normal 'buildbot' meaning. It is |
+# used by gatekeeper to determine which steps it should |
+# look for to close the tree. |
+# |
+ |
+c['builders'] = [] |
+for v in variants: |
+ c['builders'].append({ |
+ 'name': v['name'], |
+ 'builddir': v['name'], |
+ 'factory': v['factory_builder'], |
+ 'slavenames': slaves.GetSlavesName(builder=v['name']), |
+ 'category': v['category'], |
+ 'locks': [slave_lock], |
+ }) |
+ |
+ |
+for f in factories: |
+ c['builders'].append({ |
+ 'name': f[0], |
+ 'slavenames': slaves.GetSlavesName(builder=f[0]), |
+ 'builddir': f[0], |
+ 'factory': f[2], |
+ 'category': '%s' % f[1], |
+ # Don't enable auto_reboot for people testing locally. |
+ 'auto_reboot': ActiveMaster.is_production_host, |
+ }) |
+ |
+####### BUILDSLAVES |
+ |
+# The 'slaves' list defines the set of allowable buildslaves. List all the |
+# slaves registered to a builder. Remove dupes. |
+c['slaves'] = master_utils.AutoSetupSlaves(c['builders'], |
+ config.Master.GetBotPassword()) |
+ |
+# Make sure everything works together. |
+master_utils.VerifySetup(c, slaves) |
+ |
+ |
+####### 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'] = [] |
+ |
+if WEB_STATUS: |
+ c['status'].append( |
+ master_utils.CreateWebStatus(MASTER_PORT, allowForce=True, |
+ public_html='./public_html', |
+ templates=['./templates'])) |
+ c['status'].append( |
+ master_utils.CreateWebStatus(ActiveMaster.master_port_alt, |
+ allowForce=False)) |
+ |
+if MAIL_NOTIFIER: |
+ from buildbot.status.mail import MailNotifier |
+ c['status'].append(MailNotifier(fromaddr=ActiveMaster.from_address, |
+ mode='problem', |
+ sendToInterestedUsers=True, |
+ extraRecipients=['ricow@google.com'], |
+ lookup=master_utils.FilterDomain())) |
+ |
+if TREE_GATE_KEEPER: |
+ from master import gatekeeper |
+ # This is the list of the builder categories and the corresponding critical |
+ # steps. If one critical step fails, gatekeeper will close the tree |
+ # automatically. |
+ categories_steps = { |
+ '': ['update scripts', 'update', 'clobber', 'clobber_packages'], |
+ 'closer': ['update scripts', 'update', 'compile', 'unit_tests'], |
+ 'info': [], |
+ 'inprogress': [], |
+ 'plugin': ['clobber', 'compile', |
+ 'small_tests', 'medium_tests', 'large_tests'], |
+ 'qa': ['unit_tests'], |
+ } |
+ exclusions = {} |
+ forgiving_steps = ['update scripts', 'update', 'svnkill', 'taskkill', |
+ 'archived build'] |
+ c['status'].append(gatekeeper.GateKeeper( |
+ fromaddr=ActiveMaster.from_address, |
+ categories_steps=categories_steps, |
+ exclusions=exclusions, |
+ relayhost=config.Master.smtp, |
+ subject='buildbot %(result)s in %(projectName)s on %(builder)s, ' |
+ 'revision %(revision)s', |
+ extraRecipients=ActiveMaster.tree_closing_notification_recipients, |
+ lookup='google.com', |
+ forgiving_steps=forgiving_steps)) |
+ |
+if GOOD_REVISIONS: |
+ from master import goodrevisions |
+ # This is the list of builders with their respective list of critical steps |
+ # that all need to succeed to mark a revision as successful. A single failure |
+ # in any of the steps of any of the builders will mark the revision as failed. |
+ good_revision_steps = { |
+ '': ['update', 'compile'], |
+ } |
+ c['status'].append(goodrevisions.GoodRevisions( |
+ good_revision_steps=good_revision_steps, |
+ store_revisions_url=ActiveMaster.store_revisions_url)) |
+ |
+ |
+# Keep last build logs, the default is too low. |
+c['buildHorizon'] = 1000 |
+c['logHorizon'] = 500 |
+# Must be at least 2x the number of slaves. |
+c['eventHorizon'] = 200 |
+# Must be at least 1x the number of builds listed in console. |
+c['buildCacheSize'] = 60 |
+ |
+ |
+####### DEBUGGING OPTIONS |
+ |
+# if you set 'debugPassword', then you can connect to the buildmaster with |
+# the diagnostic tool in contrib/debugclient.py . From this tool, you can |
+# manually force builds and inject changes, which may be useful for testing |
+# your buildmaster without actually commiting changes to your repository (or |
+# before you have a functioning 'sources' set up). The debug tool uses the |
+# same port number as the slaves do: 'slavePortnum'. |
+ |
+#c['debugPassword'] = 'debugpassword' |
+ |
+# if you set 'manhole', you can ssh into the buildmaster and get an |
+# interactive python shell, which may be useful for debugging buildbot |
+# internals. It is probably only useful for buildbot developers. You can also |
+# use an authorized_keys file, or plain telnet. |
+#from buildbot import manhole |
+#c['manhole'] = manhole.PasswordManhole('tcp:9999:interface=127.0.0.1', |
+# 'admin', 'password') |
+ |
+ |
+####### PROJECT IDENTITY |
+ |
+# the 'projectName' string will be used to describe the project that this |
+# buildbot is working on. For example, it is used as the title of the |
+# waterfall HTML page. The 'projectURL' string will be used to provide a link |
+# from buildbot HTML pages to your project's home page. |
+ |
+c['projectName'] = ActiveMaster.project_name |
+c['projectURL'] = config.Master.project_url |
+ |
+# the 'buildbotURL' string should point to the location where the buildbot's |
+# internal web server (usually the html.Waterfall 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://build.chromium.org/p/client.dart/' |