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

@ -0,0 +1,13 @@
#!/bin/sh
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
#
# This script removes all .gcda files from third_party in order to work around
# a bug in LCOV (this should also increase the bot speed).
find . -name "*.gcda" -path "*/third_party/*" | xargs rm -f

View File

@ -0,0 +1,18 @@
#!/bin/sh
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
#
# Generates a LCOV error report and makes the results readable to all.
genhtml $1 --output-directory $2
if [ "$?" -ne "0" ]; then
exit 1
fi
chmod -R 777 $2

View File

@ -186,11 +186,15 @@ linux_factory_64_release = utils.WebRTCLinuxFactory()
linux_factory_64_release.EnableBuild(release=True) linux_factory_64_release.EnableBuild(release=True)
linux_factory_64_release.EnableTests(linux_normal_tests) linux_factory_64_release.EnableTests(linux_normal_tests)
linux_factory_32_dbg = utils.WebRTCLinuxFactory(enable_coverage=True) linux_factory_32_dbg = utils.WebRTCLinuxFactory(
enable_coverage=True,
coverage_url="http://webrtc-cb-linux-slave-4.cbf.corp.google.com/")
linux_factory_32_dbg.EnableBuild(build32=True) linux_factory_32_dbg.EnableBuild(build32=True)
linux_factory_32_dbg.EnableTests(linux_normal_tests) linux_factory_32_dbg.EnableTests(linux_normal_tests)
linux_factory_video = utils.WebRTCLinuxFactory(enable_coverage=True) linux_factory_video = utils.WebRTCLinuxFactory(
enable_coverage=True,
coverage_url="http://webrtc-build-bot-se.lul/")
linux_factory_video.EnableBuild() linux_factory_video.EnableBuild()
linux_factory_video.EnableTests(linux_physical_machine_tests) linux_factory_video.EnableTests(linux_physical_machine_tests)

View File

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