Optimized coverage computations and fixed coverage on the integration bot.

The coverage report will no longer get written to NFS but rather to the bot's own web server. This speeds up the  computation from 25 minutes to 8 seconds.

BUG=
TEST=

Review URL: https://webrtc-codereview.appspot.com/392007

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1676 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
phoglund@webrtc.org
2012-02-13 12:16:50 +00:00
parent c76c096c19
commit 6adfad1768
4 changed files with 78 additions and 46 deletions

View File

@@ -59,7 +59,9 @@ class WebRTCFactory(factory.BuildFactory):
"""A Build Factory affected by properties."""
def __init__(self, build_factory_properties=None, steps=None,
enable_coverage=False, enable_valgrind=False, account=None):
enable_coverage=False, enable_valgrind=False,
account='webrtc-cb', coverage_url=None,
coverage_dir="/var/www"):
factory.BuildFactory.__init__(self, steps)
self.properties = properties.Properties()
self.enable_build = False
@@ -67,16 +69,9 @@ class WebRTCFactory(factory.BuildFactory):
self.enable_coverage = enable_coverage
self.enable_valgrind = enable_valgrind
self.gyp_params = []
self.account = account
self.coverage_dir = ""
self.coverage_url = ""
self.release = False
if self.account is None:
self.coverage_url = "http://www.corp.google.com/~webrtc-cb"
self.coverage_dir = "/home/webrtc-cb/www"
else:
self.coverage_url = "http://www.corp.google.com/~%s" % self.account
self.coverage_dir = "/home/%s/www" % self.account
self.coverage_url = coverage_url
self.coverage_dir = coverage_dir
def EnableBuild(self, force_sync):
"""Build the binary [must be overridden]."""
@@ -98,8 +93,8 @@ class WebRTCFactory(factory.BuildFactory):
warn = warnOnFailure
flunkOnFailure = not warn
self.addStep(shell.ShellCommand(command=cmd, workdir=workdir,
description=descriptor+["running..."],
descriptionDone=descriptor+["done..."],
description=descriptor + ["running..."],
descriptionDone=descriptor + ["done..."],
warnOnFailure=warn,
flunkOnFailure=flunkOnFailure,
name="".join(descriptor)))
@@ -151,35 +146,25 @@ class WebRTCFactory(factory.BuildFactory):
class GenerateCodeCoverage(ShellCommand):
command = ["genhtml", "final.info", "--output-directory",
WithProperties("/home/webrtc-cb/www/%(buildername)s_%(buildnumber)s")]
name = "LCOV_GenHTML"
warnOnFailure = True
def __init__(self, coverage_url=None, coverage_dir=None, **kwargs):
if coverage_url is None or coverage_dir is None:
raise TypeError("coverage location required")
print coverage_url, coverage_dir
ShellCommand.__init__(self, **kwargs)
self.addFactoryArguments(coverage_url=coverage_url,
coverage_dir=coverage_dir)
self.setDefaultWorkdir("build/trunk")
self.coverage_url = coverage_url
self.coverage_dir = coverage_dir
self.setCommand(["genhtml", "final.info", "--output-directory",
self.description = "Coverage Report"
self.setCommand(["./tools/continuous_build/generate_coverage_html.sh",
"final.info",
WithProperties(coverage_dir + "/%(buildername)s_%(buildnumber)s")])
def createSummary(self, log):
coverage_url = "%s/%s_%s" % (self.coverage_url,
self.getProperty("buildername"), self.getProperty("buildnumber"))
coverage_dir = "%s/%s_%s" % (self.coverage_dir,
self.getProperty("buildername"), self.getProperty("buildnumber"))
os.chmod(coverage_dir,0777)
for root, dirs, files in os.walk(coverage_dir):
for d in dirs:
os.chmod(os.path.join(root, d), 0777)
for f in files:
os.chmod(os.path.join(root, f), 0777)
self.addURL("coverage", coverage_url)
def start(self):
@@ -205,7 +190,7 @@ class WebRTCAndroidFactory(WebRTCFactory):
cmd = " ; ".join(cleanup_list)
self.addStep(shell.Compile(command=(cmd), workdir="build/trunk",
description=["cleanup", "running..."], haltOnFailure=False,
warnOnFailure=True, flunkOnFailure =False,
warnOnFailure=True, flunkOnFailure=False,
descriptionDone=["cleanup", "done..."], name="cleanup"))
cmd = "svn checkout %s external/webrtc" % SVN_LOCATION
self.addStep(shell.Compile(command=(cmd),
@@ -241,8 +226,8 @@ class WebRTCChromeFactory(WebRTCFactory):
if make_extra is not None:
cmd.append(make_extra)
self.addStep(shell.ShellCommand(command=cmd,
workdir="build/src", description=["Making"]+make_descriptor,
descriptionDone=make_descriptor+["built"],
workdir="build/src", description=["Making"] + make_descriptor,
descriptionDone=make_descriptor + ["built"],
name="_".join(make_descriptor)))
################################################################################
@@ -250,9 +235,11 @@ class WebRTCLinuxFactory(WebRTCFactory):
"""A Build Factory affected by properties."""
def __init__(self, build_factory_properties=None, steps=None,
enable_coverage=False, enable_valgrind=False, account=None):
enable_coverage=False, enable_valgrind=False, account=None,
coverage_url=None, coverage_dir=None):
WebRTCFactory.__init__(self, build_factory_properties, steps,
enable_coverage, enable_valgrind, account)
enable_coverage, enable_valgrind, account,
coverage_url, coverage_dir)
def EnableBuild(self, force_sync=False, release=False, build32=False,
chrome_os=False, clang=False):
@@ -263,7 +250,9 @@ class WebRTCLinuxFactory(WebRTCFactory):
self.force_sync = force_sync
"""Linux specific Build"""
self.release = release
self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup")
# Valgrind bots need special GYP defines to enable memory profiling
# friendly compilation. They already has a custom .gclient
# configuration file created so they don't need one being
@@ -307,8 +296,8 @@ class WebRTCLinuxFactory(WebRTCFactory):
if self.enable_valgrind:
cmd = VALGRIND_CMD + cmd
self.addStep(shell.ShellCommand(command=cmd,
workdir=workdir, description=["Running"]+test_descriptor,
descriptionDone=test_descriptor+["finished"],
workdir=workdir, description=["Running"] + test_descriptor,
descriptionDone=test_descriptor + ["finished"],
name="_".join(test_descriptor)))
def AddCommonMakeStep(self, make, descriptor="", make_extra=None):
@@ -318,8 +307,8 @@ class WebRTCLinuxFactory(WebRTCFactory):
if make_extra is not None:
cmd.append(make_extra)
self.addStep(shell.ShellCommand(command=cmd,
workdir="build/trunk", description=["Making"]+make_descriptor,
descriptionDone=make_descriptor+["built"],
workdir="build/trunk", description=["Making"] + make_descriptor,
descriptionDone=make_descriptor + ["built"],
name="_".join(make_descriptor)))
def EnableBaseCoverage(self):
@@ -348,6 +337,14 @@ class WebRTCLinuxFactory(WebRTCFactory):
def EnableCoverage(self):
"""Enable coverage data."""
# Delete all third-party .gcda files to save time and work around a bug
# in lcov which tends to hang when capturing on libjpgturbo.
self.AddCommonStep(["./tools/continuous_build/clean_third_party_gcda.sh"],
warnOnFailure=True,
workdir="build/trunk", descriptor=["LCOV",
"Delete 3rd party"])
self.AddCommonStep(["lcov", "--directory", ".", "--capture", "-b",
".", "--output-file", "webrtc.info"],
warnOnFailure=True,
@@ -355,7 +352,7 @@ class WebRTCLinuxFactory(WebRTCFactory):
self.AddCommonStep(['lcov', '--extract', 'webrtc.info', '*/src/*',
'--output', 'test.info'], warnOnFailure=True,
workdir="build/trunk", descriptor=["LCOV", "Extract"])
self.AddCommonStep(["lcov", "--remove", "test.info", "*/usr/include/*",
self.AddCommonStep(["lcov", "--remove", "test.info", "*/usr/include/*",
"/third*", "/testing/*", "*/test/*", "*_unittest.*",
"*/mock/*", "--output",
"final.info"], warnOnFailure=True,
@@ -439,11 +436,11 @@ class WebRTCMacFactory(WebRTCFactory):
if cmd is None:
if self.build_type == "xcode" or self.build_type == "both":
cmd = ["xcodebuild/%s/%s" % (test_folder, test)]
self.AddCommonStep(cmd, descriptor=test_descriptor+["(xcode)"],
self.AddCommonStep(cmd, descriptor=test_descriptor + ["(xcode)"],
workdir="build/trunk")
if self.build_type == "make" or self.build_type == "both":
cmd = ["out/%s/%s" % (test_folder, test)]
self.AddCommonStep(cmd, descriptor=test_descriptor+["(make)"],
self.AddCommonStep(cmd, descriptor=test_descriptor + ["(make)"],
workdir="build/trunk")
def AddCommonMakeStep(self, make, descriptor="", make_extra=None):
@@ -455,13 +452,13 @@ class WebRTCMacFactory(WebRTCFactory):
cmd.append(make_extra)
if self.release:
cmd.append("BUILDTYPE=Release")
self.AddCommonStep(cmd, descriptor=make_descriptor+["(make)"],
self.AddCommonStep(cmd, descriptor=make_descriptor + ["(make)"],
workdir="build/trunk")
if self.build_type == "xcode" or self.build_type == "both":
configuration = "Release" if self.release else "Debug"
cmd = ["xcodebuild", "-project", "webrtc.xcodeproj", "-configuration",
cmd = ["xcodebuild", "-project", "webrtc.xcodeproj", "-configuration",
configuration, "-target", "All"]
self.AddCommonStep(cmd, descriptor=make_descriptor+["(xcode)"],
self.AddCommonStep(cmd, descriptor=make_descriptor + ["(xcode)"],
workdir="build/trunk")
################################################################################
@@ -505,14 +502,14 @@ class WebRTCWinFactory(WebRTCFactory):
cmd = ["msbuild", "webrtc.sln", "/t:Clean",
"/p:Configuration=Debug;Platform=%s" % (self.platform)]
self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk")
cmd = ["msbuild", "webrtc.sln",
cmd = ["msbuild", "webrtc.sln",
"/p:Configuration=Debug;Platform=%s" % (self.platform)]
self.AddCommonStep(cmd, descriptor="Build_Debug", workdir="build/trunk")
if self.configuration == "Release" or self.configuration == "both":
cmd = ["msbuild", "webrtc.sln", "/t:Clean",
"/p:Configuration=Release;Platform=%s" % (self.platform)]
self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk")
cmd = ["msbuild", "webrtc.sln",
cmd = ["msbuild", "webrtc.sln",
"/p:Configuration=Release;Platform=%s" % (self.platform)]
self.AddCommonStep(cmd, descriptor="Build_Release", workdir="build/trunk")
@@ -522,11 +519,11 @@ class WebRTCWinFactory(WebRTCFactory):
if cmd is None:
if self.configuration == "Debug" or self.configuration == "both":
cmd = ["build\Debug\%s.exe" % test]
self.AddCommonStep(cmd, descriptor=test_descriptor+["Debug"],
self.AddCommonStep(cmd, descriptor=test_descriptor + ["Debug"],
workdir=workdir)
if self.configuration == "Release" or self.configuration == "both":
cmd = ["build\Release\%s.exe" % test]
self.AddCommonStep(cmd, descriptor=test_descriptor+["Release"],
self.AddCommonStep(cmd, descriptor=test_descriptor + ["Release"],
workdir=workdir)
################################################################################