From 3ef2c16774d1e92e828476e3ebc408b99453e33f Mon Sep 17 00:00:00 2001 From: buildbot Date: Sat, 28 Mar 2015 19:51:48 +0000 Subject: [PATCH] Separated out schedulers for trunk, personal/* and branch/*. Corrected regex patterns which extract unittest details. Added a first tentative email notifier. Added ForceSchedulers, in order to be able to force builds. - Legacy-Id: 9350 --- buildbot/masters/datatracker/master.cfg | 89 +++++++++++++++++++++---- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/buildbot/masters/datatracker/master.cfg b/buildbot/masters/datatracker/master.cfg index c8a2f0b43..59c158325 100644 --- a/buildbot/masters/datatracker/master.cfg +++ b/buildbot/masters/datatracker/master.cfg @@ -51,13 +51,45 @@ c['change_source'] = [ # case, just kick off a 'runtests' build from buildbot.schedulers.basic import SingleBranchScheduler, AnyBranchScheduler +from buildbot.schedulers.forcesched import ForceScheduler from buildbot.changes import filter c['schedulers'] = [ - AnyBranchScheduler(name="pyflakes", treeStableTimer=10, builderNames=["Check PyFlakes"]), - AnyBranchScheduler(name="lin_test", treeStableTimer=60*5, builderNames=["Test Suite"]), - AnyBranchScheduler(name="osx_test", treeStableTimer=60*5, builderNames=["Test Suite (OS X)"]), - SingleBranchScheduler(name="crawler", treeStableTimer=60*60*4, builderNames=["Test-Crawler"], + # Branch schedulers + SingleBranchScheduler(name="pyflakes", treeStableTimer=10, builderNames=["Check PyFlakes"], change_filter=filter.ChangeFilter(branch='trunk')), + SingleBranchScheduler(name="lin_test", treeStableTimer=60*5, builderNames=["Test Suite"], + change_filter=filter.ChangeFilter(branch='trunk')), + SingleBranchScheduler(name="osx_test", treeStableTimer=60*5, builderNames=["Test Suite (OS X)"], + change_filter=filter.ChangeFilter(branch='trunk')), + SingleBranchScheduler(name="crawler", treeStableTimer=60*60*4, builderNames=["Test-Crawler"], + change_filter=filter.ChangeFilter(branch='trunk')), + # + AnyBranchScheduler(name="pyflakes_branch", treeStableTimer=10, builderNames=["[branch] Check PyFlakes"], + change_filter=filter.ChangeFilter(branch_re='branch/.*')), + AnyBranchScheduler(name="lin_test_branch", treeStableTimer=60*5, builderNames=["[branch] Test Suite"], + change_filter=filter.ChangeFilter(branch_re='branch/.*')), + AnyBranchScheduler(name="osx_test_branch", treeStableTimer=60*5, builderNames=["[branch] Test Suite (OS X)"], + change_filter=filter.ChangeFilter(branch_re='branch/.*')), + # + AnyBranchScheduler(name="pyflakes_personal",treeStableTimer=10, builderNames=["[personal] Check PyFlakes"], + change_filter=filter.ChangeFilter(branch_re='personal/.*')), + AnyBranchScheduler(name="lin_test_personal",treeStableTimer=60*5, builderNames=["[personal] Test Suite"], + change_filter=filter.ChangeFilter(branch_re='personal/.*')), + AnyBranchScheduler(name="osx_test_personal",treeStableTimer=60*5, builderNames=["[personal] Test Suite (OS X)"], + change_filter=filter.ChangeFilter(branch_re='personal/.*')), + # Force schedulers + ForceScheduler(name="Force PyFlakes", builderNames=["Check PyFlakes"]), + ForceScheduler(name="Force Test Suite", builderNames=["Test Suite"]), + ForceScheduler(name="Force Test Suite (OS X)", builderNames=["Test Suite (OS X)"]), + ForceScheduler(name="Force Test-Crawler", builderNames=["Test-Crawler"]), + # + ForceScheduler(name="Force [branch] PyFlakes", builderNames=["[branch] Check PyFlakes"]), + ForceScheduler(name="Force [branch] Test Suite", builderNames=["[branch] Test Suite"]), + ForceScheduler(name="Force [branch] Test Suite (OS X)", builderNames=["[branch] Test Suite (OS X)"]), + # + ForceScheduler(name="Force [personal] PyFlakes", builderNames=["[personal] Check PyFlakes"]), + ForceScheduler(name="Force [personal] Test Suite", builderNames=["[personal] Test Suite"]), + ForceScheduler(name="Force [personal] Test Suite (OS X)", builderNames=["[personal] Test Suite (OS X)"]), ] ####### BUILDERS @@ -96,9 +128,9 @@ class UnitTest(WarningCountingShellCommand): regexPatterns = { "tests": "Ran (\d+) tests in [0-9.]+s", "time": "Ran \d+ tests in ([0-9.]+)s", - "skipped": "(?:OK|FAILED).*\skipped=(\d+)", - "failed": "FAILED.*failures\=(\d+)", - "errors": "FAILED.*errors\=(\d+)", + "skipped": "(?:OK|FAILED).*skipped=(\d+)", + "failed": "FAILED.*failures=(\d+)", + "errors": "FAILED.*errors=(\d+)", "template_coverage":" +Template coverage: +([0-9.]+%)", "url_coverage": " +Url coverage: +([0-9.]+%)", "code_coverage": " +Code coverage: +([0-9.]+%)", @@ -147,6 +179,9 @@ class UnitTest(WarningCountingShellCommand): if name in self.step_status.statistics: value = self.step_status.getStatistic(name) displayName = name.replace('_', ' ') + # special case. Mph. + if displayName == 'template coverage': + displayName = 'templ. coverage' if type(value) is float: # this is run-time description.append('%s: %.2fs' % (displayName, value)) elif type(value) is int: @@ -189,7 +224,11 @@ factory.addStep(ShellCommand( "propset", "--revprop", "-r", Property('got_revision'), "test:pyflakes", "passed" ], )) -c['builders'].append(BuilderConfig(name="Check PyFlakes", factory=factory, +c['builders'].append(BuilderConfig(name="Check PyFlakes", factory=factory, category="1. trunk", + slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) +c['builders'].append(BuilderConfig(name="[branch] Check PyFlakes", factory=factory, category="2. branch", + slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) +c['builders'].append(BuilderConfig(name="[personal] Check PyFlakes", factory=factory, category="3. personal", slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) # --- Run tests --- @@ -222,7 +261,11 @@ factory.addStep(ShellCommand( "propset", "--revprop", "-r", Property('got_revision'), "test:unittest", "passed" ], )) -c['builders'].append(BuilderConfig(name="Test Suite", factory=factory, +c['builders'].append(BuilderConfig(name="Test Suite", factory=factory, category="1. trunk", + slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) +c['builders'].append(BuilderConfig(name="[branch] Test Suite", factory=factory, category="2. branch", + slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) +c['builders'].append(BuilderConfig(name="[personal] Test Suite", factory=factory, category="3. personal", slavenames=["datatracker_lin_py27_1", "datatracker_lin_py27_2", "datatracker_lin_py27_3"])) @@ -246,10 +289,14 @@ factory.addStep(ShellCommand( factory.addStep(UnitTest( workdir=Interpolate('build/%(src::branch)s'), haltOnFailure=True, - command=["ietf/manage.py", "test", "--settings=settings_sqlitetest"], + command=["ietf/manage.py", "test", "--settings=settings_sqlitetest", "--skip-coverage"], )) -c['builders'].append(BuilderConfig(name="Test Suite (OS X)", factory=factory, +c['builders'].append(BuilderConfig(name="Test Suite (OS X)", factory=factory, category="1. trunk", + slavenames=["datatracker_osx_py27_4"])) +c['builders'].append(BuilderConfig(name="[branch] Test Suite (OS X)", factory=factory, category="2. branch", + slavenames=["datatracker_osx_py27_4"])) +c['builders'].append(BuilderConfig(name="[personal] Test Suite (OS X)", factory=factory, category="3. personal", slavenames=["datatracker_osx_py27_4"])) @@ -283,7 +330,7 @@ factory.addStep(ShellCommand( "propset", "--revprop", "-r", Property('got_revision'), "test:crawler", "passed" ], )) -c['builders'].append(BuilderConfig(name="Test-Crawler", factory=factory, +c['builders'].append(BuilderConfig(name="Test-Crawler", factory=factory, category="1. trunk", slavenames=["datatracker_lin_py27_1", ])) @@ -295,7 +342,7 @@ c['builders'].append(BuilderConfig(name="Test-Crawler", factory=factory, c['status'] = [] -from buildbot.status import html +from buildbot.status import html, mail from buildbot.status.web import authz, auth authz_cfg=authz.Authz( @@ -323,6 +370,22 @@ trac_template_loaders = [jinja2.FileSystemLoader(os.path.join(os.getcwd(), 'trac c['status'].append(html.WebStatus(http_port=8011, jinja_loaders=trac_template_loaders, authz=authz_cfg)) +# Email notifications +from zope.interface import implements +from buildbot import interfaces + +class UsernameIsEmailAddress(): + "This IEmailLookup provider assumes that the svn username is a valid email address." + implements(interfaces.IEmailLookup) + def getAddress(self, name): + return name + +c['status'].append(mail.MailNotifier( + builders = ['Check Pyflakes', 'Test Suite', 'Test-Crawler', ], + fromaddr='buildbot@tools.ietf.org', + extraRecipients=['henrik@levkowetz.com',], + lookup=UsernameIsEmailAddress(), + )) ####### PROJECT IDENTITY