@@ -51,13 +51,45 @@ c['change_source'] = [
5151# case, just kick off a 'runtests' build
5252
5353from buildbot .schedulers .basic import SingleBranchScheduler , AnyBranchScheduler
54+ from buildbot .schedulers .forcesched import ForceScheduler
5455from buildbot .changes import filter
5556c ['schedulers' ] = [
56- AnyBranchScheduler (name = "pyflakes" , treeStableTimer = 10 , builderNames = ["Check PyFlakes" ]),
57- AnyBranchScheduler (name = "lin_test" , treeStableTimer = 60 * 5 , builderNames = ["Test Suite" ]),
58- AnyBranchScheduler (name = "osx_test" , treeStableTimer = 60 * 5 , builderNames = ["Test Suite (OS X)" ]),
59- SingleBranchScheduler (name = "crawler" , treeStableTimer = 60 * 60 * 4 , builderNames = ["Test-Crawler" ],
57+ # Branch schedulers
58+ SingleBranchScheduler (name = "pyflakes" , treeStableTimer = 10 , builderNames = ["Check PyFlakes" ],
6059 change_filter = filter .ChangeFilter (branch = 'trunk' )),
60+ SingleBranchScheduler (name = "lin_test" , treeStableTimer = 60 * 5 , builderNames = ["Test Suite" ],
61+ change_filter = filter .ChangeFilter (branch = 'trunk' )),
62+ SingleBranchScheduler (name = "osx_test" , treeStableTimer = 60 * 5 , builderNames = ["Test Suite (OS X)" ],
63+ change_filter = filter .ChangeFilter (branch = 'trunk' )),
64+ SingleBranchScheduler (name = "crawler" , treeStableTimer = 60 * 60 * 4 , builderNames = ["Test-Crawler" ],
65+ change_filter = filter .ChangeFilter (branch = 'trunk' )),
66+ #
67+ AnyBranchScheduler (name = "pyflakes_branch" , treeStableTimer = 10 , builderNames = ["[branch] Check PyFlakes" ],
68+ change_filter = filter .ChangeFilter (branch_re = 'branch/.*' )),
69+ AnyBranchScheduler (name = "lin_test_branch" , treeStableTimer = 60 * 5 , builderNames = ["[branch] Test Suite" ],
70+ change_filter = filter .ChangeFilter (branch_re = 'branch/.*' )),
71+ AnyBranchScheduler (name = "osx_test_branch" , treeStableTimer = 60 * 5 , builderNames = ["[branch] Test Suite (OS X)" ],
72+ change_filter = filter .ChangeFilter (branch_re = 'branch/.*' )),
73+ #
74+ AnyBranchScheduler (name = "pyflakes_personal" ,treeStableTimer = 10 , builderNames = ["[personal] Check PyFlakes" ],
75+ change_filter = filter .ChangeFilter (branch_re = 'personal/.*' )),
76+ AnyBranchScheduler (name = "lin_test_personal" ,treeStableTimer = 60 * 5 , builderNames = ["[personal] Test Suite" ],
77+ change_filter = filter .ChangeFilter (branch_re = 'personal/.*' )),
78+ AnyBranchScheduler (name = "osx_test_personal" ,treeStableTimer = 60 * 5 , builderNames = ["[personal] Test Suite (OS X)" ],
79+ change_filter = filter .ChangeFilter (branch_re = 'personal/.*' )),
80+ # Force schedulers
81+ ForceScheduler (name = "Force PyFlakes" , builderNames = ["Check PyFlakes" ]),
82+ ForceScheduler (name = "Force Test Suite" , builderNames = ["Test Suite" ]),
83+ ForceScheduler (name = "Force Test Suite (OS X)" , builderNames = ["Test Suite (OS X)" ]),
84+ ForceScheduler (name = "Force Test-Crawler" , builderNames = ["Test-Crawler" ]),
85+ #
86+ ForceScheduler (name = "Force [branch] PyFlakes" , builderNames = ["[branch] Check PyFlakes" ]),
87+ ForceScheduler (name = "Force [branch] Test Suite" , builderNames = ["[branch] Test Suite" ]),
88+ ForceScheduler (name = "Force [branch] Test Suite (OS X)" , builderNames = ["[branch] Test Suite (OS X)" ]),
89+ #
90+ ForceScheduler (name = "Force [personal] PyFlakes" , builderNames = ["[personal] Check PyFlakes" ]),
91+ ForceScheduler (name = "Force [personal] Test Suite" , builderNames = ["[personal] Test Suite" ]),
92+ ForceScheduler (name = "Force [personal] Test Suite (OS X)" , builderNames = ["[personal] Test Suite (OS X)" ]),
6193]
6294
6395####### BUILDERS
@@ -96,9 +128,9 @@ class UnitTest(WarningCountingShellCommand):
96128 regexPatterns = {
97129 "tests" : "Ran (\d+) tests in [0-9.]+s" ,
98130 "time" : "Ran \d+ tests in ([0-9.]+)s" ,
99- "skipped" : "(?:OK|FAILED).*\ skipped=(\d+)" ,
100- "failed" : "FAILED.*failures\ =(\d+)" ,
101- "errors" : "FAILED.*errors\ =(\d+)" ,
131+ "skipped" : "(?:OK|FAILED).*skipped=(\d+)" ,
132+ "failed" : "FAILED.*failures=(\d+)" ,
133+ "errors" : "FAILED.*errors=(\d+)" ,
102134 "template_coverage" :" +Template coverage: +([0-9.]+%)" ,
103135 "url_coverage" : " +Url coverage: +([0-9.]+%)" ,
104136 "code_coverage" : " +Code coverage: +([0-9.]+%)" ,
@@ -147,6 +179,9 @@ class UnitTest(WarningCountingShellCommand):
147179 if name in self .step_status .statistics :
148180 value = self .step_status .getStatistic (name )
149181 displayName = name .replace ('_' , ' ' )
182+ # special case. Mph.
183+ if displayName == 'template coverage' :
184+ displayName = 'templ. coverage'
150185 if type (value ) is float : # this is run-time
151186 description .append ('%s: %.2fs' % (displayName , value ))
152187 elif type (value ) is int :
@@ -189,7 +224,11 @@ factory.addStep(ShellCommand(
189224 "propset" , "--revprop" , "-r" , Property ('got_revision' ), "test:pyflakes" , "passed" ],
190225 ))
191226
192- c ['builders' ].append (BuilderConfig (name = "Check PyFlakes" , factory = factory ,
227+ c ['builders' ].append (BuilderConfig (name = "Check PyFlakes" , factory = factory , category = "1. trunk" ,
228+ slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
229+ c ['builders' ].append (BuilderConfig (name = "[branch] Check PyFlakes" , factory = factory , category = "2. branch" ,
230+ slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
231+ c ['builders' ].append (BuilderConfig (name = "[personal] Check PyFlakes" , factory = factory , category = "3. personal" ,
193232 slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
194233
195234# --- Run tests ---
@@ -222,7 +261,11 @@ factory.addStep(ShellCommand(
222261 "propset" , "--revprop" , "-r" , Property ('got_revision' ), "test:unittest" , "passed" ],
223262 ))
224263
225- c ['builders' ].append (BuilderConfig (name = "Test Suite" , factory = factory ,
264+ c ['builders' ].append (BuilderConfig (name = "Test Suite" , factory = factory , category = "1. trunk" ,
265+ slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
266+ c ['builders' ].append (BuilderConfig (name = "[branch] Test Suite" , factory = factory , category = "2. branch" ,
267+ slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
268+ c ['builders' ].append (BuilderConfig (name = "[personal] Test Suite" , factory = factory , category = "3. personal" ,
226269 slavenames = ["datatracker_lin_py27_1" , "datatracker_lin_py27_2" , "datatracker_lin_py27_3" ]))
227270
228271
@@ -246,10 +289,14 @@ factory.addStep(ShellCommand(
246289factory .addStep (UnitTest (
247290 workdir = Interpolate ('build/%(src::branch)s' ),
248291 haltOnFailure = True ,
249- command = ["ietf/manage.py" , "test" , "--settings=settings_sqlitetest" ],
292+ command = ["ietf/manage.py" , "test" , "--settings=settings_sqlitetest" , "--skip-coverage" ],
250293 ))
251294
252- c ['builders' ].append (BuilderConfig (name = "Test Suite (OS X)" , factory = factory ,
295+ c ['builders' ].append (BuilderConfig (name = "Test Suite (OS X)" , factory = factory , category = "1. trunk" ,
296+ slavenames = ["datatracker_osx_py27_4" ]))
297+ c ['builders' ].append (BuilderConfig (name = "[branch] Test Suite (OS X)" , factory = factory , category = "2. branch" ,
298+ slavenames = ["datatracker_osx_py27_4" ]))
299+ c ['builders' ].append (BuilderConfig (name = "[personal] Test Suite (OS X)" , factory = factory , category = "3. personal" ,
253300 slavenames = ["datatracker_osx_py27_4" ]))
254301
255302
@@ -283,7 +330,7 @@ factory.addStep(ShellCommand(
283330 "propset" , "--revprop" , "-r" , Property ('got_revision' ), "test:crawler" , "passed" ],
284331 ))
285332
286- c ['builders' ].append (BuilderConfig (name = "Test-Crawler" , factory = factory ,
333+ c ['builders' ].append (BuilderConfig (name = "Test-Crawler" , factory = factory , category = "1. trunk" ,
287334 slavenames = ["datatracker_lin_py27_1" , ]))
288335
289336
@@ -295,7 +342,7 @@ c['builders'].append(BuilderConfig(name="Test-Crawler", factory=factory,
295342
296343c ['status' ] = []
297344
298- from buildbot .status import html
345+ from buildbot .status import html , mail
299346from buildbot .status .web import authz , auth
300347
301348authz_cfg = authz .Authz (
@@ -323,6 +370,22 @@ trac_template_loaders = [jinja2.FileSystemLoader(os.path.join(os.getcwd(), 'trac
323370c ['status' ].append (html .WebStatus (http_port = 8011 , jinja_loaders = trac_template_loaders ,
324371 authz = authz_cfg ))
325372
373+ # Email notifications
374+ from zope .interface import implements
375+ from buildbot import interfaces
376+
377+ class UsernameIsEmailAddress ():
378+ "This IEmailLookup provider assumes that the svn username is a valid email address."
379+ implements (interfaces .IEmailLookup )
380+ def getAddress (self , name ):
381+ return name
382+
383+ c ['status' ].append (mail .MailNotifier (
384+ builders = ['Check Pyflakes' , 'Test Suite' , 'Test-Crawler' , ],
385+ fromaddr = 'buildbot@tools.ietf.org' ,
386+ extraRecipients = ['henrik@levkowetz.com' ,],
387+ lookup = UsernameIsEmailAddress (),
388+ ))
326389
327390####### PROJECT IDENTITY
328391
0 commit comments