Skipping code coverage HTML generation on failed builds.
BUG=None, except that the dashboard shows confusing stats. TEST=Tested with local master and slave. Review URL: https://webrtc-codereview.appspot.com/508002 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2087 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
__author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)'
|
__author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)'
|
||||||
|
|
||||||
import buildbot
|
|
||||||
import ntpath
|
import ntpath
|
||||||
import os
|
import os
|
||||||
import posixpath
|
import posixpath
|
||||||
@@ -18,6 +17,7 @@ import urlparse
|
|||||||
from buildbot.process import factory
|
from buildbot.process import factory
|
||||||
from buildbot.process import properties
|
from buildbot.process import properties
|
||||||
from buildbot.process.properties import WithProperties
|
from buildbot.process.properties import WithProperties
|
||||||
|
from buildbot.status import builder
|
||||||
from buildbot.steps.shell import ShellCommand
|
from buildbot.steps.shell import ShellCommand
|
||||||
|
|
||||||
from master import chromium_step
|
from master import chromium_step
|
||||||
@@ -349,8 +349,7 @@ class MonitoredShellCommand(ShellCommand):
|
|||||||
self.build_status_oracle = build_status_oracle
|
self.build_status_oracle = build_status_oracle
|
||||||
|
|
||||||
def finished(self, results):
|
def finished(self, results):
|
||||||
if (results == buildbot.status.builder.FAILURE or
|
if (results == builder.FAILURE or results == builder.EXCEPTION):
|
||||||
results == buildbot.status.builder.EXCEPTION):
|
|
||||||
self.build_status_oracle.SetLastBuildAsFailed()
|
self.build_status_oracle.SetLastBuildAsFailed()
|
||||||
ShellCommand.finished(self, results)
|
ShellCommand.finished(self, results)
|
||||||
|
|
||||||
@@ -402,10 +401,12 @@ class GenerateCodeCoverage(ShellCommand):
|
|||||||
reachable from url/Foo.
|
reachable from url/Foo.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, coverage_url, coverage_dir, coverage_file, **kwargs):
|
def __init__(self, build_status_oracle, coverage_url, coverage_dir,
|
||||||
|
coverage_file, **kwargs):
|
||||||
"""Prepares the coverage command.
|
"""Prepares the coverage command.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
build_status_oracle: class that knows if the current build has failed.
|
||||||
coverage_url: The base URL for the serving web server we will use
|
coverage_url: The base URL for the serving web server we will use
|
||||||
when we generate the link to the coverage. This will generally
|
when we generate the link to the coverage. This will generally
|
||||||
be the slave's URL (something like http://slave-hostname/).
|
be the slave's URL (something like http://slave-hostname/).
|
||||||
@@ -413,30 +414,38 @@ class GenerateCodeCoverage(ShellCommand):
|
|||||||
coverage_file: The LCOV file to generate the coverage from.
|
coverage_file: The LCOV file to generate the coverage from.
|
||||||
"""
|
"""
|
||||||
ShellCommand.__init__(self, **kwargs)
|
ShellCommand.__init__(self, **kwargs)
|
||||||
self.addFactoryArguments(coverage_url=coverage_url,
|
self.addFactoryArguments(build_status_oracle=build_status_oracle,
|
||||||
|
coverage_url=coverage_url,
|
||||||
coverage_dir=coverage_dir,
|
coverage_dir=coverage_dir,
|
||||||
coverage_file=coverage_file)
|
coverage_file=coverage_file)
|
||||||
|
self.build_status_oracle = build_status_oracle
|
||||||
self.coverage_url = coverage_url
|
self.coverage_url = coverage_url
|
||||||
self.coverage_dir = coverage_dir
|
self.coverage_dir = coverage_dir
|
||||||
self.coverage_file = coverage_file
|
self.coverage_file = coverage_file
|
||||||
self.description = ['Coverage Report']
|
self.description = ['Coverage Report']
|
||||||
|
self.name = 'LCOV (Report)'
|
||||||
self.warnOnFailure = True
|
self.warnOnFailure = True
|
||||||
self.flunkOnFailure = False
|
self.flunkOnFailure = False
|
||||||
output_dir = os.path.join(coverage_dir,
|
|
||||||
'%(buildername)s_%(buildnumber)s')
|
|
||||||
generate_script = PosixPathJoin('tools', 'continuous_build',
|
|
||||||
'build_internal', 'scripts',
|
|
||||||
'generate_coverage_html.sh')
|
|
||||||
self.setCommand([generate_script, coverage_file,
|
|
||||||
WithProperties(output_dir)])
|
|
||||||
|
|
||||||
def createSummary(self, log):
|
def createSummary(self, log):
|
||||||
coverage_url = urlparse.urljoin(self.coverage_url,
|
if self.build_status_oracle.LastBuildSucceeded():
|
||||||
'%s_%s' % (self.getProperty('buildername'),
|
coverage_url = urlparse.urljoin(self.coverage_url, '%s_%s'
|
||||||
self.getProperty('buildnumber')))
|
% (self.getProperty('buildername'),
|
||||||
self.addURL('click here', coverage_url)
|
self.getProperty('buildnumber')))
|
||||||
|
self.addURL('click here', coverage_url)
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
|
if self.build_status_oracle.LastBuildSucceeded():
|
||||||
|
output_dir = os.path.join(self.coverage_dir,
|
||||||
|
'%(buildername)s_%(buildnumber)s')
|
||||||
|
generate_script = PosixPathJoin('tools', 'continuous_build',
|
||||||
|
'build_internal', 'scripts',
|
||||||
|
'generate_coverage_html.sh')
|
||||||
|
self.setCommand([generate_script, self.coverage_file,
|
||||||
|
WithProperties(output_dir)])
|
||||||
|
else:
|
||||||
|
self.description = ['Step skipped due to test failure.']
|
||||||
|
self.setCommand(['false']) # Dummy command that fails.
|
||||||
ShellCommand.start(self)
|
ShellCommand.start(self)
|
||||||
|
|
||||||
|
|
||||||
@@ -663,10 +672,12 @@ class WebRTCLinuxFactory(WebRTCFactory):
|
|||||||
descriptor='LCOV (Merge)')
|
descriptor='LCOV (Merge)')
|
||||||
|
|
||||||
# This step isn't monitored but it's fine since it's not critical.
|
# This step isn't monitored but it's fine since it's not critical.
|
||||||
self.addStep(GenerateCodeCoverage(coverage_url=self.coverage_url,
|
self.addStep(
|
||||||
coverage_dir=self.coverage_dir,
|
GenerateCodeCoverage(build_status_oracle=self.build_status_oracle,
|
||||||
coverage_file='final.info',
|
coverage_url=self.coverage_url,
|
||||||
workdir=WEBRTC_TRUNK_DIR))
|
coverage_dir=self.coverage_dir,
|
||||||
|
coverage_file='final.info',
|
||||||
|
workdir=WEBRTC_TRUNK_DIR))
|
||||||
|
|
||||||
def EnableTests(self, tests):
|
def EnableTests(self, tests):
|
||||||
if self.coverage_enabled:
|
if self.coverage_enabled:
|
||||||
@@ -822,7 +833,8 @@ class WebRTCWinFactory(WebRTCFactory):
|
|||||||
# http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
|
# http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
|
||||||
# To avoid having to modify kill_processes.py, we set the working dir to
|
# To avoid having to modify kill_processes.py, we set the working dir to
|
||||||
# the build dir (three levels up from the build dir that contains
|
# the build dir (three levels up from the build dir that contains
|
||||||
# third_party/psutils).
|
# third_party/psutils). Must reference outside the checkout since it may
|
||||||
|
# have been wiped completely in the previous build.
|
||||||
kill_script = WindowsPathJoin(WEBRTC_BUILD_DIR, '..', '..', '..', '..',
|
kill_script = WindowsPathJoin(WEBRTC_BUILD_DIR, '..', '..', '..', '..',
|
||||||
'scripts', 'slave', 'kill_processes.py')
|
'scripts', 'slave', 'kill_processes.py')
|
||||||
cmd = 'python %s' % kill_script
|
cmd = 'python %s' % kill_script
|
||||||
|
|||||||
Reference in New Issue
Block a user