A new buildbot plugin, with better reporting from the URL tests
- Legacy-Id: 292
This commit is contained in:
parent
b6c7aed469
commit
c89000f253
80
test/buildbot/master/ietfdb/buildbot_plugins.py
Normal file
80
test/buildbot/master/ietfdb/buildbot_plugins.py
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
import re
|
||||||
|
from buildbot.steps.shell import ShellCommand
|
||||||
|
from buildbot.status.builder import SUCCESS, FAILURE, WARNINGS
|
||||||
|
|
||||||
|
try:
|
||||||
|
import cStringIO
|
||||||
|
StringIO = cStringIO.StringIO
|
||||||
|
except ImportError:
|
||||||
|
from StringIO import StringIO
|
||||||
|
|
||||||
|
class DjangoTest(ShellCommand):
|
||||||
|
name = "django test"
|
||||||
|
command = ["python", "manage.py", "test"]
|
||||||
|
description = ["running django test"]
|
||||||
|
descriptionDone = ["django test"]
|
||||||
|
flunkOnFailure = False
|
||||||
|
flunkingIssues = ["exception", "failure"] # any pyflakes lines like this cause FAILURE
|
||||||
|
|
||||||
|
msgtypes = ("exception", "failure", "skipped", "diffs", "ok")
|
||||||
|
|
||||||
|
def createSummary(self, log):
|
||||||
|
summaries = {}
|
||||||
|
typelist = {}
|
||||||
|
counts = {}
|
||||||
|
def count(m):
|
||||||
|
if not m in counts:
|
||||||
|
counts[m] = 0
|
||||||
|
counts[m] += 1
|
||||||
|
|
||||||
|
for type in self.msgtypes:
|
||||||
|
typelist[type] = set([])
|
||||||
|
|
||||||
|
first = True
|
||||||
|
for line in StringIO(log.getText()).readlines():
|
||||||
|
if re.search("^Traceback: ", line):
|
||||||
|
m = "exception"
|
||||||
|
typelist["exceptions"].add(m)
|
||||||
|
count(m)
|
||||||
|
if re.search("^Fail \d+ ", line):
|
||||||
|
m = "fail_%s" % line.split()[1]
|
||||||
|
typelist["failure"].add(m)
|
||||||
|
count(m)
|
||||||
|
if re.search("^Skipping ", line):
|
||||||
|
m = "skipped"
|
||||||
|
typelist["skipped"].add(m)
|
||||||
|
count(m)
|
||||||
|
if re.search("^Diff: .* ", line):
|
||||||
|
m = "diff_%s" % line.skip()[1]
|
||||||
|
typelist["diffs"].add(m)
|
||||||
|
count(m)
|
||||||
|
if re.search("^OK (\d+) ", line):
|
||||||
|
m = "pass_%s" % line.split()[1]
|
||||||
|
typelist["pass"].add(m)
|
||||||
|
count(m)
|
||||||
|
if re.search("^Pass (\d+) ", line):
|
||||||
|
m = "pass_%s" % line.split()[1]
|
||||||
|
typelist["pass"].add(m)
|
||||||
|
count(m)
|
||||||
|
if not m in summaries:
|
||||||
|
summaries[m] = []
|
||||||
|
summaries[m].append(line)
|
||||||
|
|
||||||
|
self.descriptionDone = self.descriptionDone[:]
|
||||||
|
for type in self.msgtypes:
|
||||||
|
for msg in typelist[type]:
|
||||||
|
if counts[msg]:
|
||||||
|
self.descriptionDone.append("%s=%d" % (msg, counts[msg]))
|
||||||
|
self.addCompleteLog(msg, "".join(summaries[msg]))
|
||||||
|
self.setProperty("urltest-%s" % type, sum([counts[msg] for msg in typelist[type]]))
|
||||||
|
self.setProperty("urltest-total", sum(counts.values()))
|
||||||
|
|
||||||
|
def evaluateCommand(self, cmd):
|
||||||
|
if cmd.rc != 0:
|
||||||
|
return FAILURE
|
||||||
|
for type in self.flunkingIssues:
|
||||||
|
if self.getProperty("urltest-%s" % type):
|
||||||
|
return FAILURE
|
||||||
|
if self.getProperty("urltest-total"):
|
||||||
|
return WARNINGS
|
||||||
|
return SUCCESS
|
|
@ -94,11 +94,12 @@ from buildbot.steps.source import SVN
|
||||||
from buildbot.steps.dummy import Dummy
|
from buildbot.steps.dummy import Dummy
|
||||||
from buildbot.steps.python import PyFlakes
|
from buildbot.steps.python import PyFlakes
|
||||||
from buildbot.steps.shell import ShellCommand, Test
|
from buildbot.steps.shell import ShellCommand, Test
|
||||||
|
from buildbot_plugins import UrlTest
|
||||||
|
|
||||||
f1 = factory.BuildFactory()
|
f1 = factory.BuildFactory()
|
||||||
f1.addStep(SVN, svnurl="http://svn.tools.ietf.org/svn/tools/ietfdb/trunk/", username="buildbot@tools.ietf.org", password="U64#GUxr")
|
f1.addStep(SVN, svnurl="http://svn.tools.ietf.org/svn/tools/ietfdb/trunk/", username="buildbot@tools.ietf.org", password="U64#GUxr")
|
||||||
f1.addStep(ShellCommand, name="test-setup", command=["test/test-setup"])
|
f1.addStep(ShellCommand, name="test-setup", command=["test/test-setup"])
|
||||||
f1.addStep(PyFlakes, command=["pyflakes", "ietf"], warnOnFailure=True)
|
f1.addStep(PyFlakes, command=["test/run-pyflakes", "ietf"], warnOnFailure=True)
|
||||||
f1.addStep(Test, name="django-tests", command=["python", "ietf/manage.py", "test"], env={'PYTHONPATH': ["test/lib",]} )
|
f1.addStep(Test, name="django-tests", command=["python", "ietf/manage.py", "test"], env={'PYTHONPATH': ["test/lib",]} )
|
||||||
f1.addStep(ShellCommand, name="test-teardown", command=["test/test-teardown"])
|
f1.addStep(ShellCommand, name="test-teardown", command=["test/test-teardown"])
|
||||||
|
|
||||||
|
@ -121,18 +122,15 @@ c['status'] = []
|
||||||
#from buildbot.status import html
|
#from buildbot.status import html
|
||||||
#c['status'].append(html.Waterfall(http_port=8010))
|
#c['status'].append(html.Waterfall(http_port=8010))
|
||||||
|
|
||||||
import trac_buildbot_html as trac_html
|
import buildbottrac.html
|
||||||
c['status'].append(trac_html.Waterfall(http_port=8010))
|
c['status'].append(buildbottrac.html.Waterfall(http_port=8010))
|
||||||
|
|
||||||
import trac_buildbot_html_dev as trac_html_dev
|
from buildbot.status import mail
|
||||||
c['status'].append(trac_html_dev.Waterfall(http_port=8011))
|
c['status'].append(mail.MailNotifier(fromaddr="buildbot@tools.ietf.org",
|
||||||
|
extraRecipients=["django-project@ietf.org"],
|
||||||
# from buildbot.status import mail
|
mode="problem",
|
||||||
# c['status'].append(mail.MailNotifier(fromaddr="buildbot@tools.ietf.org",
|
# mode="failing",
|
||||||
# extraRecipients=["django-project@ietf.org"],
|
sendToInterestedUsers=True))
|
||||||
# mode="problem",
|
|
||||||
# mode="failing",
|
|
||||||
# sendToInterestedUsers=True))
|
|
||||||
|
|
||||||
# from buildbot.status import words
|
# from buildbot.status import words
|
||||||
# c['status'].append(words.IRC(host="irc.example.com", nick="bb",
|
# c['status'].append(words.IRC(host="irc.example.com", nick="bb",
|
||||||
|
|
Loading…
Reference in a new issue