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.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.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.EnableTests(linux_physical_machine_tests)

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)
################################################################################