Moving buildbot to internal repository.

BUG=None
TEST=None

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2428 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
kjellander@webrtc.org 2012-06-20 07:55:41 +00:00
parent 3168e5349c
commit ba5a97db4a
45 changed files with 0 additions and 5125 deletions

31
tools/.gitignore vendored
View File

@ -1,4 +1,3 @@
*.failed
*.pyc
*~
.*.sw?
@ -10,36 +9,6 @@
.pydevproject
.settings
.status_password
/continuous_build/depot_tools
/third_party/bloat
/third_party/gaeunit
/third_party/google-visualization-python
/third_party/oauth2
/third_party/webtreemap
# Buildbot creates these files:
*.new
.manhole
bg_gradient.jpg
changes.pck
changes.pck.old
dropin.cache
events_*
http.log
master.cfg.sample
robots.txt
state.sqlite
state.sqlite-shm
state.sqlite-wal
twistd.log*
twistd.pid
# Chrome buildbot scripts
/continuous_build/build
# Buildbot slave log directories:
/continuous_build/build_internal/masters/master.libvpx/*/
/continuous_build/build_internal/masters/master.webrtc/*/
/continuous_build/build_internal/masters/master.tryserver.webrtc/*/
# Public HTML folder is also a subdirectory, make sure it's not ignored:
!public_html

View File

@ -2,10 +2,6 @@
# Use http rather than https; the latter can cause problems for users behind
# proxies.
vars = {
"chromium_trunk" : "http://src.chromium.org/svn/trunk",
}
deps = {
# Used by quality_tracking.
"tools/third_party/gaeunit":
@ -15,38 +11,8 @@ deps = {
"tools/third_party/oauth2":
"http://github.com/simplegeo/python-oauth2.git@a83f4a29",
# Chromium buildbot scripts needs to be at the same level as our scripts.
"tools/continuous_build/build":
Var("chromium_trunk") + "/tools/build",
# Chromium buildbot scripts needs their own depot_tools.
"tools/continuous_build/depot_tools":
Var("chromium_trunk") + "/tools/depot_tools",
# Used by tools/quality_tracking/dashboard and tools/python_charts.
"tools/third_party/google-visualization-python":
"http://google-visualization-python.googlecode.com/svn/trunk/@15",
# Used by tools/continuous_build/build_internal/symsrc/calculate_bloat.py.
"tools/third_party/bloat":
"https://github.com/martine/bloat.git@31428aaa491",
"tools/third_party/webtreemap":
"https://github.com/martine/webtreemap.git@7839cf9154",
}
deps_os = {
# Statically built Xvfb to be used for browser tests on headless machines.
"unix": {
"tools/continuous_build/build/third_party/xvfb":
Var("chromium_trunk") + "/tools/third_party/xvfb",
},
}
hooks = [
{
# Make changes needed for customization of WebRTC buildbots.
"pattern": ".",
"action": ["python", "tools/fix_webrtc_buildbots.py"],
},
]

View File

@ -1,3 +0,0 @@
kjellander@webrtc.org
phoglund@webrtc.org
ivinnichenko@webrtc.org

View File

@ -1,76 +0,0 @@
WebRTC buildbots
================
These buildbot setups are based on how Chromium uses Buildbot scripts with their
own customizations of startup and master-slave configurations.
The directory layout and the files inside build_internal/masters are copied from
Chromium's repository and modified for our needs according to the guidelines at
http://goo.gl/kPSSv
One nice advantage with using this, is that all slaves run out of the box by
just syncing the WebRTC tools and the third-party dependencies. No additional
dependencies are required except a Python install.
Setup a tools workspace:
========================
mkdir webrtc-tools
cd webrtc-tools
gclient config http://webrtc.googlecode.com/svn/trunk/tools
gclient sync
cd tools/continuous_build
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
echo pass > build/site_config/.bot_password
To run the build master:
========================
cd tools/continuous_build/build_internal/masters/master.webrtc
make restart
To run the try master:
======================
cd tools/continuous_build/build_internal/masters/master.tryserver.webrtc
make restart
To run a slave:
===============
cd tools/continuous_build/build/slave
There are some variables that can be set for flexible development testing:
* TESTING_SLAVENAME : Simulates the slave name. Since slave names are
based on hostnames, they must be overridden using
the this variable in order to run the slave on the
local machine.
* TESTING_MASTER : The master to connect to. We usually use 'WebRTC'
or 'TryServer'.
* TESTING_MASTER_HOST : The host the master is located at.
Default: localhost
* RUN_SLAVE_UPDATED_SCRIPTS : Set this to False to avoid checking for updates
during startup.
For Windows, make sure to add the --use_buildbot_8 flag to the run_slave.bat
in order to make the tests execute properly.
Examples:
---------
Connect to a running build master:
* Linux and Mac:
TESTING_SLAVENAME=webrtc-cb-linux-slave-1 TESTING_MASTER=WebRTC make restart
* Windows:
set TESTING_SLAVENAME=webrtc-cb-linux-slave-1
set TESTING_MASTER=WebRTC
run_slave.bat --use_buildbot_8
Connect to a running try master:
* Linux and Mac:
TESTING_SLAVENAME=linux-trybot-1 TESTING_MASTER=TryServer make restart
* Windows:
set TESTING_SLAVENAME=linux-trybot-1
set TESTING_MASTER=TryServer
run_slave.bat --use_buildbot_8

View File

@ -1,123 +0,0 @@
# -*- makefile -*-
# This file is a copy of the Chromium master-common.mk located at
# /trunk/tools/build/masters of the Chromium tools. It is just modified to add
# the PRIVATESCRIPTS_DIR property.
# This should be included by a makefile which lives in a buildmaster/buildslave
# directory (next to the buildbot.tac file). That including makefile *must*
# define MASTERPATH.
# The 'start' and 'stop' targets start and stop the buildbot master.
# The 'reconfig' target will tell a buildmaster to reload its config file.
# Note that a relative PYTHONPATH entry is relative to the current directory.
# Confirm that MASTERPATH has been defined.
ifeq ($(MASTERPATH),)
$(error MASTERPATH not defined.)
endif
# On the Mac, the buildbot is started via the launchd mechanism as a
# LaunchAgent to give the slave a proper Mac UI environment for tests. In
# order for this to work, the plist must be present and loaded by launchd, and
# the user must be logged in to the UI. The plist is loaded by launchd at user
# login (and the job may have been initially started at that time too). Our
# Mac build slaves are all set up this way, and have auto-login enabled, so
# "make start" should just work and do the right thing.
#
# When using launchd to start the job, it also needs to be used to stop the
# job. Otherwise, launchd might try to restart the job when stopped manually
# by SIGTERM. Using SIGHUP for reconfig is safe with launchd.
#
# Because it's possible to have more than one slave on a machine (for testing),
# this tests to make sure that the slave is in the known slave location,
# /b/slave, which is what the LaunchAgent operates on.
USE_LAUNCHD := \
$(shell [ -f ~/Library/LaunchAgents/org.chromium.buildbot.$(MASTERPATH).plist ] && \
[ "$$(pwd -P)" = "/b/build/masters/$(MASTERPATH)" ] && \
echo 1)
# Elements used to construct PYTHONPATH. These may be overridden by the
# including Makefile.
#
# For example: while we transition from buildbot 0.7.12 to buildbot 0.8.x ,
# some masters will override BUILDBOT_PATH in their local Makefiles.
TOPLEVEL_DIR ?= ../../../build
THIRDPARTY_DIR ?= $(TOPLEVEL_DIR)/third_party
SCRIPTS_DIR ?= $(TOPLEVEL_DIR)/scripts
PUBLICCONFIG_DIR ?= $(TOPLEVEL_DIR)/site_config
PRIVATECONFIG_DIR ?= $(TOPLEVEL_DIR)/../build_internal/site_config
PRIVATESCRIPTS_DIR ?= $(TOPLEVEL_DIR)/../build_internal/scripts
# Packages needed by buildbot7
BUILDBOT7_PATH = $(THIRDPARTY_DIR)/buildbot_7_12:$(THIRDPARTY_DIR)/twisted_8_1
# Packages needed by buildbot8
BUILDBOT8_DEPS := \
buildbot_8_4p1 \
twisted_10_2 \
jinja2 \
sqlalchemy_0_7_1 \
sqlalchemy_migrate_0_7_1 \
tempita_0_5 \
decorator_3_3_1
nullstring :=
space := $(nullstring) #
BUILDBOT8_PATH = $(subst $(space),:,$(BUILDBOT8_DEPS:%=$(THIRDPARTY_DIR)/%))
# Default to buildbot7. To override, put this in the master's Makefile:
# BUILDBOT_PATH = $(BUILDBOT8_PATH)
BUILDBOT_PATH ?= $(BUILDBOT7_PATH)
PYTHONPATH := $(BUILDBOT_PATH):$(SCRIPTS_DIR):$(THIRDPARTY_DIR):$(PUBLICCONFIG_DIR):$(PRIVATECONFIG_DIR):$(PRIVATESCRIPTS_DIR):.
ifeq ($(BUILDBOT_PATH),$(BUILDBOT8_PATH))
start: upgrade
else
start:
endif
ifneq ($(USE_LAUNCHD),1)
PYTHONPATH=$(PYTHONPATH) python $(SCRIPTS_DIR)/common/twistd --no_save -y buildbot.tac
else
launchctl start org.chromium.buildbot.$(MASTERPATH)
endif
ifeq ($(BUILDBOT_PATH),$(BUILDBOT8_PATH))
start-prof: upgrade
else
start-prof:
endif
ifneq ($(USE_LAUNCHD),1)
TWISTD_PROFILE=1 PYTHONPATH=$(PYTHONPATH) python $(SCRIPTS_DIR)/common/twistd --no_save -y buildbot.tac
else
launchctl start org.chromium.buildbot.$(MASTERPATH)
endif
stop:
ifneq ($(USE_LAUNCHD),1)
if `test -f twistd.pid`; then kill `cat twistd.pid`; fi;
else
launchctl stop org.chromium.buildbot.$(MASTERPATH)
endif
reconfig:
kill -HUP `cat twistd.pid`
log:
tail -F twistd.log
wait:
while `test -f twistd.pid`; do sleep 1; done;
restart: stop wait start log
restart-prof: stop wait start-prof log
# This target is only known to work on 0.8.x masters.
upgrade:
@[ -e '.dbconfig' ] || [ -e 'state.sqlite' ] || PYTHONPATH=$(PYTHONPATH) python buildbot upgrade-master .
setup:
@echo export PYTHONPATH=$(PYTHONPATH)

View File

@ -1,5 +0,0 @@
# -*- makefile -*-
BUILDBOT_PATH = $(BUILDBOT8_PATH)
MASTERPATH := master.libvpx
include ../master-common.mk

View File

@ -1,4 +0,0 @@
#!/usr/bin/python
from buildbot.scripts import runner
runner.run()

View File

@ -1,11 +0,0 @@
import os
from twisted.application import service
from buildbot.master import BuildMaster
basedir = os.path.dirname(os.path.abspath(__file__))
configfile = r'master.cfg'
application = service.Application('buildmaster')
BuildMaster(basedir, configfile).setServiceParent(application)

View File

@ -1,32 +0,0 @@
#!/usr/bin/env python
# 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.
from master import master_utils
from master import slaves_list
import config
# This master configuration file reuses most of the WebRTC buildbot master,
# to avoid duplicating the configuration as much as possible.
# It uses a global variable to get the different configuration required for
# the libvpx source path to be set as custom_deps for the build factories.
LIBVPX_BUILD = True
LIBVPX_DEPS_LIST = [
('trunk/third_party/libvpx/source/libvpx',
'http://git.chromium.org/webm/libvpx.git@master'),
]
vars = {'LIBVPX_BUILD':LIBVPX_BUILD,
'LIBVPX_DEPS_LIST': LIBVPX_DEPS_LIST}
execfile('../master.webrtc/master.cfg', vars, vars)
c = BuildmasterConfig = vars['c']
# Remove the Chrome Bloat builder since it's not useful for the libvpx project.
c['builders'] = filter(lambda x: x['name'] != 'LinuxChromeBloat', c['builders'])

View File

@ -1,86 +0,0 @@
#!/usr/bin/env python
# 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.
"""Chrome+WebRTC bots customized for Libvpx build."""
from buildbot.schedulers import timed
from master import master_config
from webrtc_buildbot import webrtc_chromium_factory
def linux():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'linux2')
def mac():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'mac')
def win():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'win32')
CHROME_LKGR = 'http://chromium-status.appspot.com/lkgr'
def ConfigureChromeWebRTCBuilders(c, custom_deps_list=[]):
# The Libvpx Chrome bots are setup without the Chromium helper classes since
# they don't have support for a Nightly scheduler.
# Linux
chrome_linux_debug_factory = linux().ChromiumWebRTCLatestFactory(
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR},
custom_deps_list=custom_deps_list)
chrome_linux_debug_builder = {
'name': 'LinuxChrome',
'factory': chrome_linux_debug_factory,
}
c['builders'].append(chrome_linux_debug_builder)
c['schedulers'][0].builderNames.append('LinuxChrome')
# Mac 10.7 (Lion) ...
chrome_mac_debug_factory = mac().ChromiumWebRTCLatestFactory(
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR},
custom_deps_list=custom_deps_list)
chrome_mac_debug_builder = {
'name': 'MacChrome',
'factory': chrome_mac_debug_factory,
}
c['builders'].append(chrome_mac_debug_builder)
c['schedulers'][0].builderNames.append('MacChrome')
# Windows...
chrome_win_debug_factory = win().ChromiumWebRTCLatestFactory(
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR},
custom_deps_list=custom_deps_list)
chrome_win_debug_builder = {
'name': 'WinChrome',
'factory': chrome_win_debug_factory,
}
c['builders'].append(chrome_win_debug_builder)
c['schedulers'][0].builderNames.append('WinChrome')
def ConfigureNightlyChromeWebRTCBloatBuilder(c, custom_deps_list=[]):
# Must add a Bloat builder for Libvpx to avoid an error during the
# slave configuration check. This builder will be removed at the last stage of
# the configuration loading (see master.libvpx/master.cfg).
chrome_bloat_factory = linux().ChromiumWebRTCBloatFactory(
target='Release',
factory_properties={'safesync_url': CHROME_LKGR,
'gclient_env': {'GYP_DEFINES': 'profiling=1'}},
custom_deps_list=custom_deps_list)
chrome_bloat_builder = {
'name': 'LinuxChromeBloat',
'factory': chrome_bloat_factory,
'category': 'linux',
}
c['builders'].append(chrome_bloat_builder)

View File

@ -1 +0,0 @@
../master.webrtc/master_source_cfg.py

View File

@ -1 +0,0 @@
../master.webrtc/public_html

View File

@ -1 +0,0 @@
../master.webrtc/slaves.cfg

View File

@ -1,5 +0,0 @@
# -*- makefile -*-
BUILDBOT_PATH = $(BUILDBOT8_PATH)
MASTERPATH := master.tryserver.webrtc
include ../master-common.mk

View File

@ -1,4 +0,0 @@
#!/usr/bin/python
from buildbot.scripts import runner
runner.run()

View File

@ -1,11 +0,0 @@
import os
from twisted.application import service
from buildbot.master import BuildMaster
basedir = os.path.dirname(os.path.abspath(__file__))
configfile = r'master.cfg'
application = service.Application('buildmaster')
BuildMaster(basedir, configfile).setServiceParent(application)

View File

@ -1,290 +0,0 @@
#!/usr/bin/env python
# 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.
__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
c = BuildmasterConfig = {}
import os
from buildbot.buildslave import BuildSlave
from buildbot.changes.pb import PBChangeSource
from buildbot.changes.svnpoller import SVNPoller
from buildbot.process import factory
from buildbot.scheduler import Scheduler
from buildbot.status import html
from buildbot.status import mail
from buildbot.steps import shell
# These modules come from scripts, which must be in the PYTHONPATH.
from master import master_utils
from master import slaves_list
from master.builders_pools import BuildersPools
from master.try_job_http import TryJobHTTP
from master.try_job_svn import TryJobSubversion
from master.try_mail_notifier import TryMailNotifier
import config
from webrtc_buildbot import utils
ActiveMaster = config.Master.TryServer
####### CHANGESOURCES
c['change_source'] = []
####### SCHEDULERS
pools = BuildersPools('webrtc')
pools['webrtc'].append('android')
pools['webrtc'].append('android_ndk')
pools['webrtc'].append('linux')
pools['webrtc'].append('linux_rel')
pools['webrtc'].append('mac')
pools['webrtc'].append('mac_rel')
pools['webrtc'].append('win')
pools['webrtc'].append('win_rel')
last_good_urls = {'webrtc': ActiveMaster.last_good_url}
code_review_sites = {'webrtc': ActiveMaster.code_review_site}
try_scheduler = TryJobHTTP(name='try_job_http',
port=ActiveMaster.try_job_port,
last_good_urls=last_good_urls,
code_review_sites=code_review_sites,
pools=pools)
c['schedulers'] = [try_scheduler]
####### TESTS
# Tests to run on the trybots
# Defines the supported tests followed by a tuple defining if the tests are
# enabled on Linux, Mac and/or Windows (in that order; defined in utils.py).
NORMAL_TESTS = {
# Test name Linux Mac Windows
'audio_coding_module_test': (True, True, True),
'audio_coding_unittests': (True, True, True),
'audio_conference_mixer_unittests':(True, True, True),
'audioproc_unittest': (True, True, True),
'bitrate_controller_unittests': (True, True, True),
'cng_unittests': (True, True, True),
'g711_unittests': (True, True, True),
'g722_unittests': (True, True, True),
'libyuv_unittests': (True, True, True),
'jpeg_unittests': (True, True, True),
'media_file_unittests': (True, True, True),
'metrics_unittests': (True, True, True),
'neteq_unittests': (True, True, True),
'pcm16b_unittests': (True, True, True),
'remote_bitrate_estimator_unittests': (True, True, True),
'resampler_unittests': (True, True, True),
'rtp_rtcp_unittests': (True, True, True),
'signal_processing_unittests': (True, True, True),
'system_wrappers_unittests': (True, True, True),
'test_support_unittests': (True, True, True),
'udp_transport_unittests': (True, True, True),
'vad_unittests': (True, True, True),
'video_codecs_test_framework_integrationtests': (True, True, True),
'video_codecs_test_framework_unittests': (True, True, True),
'video_coding_unittests': (True, True, True),
'video_engine_core_unittests': (True, True, True),
'video_processing_unittests': (True, True, True),
'voice_engine_unittests': (True, True, True),
'vp8_unittests': (True, True, True),
'webrtc_utility_unittests': (True, True, True),
}
linux_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Linux')
mac_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Mac')
windows_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Windows')
####### FACTORIES
# Linux
linux_factory_dbg = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_dbg'), is_try_slave=True)
linux_factory_dbg.EnableBuild()
linux_factory_dbg.EnableTests(linux_normal_tests)
linux_factory_release = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_release'), is_try_slave=True)
linux_factory_release.EnableBuild(release=True)
linux_factory_release.EnableTests(linux_normal_tests)
android_factory = utils.WebRTCAndroidFactory(
utils.BuildStatusOracle('android_factory'), is_try_slave=True)
android_factory.EnableBuild(product='toro')
android_ndk_factory = utils.WebRTCAndroidNDKFactory(
utils.BuildStatusOracle('android_ndk_factory'), is_try_slave=True)
android_ndk_factory.EnableBuild()
# Mac
mac_factory_dbg = utils.WebRTCMacFactory(
utils.BuildStatusOracle('mac_factory_dbg'), is_try_slave=True)
mac_factory_dbg.EnableBuild(build_type='make')
mac_factory_dbg.EnableTests(mac_normal_tests)
mac_factory_release = utils.WebRTCMacFactory(
utils.BuildStatusOracle('mac_factory_release'), is_try_slave=True)
mac_factory_release.EnableBuild(build_type='make', release=True)
mac_factory_release.EnableTests(mac_normal_tests)
# Windows
win_factory_debug = utils.WebRTCWinFactory(
utils.BuildStatusOracle('win_factory_debug'), is_try_slave=True)
win_factory_debug.EnableBuild(configuration='Debug')
win_factory_debug.EnableTests(windows_normal_tests)
win_factory_release = utils.WebRTCWinFactory(
utils.BuildStatusOracle('win_factory_release'), is_try_slave=True)
win_factory_release.EnableBuild(configuration='Release')
win_factory_release.EnableTests(windows_normal_tests)
####### BUILDERS
android_builder = {
'name': 'android',
'slavename': 'webrtc-cb-linux-slave-7',
'builddir': 'android-trybot',
'factory': android_factory,
}
android_ndk_builder = {
'name': 'android_ndk',
'slavename': 'webrtc-cb-linux-slave-10',
'builddir': 'android-ndk-trybot',
'factory': android_ndk_factory,
}
linux_builder_debug = {
'name': 'linux',
'slavename': 'webrtc-cb-linux-slave-11',
'builddir': 'linux-trybot-1',
'factory': linux_factory_dbg,
}
linux_builder_release = {
'name': 'linux_rel',
'slavename': 'webrtc-cb-linux-slave-12',
'builddir': 'linux-trybot-2',
'factory': linux_factory_release,
}
mac_builder_debug = {
'name': 'mac',
'slavename': 'dhcp-172-28-249-129',
'builddir': 'mac-trybot-1',
'factory': mac_factory_dbg,
}
mac_builder_release = {
'name': 'mac_rel',
'slavename': 'dhcp-172-28-249-145',
'builddir': 'mac-trybot-2',
'factory': mac_factory_release,
}
win_builder_debug = {
'name': 'win',
'slavename': 'webrtc-win2k8-3',
'builddir': 'win-trybot-1',
'factory': win_factory_debug,
}
win_builder_release = {
'name': 'win_rel',
'slavename': 'webrtc-win-x86',
'builddir': 'win-trybot-2',
'factory': win_factory_release,
}
c['builders'] = [
win_builder_debug,
win_builder_release,
mac_builder_debug,
mac_builder_release,
linux_builder_debug,
linux_builder_release,
android_builder,
android_ndk_builder,
]
def NextJob(builder, requests):
"""Always prioritize commit queue jobs over try jobs."""
for req in requests:
if any(c.who == 'commit-bot@webrtc.org' for c in req.source.changes):
return req
return requests[0]
# Slaves are loaded from slaves.cfg.
slaves = slaves_list.SlavesList('slaves.cfg', 'TryServer')
for builder in c['builders']:
# Associate the slaves to the builders. The configuration is in slaves.cfg.
builder['slavenames'] = slaves.GetSlavesName(builder=builder['name'])
# Don't enable auto_reboot for our bots (Chrome uses it since they don't trust
# their unit tests to clean up properly)
builder['auto_reboot'] = False
# Prioritize commit-queue jobs over try jobs.
# This is documented starting with 0.8.2
# http://buildbot.net/buildbot/docs/0.8.2/Prioritizing-Builds.html#Prioritizing-Builds
# but appears to be working on 0.7.12 already.
builder['nextBuild'] = NextJob
####### BUILDSLAVES
# The 'slaves' list defines the set of allowable buildslaves. List all the
# slaves registered to a builder. Remove dupes.
c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
config.Master.GetBotPassword())
# Make sure everything works together.
master_utils.VerifySetup(c, slaves)
# Adds common status and tools to this master.
# Use our own mail notifier.
master_utils.AutoSetupMaster(c, ActiveMaster, mail_notifier=False,
public_html='../master.webrtc/public_html',
templates=['./templates',
'../master.webrtc/templates'])
####### STATUS TARGETS
# Use an environment variable to easily avoid enabling e-mail for development.
if not os.getenv('BUILDBOT_DEVELOPMENT_MODE'):
email_status = mail.MailNotifier(
fromaddr='webrtc-try-watchlist@google.com',
extraRecipients=['webrtc-try-watchlist@google.com'],
sendToInterestedUsers=True,
mode='failing')
c['status'] += [email_status]
# Try job result emails.
c['status'].append(TryMailNotifier(
fromaddr='webrtc-try-watchlist@google.com',
subject='try %(result)s for %(reason)s on %(builder)s @ r%(revision)s',
mode='all',
lookup=master_utils.UsersAreEmails()))
####### DB URL
# This specifies what database buildbot uses to store change and scheduler
# state. You can leave this at its default for all but the largest
# installations.
c['db_url'] = 'sqlite:///state.sqlite'
####### DEBUGGING OPTIONS
# if you set 'debugPassword', then you can connect to the buildmaster with
# the diagnostic tool in contrib/debugclient.py . From this tool, you can
# manually force builds and inject changes, which may be useful for testing
# your buildmaster without actually committing changes to your repository (or
# before you have a functioning 'sources' set up). The debug tool uses the
# same port number as the slaves do: 'slavePortnum'.
#c['debugPassword'] = 'debugpassword'
# if you set 'manhole', you can ssh into the buildmaster and get an
# interactive python shell, which may be useful for debugging buildbot
# internals. It is probably only useful for buildbot developers. You can also
# use an authorized_keys file, or plain telnet.
#from buildbot import manhole
#c['manhole'] = manhole.PasswordManhole('tcp:9999:interface=127.0.0.1',
# 'admin', 'password')

View File

@ -1,457 +0,0 @@
body {
margin-bottom:50px;
}
body, td {
font-family: Verdana, Cursor;
font-size: 10px;
font-weight: bold;
}
a:link,a:visited,a:active {
color: #444;
}
a:hover {
color: #000000;
}
table {
border-spacing: 1px 1px;
}
table td {
padding: 3px 0px 3px 0px;
text-align: center;
}
.Project {
width: 100px;
}
.LastBuild, .Activity {
padding: 0 0 0 4px;
}
.LastBuild, .Activity, .Builder, .BuildStep {
width: 155px;
max-width: 155px;
}
/* Chromium Specific styles */
div.BuildResultInfo {
color: #444;
}
div.Announcement {
margin-bottom: 1em;
}
div.Announcement > a:hover {
color: black;
}
div.Announcement > div.Notice {
background-color: #afdaff;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Open {
border: 3px solid #8fdf5f;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Closed {
border: 5px solid #e98080;
padding: 0.5em;
font-size: 24px;
font-weight: bold;
text-align: center;
}
td.Time {
color: #000;
border-bottom: 1px solid #aaa;
background-color: #eee;
}
td.Activity, td.Change, td.Builder {
color: #333333;
background-color: #CCCCCC;
}
td.Change {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Event {
color: #777;
background-color: #ddd;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Activity {
border-top-left-radius: 10px;
-webkit-border-top-left-radius: 10px;
-moz-border-radius-topleft: 10px;
min-height: 20px;
padding: 2px 0 2px 0;
}
td.idle, td.waiting, td.offline, td.building {
border-top-left-radius: 0px;
-webkit-border-top-left-radius: 0px;
-moz-border-radius-topleft: 0px;
}
.LastBuild {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
/* Console view styles */
td.DevRev {
padding: 4px 8px 4px 8px;
color: #333333;
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
background-color: #eee;
width: 1%;
}
td.DevRevCollapse {
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
}
td.DevName {
padding: 4px 8px 4px 8px;
color: #333333;
background-color: #eee;
width: 1%;
text-align: left;
}
td.DevStatus {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.DevSlave {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.first {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
}
td.last {
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
td.DevStatusCategory {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-width:1px;
border-style:solid;
}
td.DevStatusCollapse {
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
}
td.DevDetails {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
background-color: #eee;
text-align: left;
}
td.DevComment {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
background-color: #eee;
text-align: left;
}
td.Alt {
background-color: #CCCCCC;
}
.legend {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
width: 100px;
max-width: 100px;
text-align:center;
padding: 2px 2px 2px 2px;
height:14px;
white-space:nowrap;
}
.DevStatusBox {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevStatusBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:20px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
.DevSlaveBox {
text-align:center;
height:10px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevSlaveBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:10px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
a.noround {
border-radius: 0px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
position: relative;
margin-top: -8px;
margin-bottom: -8px;
height: 36px;
border-top-width: 0;
border-bottom-width: 0;
}
a.begin {
border-top-width:1px;
position: relative;
margin-top: 0px;
margin-bottom: -7px;
height: 27px;
border-top-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-right-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
}
a.end {
border-bottom-width:1px;
position: relative;
margin-top: -7px;
margin-bottom: 0px;
height: 27px;
border-bottom-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
}
.center_align {
text-align: center;
}
.right_align {
text-align: right;
}
.left_align {
text-align: left;
}
div.BuildWaterfall {
border-radius: 7px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
position: absolute;
left: 0px;
top: 0px;
background-color: #FFFFFF;
padding: 4px 4px 4px 4px;
float: left;
display: none;
border-width: 1px;
border-style: solid;
}
/* LastBuild, BuildStep states */
.success {
color: #FFFFFF;
background-color: #8fdf5f;
border-color: #4F8530;
}
.failure {
color: #FFFFFF;
background-color: #e98080;
border-color: #A77272;
}
.warnings {
color: #FFFFFF;
background-color: #ffc343;
border-color: #C29D46;
}
.exception, td.offline {
color: #FFFFFF;
background-color: #e0b0ff;
border-color: #ACA0B3;
}
.start,.running, td.building {
color: #666666;
background-color: #fffc6c;
border-color: #C5C56D;
}
.running_failure {
color: #FFFFFF;
background-color: #fffc6c;
border-color: #ff0000;
}
.start {
border-bottom-left-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomleft: 10px;
border-bottom-right-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-moz-border-radius-bottomright: 10px;
}
.notstarted {
border-width:1px;
border-style:solid;
border-color:#aaa;
}
.closed {
background-color: #ff0000;
}
.closed .large {
font-size: 1.5em;
font-weight: bolder;
}
td.Project a:hover, td.start a:hover {
color: #000;
}
.mini-box {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.mini-box a {
border-radius: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
display:block;
width:100%;
height:20px;
line-height:20px;
margin-top:-30px;
}
.mini-closed {
-box-sizing:border-box;
-webkit-box-sizing:border-box;
border:4px solid red;
}
/* grid styles */
table.Grid {
border-collapse: collapse;
}
table.Grid tr td {
padding: 0.2em;
margin: 0px;
text-align: center;
}
table.Grid tr td.title {
font-size: 90%;
border-right: 1px gray solid;
border-bottom: 1px gray solid;
}
table.Grid tr td.sourcestamp {
font-size: 90%;
}
table.Grid tr td.builder {
text-align: right;
font-size: 90%;
}
table.Grid tr td.build {
border: 1px gray solid;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,86 +0,0 @@
# -*- python -*-
# ex: set syntax=python:
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# See master.experimental/slaves.cfg for documentation.
def linux():
return [
{
'master': 'TryServer',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'android',
'hostname': 'webrtc-cb-linux-slave-13',
},
{
'master': 'TryServer',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'android_ndk',
'hostname': 'webrtc-cb-linux-slave-14',
},
{
'master': 'TryServer',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'linux',
'hostname': 'webrtc-cb-linux-slave-11',
},
{
'master': 'TryServer',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'linux_rel',
'hostname': 'webrtc-cb-linux-slave-12',
},
]
def mac():
return [
{
'master': 'TryServer',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'mac',
'hostname': 'dhcp-172-28-249-129',
},
{
'master': 'TryServer',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'mac_rel',
'hostname': 'dhcp-172-28-249-145',
},
]
def windows():
return [
{
'master': 'TryServer',
'os': 'win',
'version': 'server2008',
'bits': '64',
'builder': 'win',
'hostname': 'webrtc-win2k8-3',
},
{
'master': 'TryServer',
'os': 'win',
'version': 'server2008',
'bits': '64',
'builder': 'win_rel',
'hostname': 'webrtc-win-x86',
},
]
slaves = linux() + mac() + windows()

View File

@ -1,5 +0,0 @@
# -*- makefile -*-
BUILDBOT_PATH = $(BUILDBOT8_PATH)
MASTERPATH := master.webrtc
include ../master-common.mk

View File

@ -1,4 +0,0 @@
#!/usr/bin/python
from buildbot.scripts import runner
runner.run()

View File

@ -1,11 +0,0 @@
import os
from twisted.application import service
from buildbot.master import BuildMaster
basedir = os.path.dirname(os.path.abspath(__file__))
configfile = r'master.cfg'
application = service.Application('buildmaster')
BuildMaster(basedir, configfile).setServiceParent(application)

View File

@ -1,515 +0,0 @@
#!/usr/bin/env python
# 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.
c = BuildmasterConfig = {}
import os
from buildbot.buildslave import BuildSlave
from buildbot.changes.pb import PBChangeSource
from buildbot.changes.svnpoller import SVNPoller
from buildbot.process import factory
from buildbot.schedulers import basic
from buildbot.schedulers import timed
from buildbot.status import html
from buildbot.status import mail
from buildbot.status.web import grid
from buildbot.steps import shell
# These modules come from scripts, which must be in the PYTHONPATH.
from master import master_utils
from master import slaves_list
import config
from webrtc_buildbot import utils
def is_libvpx_build():
"""Used to check if this master is the default or the libvpx master."""
return 'LIBVPX_BUILD' in globals()
ActiveMaster = (config.Master.Libvpx if is_libvpx_build() else
config.Master.WebRTC)
####### CHANGESOURCES
import master_source_cfg
master_source_cfg.ConfigureChangeSource(config, c)
####### SCHEDULERS
from buildbot.scheduler import Scheduler
builder_names = ['Win32Debug',
'Win32Release',
'MacOS32DBG',
'MacOS32Release',
'Linux32DBG',
'Linux32Release',
'Linux64DBG',
'Linux64Release',
'LinuxClang',
'LinuxMemcheck',
'LinuxTsan',
'LinuxAsan',
'Linux64DBG-GCC4.6',
'LinuxLargeTests',
'MacLargeTests',
'WinLargeTests',
'Android',
'AndroidNDK',
'ChromeOS',
]
if is_libvpx_build():
# Run the libvpx waterfall only nightly since it re-uses the WebRTC bots and
# would cause colliding builds otherwise.
scheduler = timed.Nightly(name='libvpx_nightly', branch='trunk',
builderNames=builder_names, hour=20)
else:
# Trigger builds on each check-in if we are the regular WebRTC waterfall.
scheduler = basic.SingleBranchScheduler(name='all', branch='trunk',
builderNames=builder_names)
# Note that additional schedulers (used by the Chrome+WebRTC builders) are
# defined in master_builders_cfg.py. This is an in progress change to make all
# our bots use the Chromium Buildbot scripts.
c['schedulers'] = [scheduler]
####### TESTS
# Defines the supported tests followed by a tuple defining if the tests are
# enabled on Linux, Mac and/or Windows (in that order; defined in utils.py).
from webrtc_buildbot import utils
# Normal tests run on Virtual machines for Linux and Windows and physical
# machines for Mac.
NORMAL_TESTS = {
# Test name Linux Mac Windows
'audio_coding_module_test': (True, True, True),
'audio_coding_unittests': (True, True, True),
'audio_conference_mixer_unittests':(True, True, True),
'audio_device_test_api': (False, True, False), # no audio devices
'audioproc_unittest': (True, True, True),
'bitrate_controller_unittests': (True, True, True),
'cng_unittests': (True, True, True),
'g711_unittests': (True, True, True),
'g722_unittests': (True, True, True),
'libyuv_unittests': (True, True, True),
'jpeg_unittests': (True, True, True),
'media_file_unittests': (True, True, True),
'metrics_unittests': (True, True, True),
'neteq_unittests': (True, True, True),
'pcm16b_unittests': (True, True, True),
'resampler_unittests': (True, True, True),
'rtp_rtcp_unittests': (True, True, True),
'signal_processing_unittests': (True, True, True),
'system_wrappers_unittests': (True, True, True),
'remote_bitrate_estimator_unittests': (True, True, True),
'test_fec': (True, True, True),
'test_support_unittests': (True, True, True),
'udp_transport_unittests': (True, True, True),
'vad_unittests': (True, True, True),
'video_codecs_test_framework_integrationtests': (True, True, True),
'video_codecs_test_framework_unittests': (True, True, True),
'video_coding_unittests': (True, True, True),
'video_engine_core_unittests': (True, True, True),
'video_processing_unittests': (True, True, True),
'voice_engine_unittests': (True, True, True),
'vp8_integrationtests': (True, True, True),
'vp8_unittests': (True, True, True),
'webrtc_utility_unittests': (True, True, True),
}
# Physical machine tests run on hardware with audio device and webcam present.
PHYSICAL_MACHINE_TESTS = {
# Test name Linux Mac Windows
'audio_e2e_test': (True, False, False),
'audio_device_test_api': (False, False, False), # Issue 257+339
'video_render_module_test': (True, True, True),
'vie_auto_test': (True, True, True),
'voe_auto_test': (True, True, True),
}
MEMCHECK_DISABLED_TESTS = [
'audio_coding_module_test', # Issue 270
'test_fec', # Too slow for Valgrind memcheck
]
TSAN_DISABLED_TESTS = [
'audio_coding_module_test', # Issue 283
'audioproc_unittest', # Issue 299
'system_wrappers_unittests', # Issue 300
'video_processing_unittests', # Issue 303
'test_fec', # Too slow for TSAN
]
ASAN_DISABLED_TESTS = [
'audio_coding_module_test', # Issue 281
'bitrate_controller_unittests', # Issue 555
'neteq_unittests', # Issue 282
]
linux_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Linux')
mac_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Mac')
windows_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Windows')
linux_physical_machine_tests = utils.GetEnabledTests(PHYSICAL_MACHINE_TESTS,
'Linux')
mac_physical_machine_tests = utils.GetEnabledTests(PHYSICAL_MACHINE_TESTS,
'Mac')
windows_physical_machine_tests = utils.GetEnabledTests(PHYSICAL_MACHINE_TESTS,
'Windows')
####### FACTORIES
CHROME_SVN_URL = 'http://src.chromium.org/svn/trunk/src'
CHROME_LKGR_URL = 'http://chromium-status.appspot.com/lkgr'
CHROME_GCLIENT_SOLUTION_NAME='src'
CHROME_CUSTOM_DEPS_LIST = [
('src/third_party/webrtc', 'http://webrtc.googlecode.com/svn/stable/src'),
('src/third_party/WebKit/LayoutTests', None),
('src/webkit/data/layout_tests/LayoutTests', None),
]
VALGRIND_DEPS_LIST = [
('trunk/third_party/valgrind',
'http://src.chromium.org/svn/trunk/deps/third_party/valgrind/binaries'),
]
ASAN_DEPS_LIST = [
('trunk/third_party/asan',
'http://src.chromium.org/chrome/trunk/deps/third_party/asan'),
]
# Libvpx waterfall has additional configuration (inherits this config).
DEFAULT_CUSTOM_DEPS = LIBVPX_DEPS_LIST if is_libvpx_build() else []
# Linux
linux_factory_64_dbg = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_64_dbg'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
linux_factory_64_dbg.EnableBuild()
linux_factory_64_dbg.EnableTests(linux_normal_tests)
linux_factory_32_release = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_32_release'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
linux_factory_32_release.EnableBuild(release=True, build32=True)
linux_factory_32_release.EnableTests(linux_normal_tests)
linux_factory_64_release = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_64_release'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
linux_factory_64_release.EnableBuild(release=True)
linux_factory_64_release.EnableTests(linux_normal_tests)
linux_factory_32_dbg = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_32_dbg'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
linux_factory_32_dbg.EnableCoverage(
coverage_url='http://webrtc-cb-linux-slave-4.cbf.corp.google.com/coverage/')
linux_factory_32_dbg.EnableBuild(build32=True)
linux_factory_32_dbg.EnableTests(linux_normal_tests)
# The video factory needs to prepare for valgrind since some tests will run
# under tooling. Not all tests will though since that would be too slow.
linux_factory_large_tests = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_factory_large_tests'),
custom_deps_list=VALGRIND_DEPS_LIST + DEFAULT_CUSTOM_DEPS)
linux_factory_large_tests.EnableCoverage(
coverage_url='http://webrtc-build-bot-se.lul/coverage/')
linux_factory_large_tests.EnableBuild(compile_for_memory_tooling=True)
linux_factory_large_tests.EnableTests(linux_physical_machine_tests)
chromeos_factory = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('chromeos_factory'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
chromeos_factory.EnableBuild(chrome_os=True)
chromeos_factory.EnableTests(linux_normal_tests)
linux_clang = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_clang'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
linux_clang.EnableBuild(clang=True)
linux_clang.EnableTests(linux_normal_tests)
linux_memcheck_factory = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_memcheck_factory'), run_with_memcheck=True,
custom_deps_list=VALGRIND_DEPS_LIST + DEFAULT_CUSTOM_DEPS)
linux_memcheck_factory.EnableBuild(release=True,
compile_for_memory_tooling=True)
# Filter out disabled memcheck tests:
memcheck_tests = filter(lambda test: test not in MEMCHECK_DISABLED_TESTS,
linux_normal_tests)
linux_memcheck_factory.EnableTests(memcheck_tests)
linux_tsan_factory = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_tsan_factory'), run_with_tsan=True,
custom_deps_list=VALGRIND_DEPS_LIST + DEFAULT_CUSTOM_DEPS)
linux_tsan_factory.EnableBuild(release=True, compile_for_memory_tooling=True)
# Filter out disabled tsan tests:
tsan_tests = filter(lambda test: test not in TSAN_DISABLED_TESTS,
linux_normal_tests)
linux_tsan_factory.EnableTests(tsan_tests)
linux_asan_factory = utils.WebRTCLinuxFactory(
utils.BuildStatusOracle('linux_asan_factory'), run_with_asan=True,
custom_deps_list=ASAN_DEPS_LIST + DEFAULT_CUSTOM_DEPS)
linux_asan_factory.EnableBuild(release=True, clang=True)
# Filter out disabled asan tests:
asan_tests = filter(lambda test: test not in ASAN_DISABLED_TESTS,
linux_normal_tests)
linux_asan_factory.EnableTests(asan_tests)
android_factory = utils.WebRTCAndroidFactory(
utils.BuildStatusOracle('android_factory'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
android_factory.EnableBuild(product='toro')
android_ndk_factory = utils.WebRTCAndroidNDKFactory(
utils.BuildStatusOracle('android_ndk_factory'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
android_ndk_factory.EnableBuild()
# Mac
mac_factory_32_dbg = utils.WebRTCMacFactory(
utils.BuildStatusOracle('mac_factory_32_dbg'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
mac_factory_32_dbg.EnableBuild(build_type='both')
mac_factory_32_dbg.EnableTests(mac_normal_tests)
mac_factory_32_release = utils.WebRTCMacFactory(
utils.BuildStatusOracle('mac_factory_32_release'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
mac_factory_32_release.EnableBuild(build_type='both', release=True)
mac_factory_32_release.EnableTests(mac_normal_tests)
mac_factory_large_tests = utils.WebRTCMacFactory(
utils.BuildStatusOracle('mac_factory_large_tests'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
mac_factory_large_tests.EnableBuild(build_type='make')
mac_factory_large_tests.EnableTests(mac_physical_machine_tests)
# Windows
win_factory_32_Debug = utils.WebRTCWinFactory(
utils.BuildStatusOracle('win_factory_32_debug'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
win_factory_32_Debug.EnableBuild(configuration='Debug')
win_factory_32_Debug.EnableTests(windows_normal_tests)
win_factory_32_Release = utils.WebRTCWinFactory(
utils.BuildStatusOracle('win_factory_32_release'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
win_factory_32_Release.EnableBuild(configuration='Release')
win_factory_32_Release.EnableTests(windows_normal_tests)
win_factory_large_tests = utils.WebRTCWinFactory(
utils.BuildStatusOracle('win_factory_large_tests'),
custom_deps_list=DEFAULT_CUSTOM_DEPS)
win_factory_large_tests.EnableBuild()
win_factory_large_tests.EnableTests(windows_physical_machine_tests)
####### BUILDERS
linux_builder_64_debug = {
'name': 'Linux64DBG',
'slavename': 'webrtc-cb-linux-slave-1',
'builddir': 'linux-slave-1',
'factory': linux_factory_64_dbg,
}
linux_builder_32_release = {
'name': 'Linux32Release',
'slavename': 'webrtc-cb-linux-slave-2',
'builddir': 'linux-slave-2',
'factory': linux_factory_32_release,
}
linux_builder_64_release = {
'name': 'Linux64Release',
'slavename': 'webrtc-cb-linux-slave-5',
'builddir': 'linux-slave-5',
'factory': linux_factory_64_release,
}
linux_builder_32_debug = {
'name': 'Linux32DBG',
'slavename': 'webrtc-cb-linux-slave-4',
'builddir': 'linux-slave-4',
'factory': linux_factory_32_dbg,
}
mac_builder_32_debug = {
'name': 'MacOS32DBG',
'slavename': 'dhcp-172-28-249-144',
'builddir': 'mac-slave-3',
'factory': mac_factory_32_dbg,
}
mac_builder_32_release = {
'name': 'MacOS32Release',
'slavename': 'dhcp-172-28-249-167',
'builddir': 'mac-slave-2',
'factory': mac_factory_32_release,
}
mac_builder_large_tests = {
'name': 'MacLargeTests',
'slavename': 'dhcp-172-28-249-168',
'builddir': 'mac-large-tests',
'factory': mac_factory_large_tests,
}
chromeos_builder = {
'name': 'ChromeOS',
'slavename': 'webrtc-cb-linux-slave-3',
'builddir': 'chromeos',
'factory': chromeos_factory,
}
win_builder_32_debug = {
'name': 'Win32Debug',
'slavename': 'webrtc-win2k8-1',
'builddir': 'win-32-dbg',
'factory': win_factory_32_Debug,
}
win_builder_32_release = {
'name': 'Win32Release',
'slavename': 'webrtc-win2k8-2',
'builddir': 'win-32-release',
'factory': win_factory_32_Release,
}
win_builder_large_tests = {
'name': 'WinLargeTests',
'slavename': 'webrtc-test-w',
'builddir': 'win-large-tests',
'factory': win_factory_large_tests,
}
linux_builder_large_tests = {
'name': 'LinuxLargeTests',
'slavename': 'webrtc-build-bot-se',
'builddir': 'linux-large-tests',
'factory': linux_factory_large_tests,
}
linux_builder_clang = {
'name': 'LinuxClang',
'slavename': 'webrtc-cb-linux-slave-8',
'builddir': 'linux-clang',
'factory': linux_clang,
}
linux_builder_memcheck = {
'name': 'LinuxMemcheck',
'slavename': 'webrtc-cb-linux-slave-6',
'builddir': 'linux-memcheck',
'factory': linux_memcheck_factory,
}
linux_builder_tsan = {
'name': 'LinuxTsan',
'slavename': 'webrtc-cb-linux-slave-15',
'builddir': 'linux-tsan',
'factory': linux_tsan_factory,
}
linux_builder_asan = {
'name': 'LinuxAsan',
'slavename': 'webrtc-cb-linux-slave-16',
'builddir': 'linux-asan',
'factory': linux_asan_factory,
}
android_builder_1 = {
'name': 'Android',
'slavename': 'webrtc-cb-linux-slave-7',
'builddir': 'android',
'factory': android_factory,
}
android_builder_ndk = {
'name': 'AndroidNDK',
'slavename': 'webrtc-cb-linux-slave-10',
'builddir': 'android-ndk',
'factory': android_ndk_factory,
}
linux_builder_gcc_4_6 = {
'name': 'Linux64DBG-GCC4.6',
'slavename': 'webrtc-cb-linux-slave-9',
'builddir': 'linux-slave-gcc-4.6',
'factory': linux_factory_64_dbg,
}
c['builders'] = [
win_builder_32_debug,
win_builder_32_release,
mac_builder_32_debug,
mac_builder_32_release,
linux_builder_32_debug,
linux_builder_32_release,
linux_builder_64_release,
linux_builder_64_debug,
linux_builder_clang,
linux_builder_memcheck,
linux_builder_tsan,
linux_builder_asan,
linux_builder_gcc_4_6,
win_builder_large_tests,
mac_builder_large_tests,
linux_builder_large_tests,
android_builder_1,
android_builder_ndk,
chromeos_builder,
]
# Load Chrome bots that are using Chromium factories.
# These modules come from the local directory.
import master_builders_cfg
master_builders_cfg.ConfigureChromeWebRTCBuilders(c,
custom_deps_list=DEFAULT_CUSTOM_DEPS)
master_builders_cfg.ConfigureNightlyChromeWebRTCBloatBuilder(c,
custom_deps_list=DEFAULT_CUSTOM_DEPS)
####### BUILDSLAVES
# Slaves are loaded from slaves.cfg.
slaves = slaves_list.SlavesList('slaves.cfg', 'WebRTC')
for builder in c['builders']:
# Associate the slaves to the builders. The configuration is in slaves.cfg.
builder['slavenames'] = slaves.GetSlavesName(builder=builder['name'])
# The 'slaves' list defines the set of allowable buildslaves. List all the
# slaves registered to a builder. Remove dupes.
c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
config.Master.GetBotPassword())
# Make sure everything works together.
master_utils.VerifySetup(c, slaves)
# Adds common status and tools to this master.
master_utils.AutoSetupMaster(c, ActiveMaster, mail_notifier=False,
enable_http_status_push=False)
####### STATUS TARGETS
# Override the tgrid URL since we're parsing that in WebRTC for LKGR
# (Chrome doesn't use it and puts the Console page on that URL instead).
c['status'][0].putChild("tgrid", grid.TransposedGridStatusResource())
# Use an environment variable to easily avoid enabling e-mail for development.
if not os.getenv('BUILDBOT_DEVELOPMENT_MODE'):
watchlist_email = ('libvpx-cb-watchlist@google.com' if is_libvpx_build() else
'webrtc-cb-watchlist@google.com')
email_status = mail.MailNotifier(
fromaddr=watchlist_email,
extraRecipients=[watchlist_email],
sendToInterestedUsers=True,
mode='failing',
lookup=master_utils.UsersAreEmails())
c['status'] += [email_status]
####### DB URL
# This specifies what database buildbot uses to store change and scheduler
# state. You can leave this at its default for all but the largest
# installations.
c['db_url'] = 'sqlite:///state.sqlite'
####### DEBUGGING OPTIONS
# if you set 'debugPassword', then you can connect to the buildmaster with
# the diagnostic tool in contrib/debugclient.py . From this tool, you can
# manually force builds and inject changes, which may be useful for testing
# your buildmaster without actually committing changes to your repository (or
# before you have a functioning 'sources' set up). The debug tool uses the
# same port number as the slaves do: 'slavePortnum'.
#c['debugPassword'] = 'debugpassword'
# if you set 'manhole', you can ssh into the buildmaster and get an
# interactive python shell, which may be useful for debugging buildbot
# internals. It is probably only useful for buildbot developers. You can also
# use an authorized_keys file, or plain telnet.
#from buildbot import manhole
#c['manhole'] = manhole.PasswordManhole('tcp:9999:interface=127.0.0.1',
# 'admin', 'password')

View File

@ -1,97 +0,0 @@
#!/usr/bin/env python
# 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.
"""Chrome+WebRTC bots configured in Chromium style."""
from buildbot.schedulers import timed
from master import master_config
from webrtc_buildbot import webrtc_chromium_factory
# Used to put builders into different categories by the Helper class.
defaults = {}
def linux():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'linux2')
def mac():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'mac')
def win():
return webrtc_chromium_factory.ChromiumWebRTCFactory('src/build', 'win32')
CHROME_LKGR = 'http://chromium-status.appspot.com/lkgr'
def ConfigureChromeWebRTCBuilders(c, custom_deps_list=[]):
helper = master_config.Helper(defaults)
B = helper.Builder
F = helper.Factory
S = helper.Scheduler
# Main Scheduler for WebRTC
S('webrtc_rel', branch='trunk', treeStableTimer=0)
# Set up all the builders.
# Don't put spaces or 'funny characters' within the builder names, so that
# we can safely use the builder name as part of a filepath.
# Linux...
defaults['category'] = 'linux'
B('LinuxChrome', 'chrome_linux_debug_factory', scheduler='webrtc_rel')
F('chrome_linux_debug_factory', linux().ChromiumWebRTCLatestFactory(
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR,
'use_xvfb_on_linux': True},
custom_deps_list=custom_deps_list))
# Mac 10.7 (Lion) ...
defaults['category'] = 'mac-10.7'
B('MacChrome', 'chrome_mac_debug_factory', scheduler='webrtc_rel')
F('chrome_mac_debug_factory', mac().ChromiumWebRTCLatestFactory(
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR},
custom_deps_list=custom_deps_list))
# Windows...
defaults['category'] = 'windows'
B('WinChrome', 'chrome_win32_debug_factory', scheduler='webrtc_rel')
F('chrome_win32_debug_factory', win().ChromiumWebRTCLatestFactory(
project=r'..\chrome\chrome.sln',
target='Debug',
factory_properties={'safesync_url': CHROME_LKGR},
custom_deps_list=custom_deps_list))
# Use the helper class to connect the builders, factories and schedulers
# and add them to the BuildmasterConfig (c) dictionary.
helper.Update(c)
def ConfigureNightlyChromeWebRTCBloatBuilder(c, custom_deps_list=[]):
# Nightly Scheduler at 22 PM CST/CDT. This will mean 5 AM in the CET
# time zone, which should avoid everyone's working hours.
nightly_scheduler = timed.Nightly(name='webrtc_nightly',
branch='trunk',
builderNames=['LinuxChromeBloat'],
hour=22)
c['schedulers'].append(nightly_scheduler)
# The Bloat calculator bot is setup without the helper classes since they
# don't have support for a Nightly scheduler.
chrome_bloat_factory = linux().ChromiumWebRTCBloatFactory(
target='Release',
factory_properties={'safesync_url': CHROME_LKGR,
'gclient_env': {'GYP_DEFINES': 'profiling=1'}},
custom_deps_list=custom_deps_list)
chrome_bloat_builder = {
'name': 'LinuxChromeBloat',
'factory': chrome_bloat_factory,
'category': 'linux',
}
c['builders'].append(chrome_bloat_builder)

View File

@ -1,31 +0,0 @@
#!/usr/bin/env python
# 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.
"""Source control poller for the WebRTC code."""
from buildbot.changes import svnpoller
from master import build_utils
def WebRTCFileSplitter(path):
"""Splits the SVN path into branch and filename sections."""
# We're currently only using trunk branch but we may soon start building
# multiple branches.
projects = ['trunk']
return build_utils.SplitPath(projects, path)
def ConfigureChangeSource(config, c):
webrtc_revlinktmpl = 'http://code.google.com/p/webrtc/source/browse?r=%s'
webrtc_poller = svnpoller.SVNPoller(svnurl=config.Master.webrtc_root_url,
split_file=WebRTCFileSplitter,
pollinterval=30,
histmax=10,
revlinktmpl=webrtc_revlinktmpl)
c['change_source'] = webrtc_poller

View File

@ -1,486 +0,0 @@
body {
margin-bottom:50px;
}
body, td {
font-family: Verdana, Cursor;
font-size: 10px;
font-weight: bold;
}
a:link,a:visited,a:active {
color: #444;
}
a:hover {
color: #000000;
}
table {
border-spacing: 1px 1px;
}
table td {
padding: 3px 0px 3px 0px;
text-align: center;
}
.closerbox {
border: 1px solid #aaa;
background-color: #eef;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
}
.closerbox table {
padding: 0 4px;
}
.closerbox .title {
background-color: #ccc;
border-top-left-radius: 8px;
-webkit-border-top-left-radius: 8px;
-moz-border-top-left-radius: 8px;
border-top-right-radius: 8px;
-webkit-border-top-right-radius: 8px;
-moz-border-top-right-radius: 8px;
padding: 0 0 2px;
}
.Project {
width: 100px;
}
.LastBuild, .Activity {
padding: 0 0 0 4px;
}
.LastBuild, .Activity, .Builder, .BuildStep {
width: 155px;
max-width: 155px;
}
/* Chromium Specific styles */
div.BuildResultInfo {
color: #444;
}
div.Announcement {
margin-bottom: 1em;
}
div.Announcement > a:hover {
color: black;
}
div.Announcement > div.Notice {
background-color: #afdaff;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Open {
border: 3px solid #8fdf5f;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Closed {
border: 5px solid #e98080;
padding: 0.5em;
font-size: 24px;
font-weight: bold;
text-align: center;
}
td.Time {
color: #000;
border-bottom: 1px solid #aaa;
background-color: #eee;
}
td.Activity, td.Change, td.Builder {
color: #333333;
background-color: #CCCCCC;
}
td.Change {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Event {
color: #777;
background-color: #ddd;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Activity {
border-top-left-radius: 10px;
-webkit-border-top-left-radius: 10px;
-moz-border-radius-topleft: 10px;
min-height: 20px;
padding: 2px 0 2px 0;
}
td.idle, td.waiting, td.offline, td.building {
border-top-left-radius: 0px;
-webkit-border-top-left-radius: 0px;
-moz-border-radius-topleft: 0px;
}
.LastBuild {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
/* Console view styles */
td.DevRev {
padding: 4px 8px 4px 8px;
color: #333333;
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
background-color: #eee;
width: 1%;
}
td.DevRevCollapse {
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
}
td.DevName {
padding: 4px 8px 4px 8px;
color: #333333;
background-color: #eee;
width: 1%;
text-align: left;
}
td.DevStatus {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.DevSlave {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.first {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
}
td.last {
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
td.DevStatusCategory {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-width:1px;
border-style:solid;
}
td.DevStatusCollapse {
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
}
td.DevDetails {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
background-color: #eee;
text-align: left;
}
td.DevComment {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
background-color: #eee;
text-align: left;
}
td.Alt {
background-color: #CCCCCC;
}
.legend {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
width: 100px;
max-width: 100px;
text-align:center;
padding: 2px 2px 2px 2px;
height:14px;
white-space:nowrap;
}
.DevStatusBox {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevStatusBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:20px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
.DevSlaveBox {
text-align:center;
height:10px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevSlaveBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:10px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
a.noround {
border-radius: 0px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
position: relative;
margin-top: -8px;
margin-bottom: -8px;
height: 36px;
border-top-width: 0;
border-bottom-width: 0;
}
a.begin {
border-top-width:1px;
position: relative;
margin-top: 0px;
margin-bottom: -7px;
height: 27px;
border-top-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-right-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
}
a.end {
border-bottom-width:1px;
position: relative;
margin-top: -7px;
margin-bottom: 0px;
height: 27px;
border-bottom-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
}
.center_align {
text-align: center;
}
.right_align {
text-align: right;
}
.left_align {
text-align: left;
}
div.BuildWaterfall {
border-radius: 7px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
position: absolute;
left: 0px;
top: 0px;
background-color: #FFFFFF;
padding: 4px 4px 4px 4px;
float: left;
display: none;
border-width: 1px;
border-style: solid;
}
/* LastBuild, BuildStep states */
.success {
color: #FFFFFF;
background-color: #8fdf5f;
border-color: #4F8530;
}
.failure {
color: #FFFFFF;
background-color: #e98080;
border-color: #A77272;
}
.warnings {
color: #FFFFFF;
background-color: #ffc343;
border-color: #C29D46;
}
.never {
color: #FFFFFF;
background-color: #f0f0e0;
border-color: #A77272;
}
.exception, td.offline {
color: #FFFFFF;
background-color: #e0b0ff;
border-color: #ACA0B3;
}
.start,.running, td.building {
color: #666666;
background-color: #fffc6c;
border-color: #C5C56D;
}
.running_failure {
color: #FFFFFF;
background-color: #fffc6c;
border-color: #ff0000;
}
.start {
border-bottom-left-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomleft: 10px;
border-bottom-right-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-moz-border-radius-bottomright: 10px;
}
.notstarted {
border-width:1px;
border-style:solid;
border-color:#aaa;
}
.closed {
background-color: #ff0000;
}
.closed .large {
font-size: 1.5em;
font-weight: bolder;
}
td.Project a:hover, td.start a:hover {
color: #000;
}
.mini-box {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.mini-box a {
border-radius: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
display:block;
width:100%;
height:20px;
line-height:20px;
margin-top:-30px;
}
.mini-closed {
-box-sizing:border-box;
-webkit-box-sizing:border-box;
border:4px solid red;
}
/* grid styles */
table.Grid {
border-collapse: collapse;
}
table.Grid tr td {
padding: 0.2em;
margin: 0px;
text-align: center;
}
table.Grid tr td.title {
font-size: 90%;
border-right: 1px gray solid;
border-bottom: 1px gray solid;
}
table.Grid tr td.sourcestamp {
font-size: 90%;
}
table.Grid tr td.builder {
text-align: right;
font-size: 90%;
}
table.Grid tr td.build {
border: 1px gray solid;
}

View File

@ -1,504 +0,0 @@
body {
margin-bottom:50px;
}
body, td {
font-family: Verdana, Cursor;
font-size: 10px;
font-weight: bold;
}
a:link,a:visited,a:active {
color: #444;
}
a:hover {
color: #000000;
}
table {
border-spacing: 1px 1px;
}
table td {
padding: 3px 0px 3px 0px;
text-align: center;
}
.closerbox {
border: 1px solid #aaa;
background-color: #eef;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
}
.closerbox table {
padding: 0 4px;
}
.closerbox .title {
background-color: #ccc;
border-top-left-radius: 8px;
-webkit-border-top-left-radius: 8px;
-moz-border-top-left-radius: 8px;
border-top-right-radius: 8px;
-webkit-border-top-right-radius: 8px;
-moz-border-top-right-radius: 8px;
padding: 0 0 2px;
}
.Project {
width: 100px;
}
.LastBuild, .Activity {
padding: 0 0 0 4px;
}
.LastBuild, .Activity, .Builder, .BuildStep {
width: 155px;
max-width: 155px;
}
/* Chromium Specific styles */
div.BuildResultInfo {
color: #444;
}
div.Announcement {
margin-bottom: 1em;
}
div.Announcement > a:hover {
color: black;
}
div.Announcement > div.Notice {
background-color: #afdaff;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Open {
border: 3px solid #8fdf5f;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement > div.Closed {
border: 5px solid #e98080;
padding: 0.5em;
font-size: 24px;
font-weight: bold;
text-align: center;
}
td.Time {
color: #000;
border-bottom: 1px solid #aaa;
background-color: #eee;
}
td.Activity, td.Change, td.Builder {
color: #333333;
background-color: #CCCCCC;
}
td.Change {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Event {
color: #777;
background-color: #ddd;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Activity {
border-top-left-radius: 10px;
-webkit-border-top-left-radius: 10px;
-moz-border-radius-topleft: 10px;
min-height: 20px;
padding: 2px 0 2px 0;
}
td.idle, td.waiting, td.offline, td.building {
border-top-left-radius: 0px;
-webkit-border-top-left-radius: 0px;
-moz-border-radius-topleft: 0px;
}
.LastBuild {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
/* Console view styles */
td.DevRev {
padding: 4px 8px 4px 8px;
color: #333333;
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
background-color: #eee;
width: 1%;
}
td.DevRevCollapse {
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
}
td.DevName {
padding: 4px 8px 4px 8px;
color: #333333;
background-color: #eee;
width: 1%;
text-align: left;
}
td.DevStatus {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.DevSlave {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.first {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
}
td.last {
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
td.DevStatusCategory {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-width:1px;
border-style:solid;
}
td.DevStatusCollapse {
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
}
td.DevDetails {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
background-color: #eee;
text-align: left;
}
td.DevComment {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
background-color: #eee;
text-align: left;
}
td.Alt {
background-color: #CCCCCC;
}
.legend {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
width: 100px;
max-width: 100px;
text-align:center;
padding: 2px 2px 2px 2px;
height:14px;
white-space:nowrap;
}
.DevStatusBox {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevStatusBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:20px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
.DevSlaveBox {
text-align:center;
height:10px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.DevSlaveBox a {
opacity: 0.85;
border-width:1px;
border-style:solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display:block;
width:90%;
height:10px;
line-height:20px;
margin-left: auto;
margin-right: auto;
}
a.noround {
border-radius: 0px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
position: relative;
margin-top: -8px;
margin-bottom: -8px;
height: 36px;
border-top-width: 0;
border-bottom-width: 0;
}
a.begin {
border-top-width:1px;
position: relative;
margin-top: 0px;
margin-bottom: -7px;
height: 27px;
border-top-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-right-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
}
a.end {
border-bottom-width:1px;
position: relative;
margin-top: -7px;
margin-bottom: 0px;
height: 27px;
border-bottom-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
}
.center_align {
text-align: center;
}
.right_align {
text-align: right;
}
.left_align {
text-align: left;
}
div.BuildWaterfall {
border-radius: 7px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
position: absolute;
left: 0px;
top: 0px;
background-color: #FFFFFF;
padding: 4px 4px 4px 4px;
float: left;
display: none;
border-width: 1px;
border-style: solid;
}
/* LastBuild, BuildStep states */
.success {
color: #FFFFFF;
background-color: #8fdf5f;
border-color: #4F8530;
}
.failure {
color: #FFFFFF;
background-color: #e98080;
border-color: #A77272;
}
.warnings {
color: #FFFFFF;
background-color: #ffc343;
border-color: #C29D46;
}
.never {
color: #FFFFFF;
background-color: #f0f0e0;
border-color: #A77272;
}
.exception, .offline, .retry {
color: #FFFFFF;
background-color: #e0b0ff;
border-color: #ACA0B3;
}
.start,.running, td.building {
color: #666666;
background-color: #fffc6c;
border-color: #C5C56D;
}
.running_failure {
color: #FFFFFF;
background-color: #fffc6c;
border-color: #ff0000;
}
.start {
border-bottom-left-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomleft: 10px;
border-bottom-right-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-moz-border-radius-bottomright: 10px;
}
.notstarted {
border-width:1px;
border-style:solid;
border-color:#aaa;
}
.closed {
background-color: #ff0000;
}
.closed .large {
font-size: 1.5em;
font-weight: bolder;
}
td.Project a:hover, td.start a:hover {
color: #000;
}
.mini-box {
text-align:center;
height:20px;
padding:0 2px;
line-height:0;
white-space:nowrap;
}
.mini-box a {
border-radius: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
display:block;
width:100%;
height:20px;
line-height:20px;
margin-top:-30px;
}
.mini-closed {
-box-sizing:border-box;
-webkit-box-sizing:border-box;
border:4px solid red;
}
/* grid styles */
table.Grid {
border-collapse: collapse;
}
table.Grid tr td {
padding: 0.2em;
margin: 0px;
text-align: center;
}
table.Grid tr td.title {
font-size: 90%;
border-right: 1px gray solid;
border-bottom: 1px gray solid;
}
table.Grid tr td.sourcestamp {
font-size: 90%;
}
table.Grid tr td.builder {
text-align: right;
font-size: 90%;
}
table.Grid tr td.build {
border: 1px gray solid;
}
div.data {
font-family: "Courier New", courier, monotype;
}
span.stdout, span.stderr, span.header {
font-family: "Courier New", courier, monotype;
font-size: 16px;
font-weight: normal;
}
span.stderr {
color: red;
}
span.header {
color: blue;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,199 +0,0 @@
#!/usr/bin/env python
# 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.
def linux():
return [
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Linux64DBG',
'hostname': 'webrtc-cb-linux-slave-1',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Linux32Release',
'hostname': 'webrtc-cb-linux-slave-2',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'ChromeOS',
'hostname': 'webrtc-cb-linux-slave-3',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Linux32DBG',
'hostname': 'webrtc-cb-linux-slave-4',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Linux64Release',
'hostname': 'webrtc-cb-linux-slave-5',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'LinuxMemcheck',
'hostname': 'webrtc-cb-linux-slave-6',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Android',
'hostname': 'webrtc-cb-linux-slave-7',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'LinuxClang',
'hostname': 'webrtc-cb-linux-slave-8',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'Linux64DBG-GCC4.6',
'hostname': 'webrtc-cb-linux-slave-9',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'AndroidNDK',
'hostname': 'webrtc-cb-linux-slave-10',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'LinuxTsan',
'hostname': 'webrtc-cb-linux-slave-15',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'LinuxAsan',
'hostname': 'webrtc-cb-linux-slave-16',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': 'LinuxLargeTests',
'hostname': 'webrtc-build-bot-se',
},
{
'master': 'WebRTC',
'os': 'linux',
'version': 'lucid',
'bits': '64',
'builder': ['LinuxChrome', 'LinuxChromeBloat'],
'hostname': 'webrtc-chrome',
},
]
def mac():
return [
{
'master': 'WebRTC',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'MacOS32DBG',
'hostname': 'dhcp-172-28-249-144',
},
{
'master': 'WebRTC',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'MacOS32Release',
'hostname': 'dhcp-172-28-249-167',
},
{
'master': 'WebRTC',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'MacLargeTests',
'hostname': 'dhcp-172-28-249-168',
},
{
'master': 'WebRTC',
'os': 'mac',
'version': '10.7',
'bits': '64',
'builder': 'MacChrome',
'hostname': 'dhcp-172-28-249-146',
},
]
def windows():
return [
{
'master': 'WebRTC',
'os': 'win',
'version': 'server2008',
'bits': '64',
'builder': 'Win32Debug',
'hostname': 'webrtc-win2k8-1',
},
{
'master': 'WebRTC',
'os': 'win',
'version': 'server2008',
'bits': '64',
'builder': 'Win32Release',
'hostname': 'webrtc-win2k8-2',
},
{
'master': 'WebRTC',
'os': 'win',
'version': 'win7',
'bits': '64',
'builder': 'WinLargeTests',
'hostname': 'webrtc-test-w',
},
{
'master': 'WebRTC',
'os': 'win',
'version': 'win7',
'bits': '64',
'builder': 'WinChrome',
'hostname': 'webrtc-chrome-w',
},
]
slaves = linux() + mac() + windows()

View File

@ -1,136 +0,0 @@
#!/usr/bin/env python
# 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.
__author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)'
"""This script will prune sufficiently old files and empty directories.
The algorithm is to look into the provided directory and delete any files
that is older than x days, recursively. Then all empty directories will be
deleted (we can't look at timestamps there since the act of deleting a file
will refresh the directory's timestamp).
Note: This script has only been tested on Linux.
"""
from optparse import OptionParser
import os
import sys
import time
# The path is considered whitelisted if any of these entries appear
# at some point in the path
WHITELIST = ['buildbot', 'buildbot.tac', 'Makefile', 'master.cfg',
'public_html', 'slaves.cfg', 'state.sqlite', 'twistd.pid']
def is_whitelisted(path):
'''Check if file is whitelisted.
Args:
path: file path.
'''
for entry in WHITELIST:
if entry in path:
return True
return False
def delete_directory(directory):
try:
os.rmdir(directory)
return True
except OSError as exception:
if 'not empty' in str(exception):
# This is normal, ignore it
pass
else:
print >> sys.stderr, ('Could not remove directory %s: reason %s.' %
(directory, exception))
return False
def delete_file(file):
try:
os.remove(file)
except OSError as exception:
print >> sys.stderr, ('Unexpectedly failed to remove file %s: reason %s.' %
(file, exception))
def log_removal(file_or_directory, time_stamp, verbose):
if verbose:
str_stamp = time.strftime('%a, %d %b %Y %H:%M:%S +0000',
time.gmtime(time_stamp))
print 'Removing [%s], stamped on %s' % (file_or_directory, str_stamp)
def remove_old_files_and_directories(path, num_days, verbose, skip_dirs):
'''Removes all files under path that are older than num_days days.
The algorithm also tried to delete all directories, except for those who
contain files that are sufficiently new.
Implementation note: it doesn't make sense to look at timestamps for
directories since their timestamps are updated when a file is deleted.
Args:
path: The starting point.
num_days: days limit for removal.
verbose: print every cmd?
'''
current_time = time.time()
limit = 60 * 60 * 24 * num_days
# Walk bottom-up so directories are deleted in the right order.
for root, directories, files in os.walk(path, topdown=False):
for file in files:
current_file = os.path.join(root, file)
time_stamp = os.stat(current_file).st_mtime
if is_whitelisted(current_file):
continue
if (current_time - time_stamp) > limit:
delete_file(current_file)
log_removal(current_file, time_stamp, verbose)
if not skip_dirs:
for directory in directories:
current_directory = os.path.join(root, directory)
time_stamp = os.stat(current_directory).st_mtime
if delete_directory(current_directory):
log_removal(current_directory, time_stamp, verbose)
def main():
usage = 'usage: %prog -p <base path> -n <number of days> [-q] [-d]'
parser = OptionParser(usage)
parser.add_option('-p', '--path', dest='cleanup_path', help='base directory')
parser.add_option('-n', '--num_days', dest='num_days', help='number of days')
parser.add_option('-q', '--quiet',
action='store_false', dest='verbose', default=True,
help='do not print status messages to stdout')
parser.add_option('-d', '--delete-dirs-too',
action='store_false', dest='skip_dirs', default=True,
help='number of days')
options, unused_args = parser.parse_args()
if not options.cleanup_path:
sys.exit('You must specify base directory')
if not options.num_days:
sys.exit('You must specify number of days old')
if options.verbose:
print 'Cleaning up everything in %s older than %s days' % (
options.cleanup_path, options.num_days)
remove_old_files_and_directories(options.cleanup_path, int(options.num_days),
options.verbose, options.skip_dirs)
if __name__ == '__main__':
main()

View File

@ -1,13 +0,0 @@
#!/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

@ -1,18 +0,0 @@
#!/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

@ -1,8 +0,0 @@
#!/usr/bin/env python
# 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.

View File

@ -1,74 +0,0 @@
#!/usr/bin/env python
# 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.
"""Unit tests for helper functions in utils.py."""
import unittest
from webrtc_buildbot import utils
class Test(unittest.TestCase):
def testGetEnabledTests(self):
tests = {
# Name Linux Mac Windows
'test_1': (True, True, False),
'test_2': (True, False, False),
}
result = utils.GetEnabledTests(tests, 'Linux')
self.assertEqual(2, len(result))
self.assertEqual('test_1', result[0])
self.assertEqual('test_2', result[1])
result = utils.GetEnabledTests(tests, 'Mac')
self.assertEqual(1, len(result))
self.assertEqual('test_1', result[0])
result = utils.GetEnabledTests(tests, 'Windows')
self.assertEqual(0, len(result))
self.assertRaises(utils.UnsupportedPlatformError,
utils.GetEnabledTests, tests, 'BeOS')
def testEmptyListExitQuietly(self):
factory = utils.WebRTCFactory()
self.assertEqual([], factory._WrapLongLines([]))
def testShortLinesShallNotWrap(self):
factory = utils.WebRTCFactory()
self.assertEqual(['a'], factory._WrapLongLines(['a']))
string_25_len = '12345678901234567890123_5'
result = factory._WrapLongLines([string_25_len, string_25_len])
self.assertEqual(string_25_len, result[0])
self.assertEqual(string_25_len, result[1])
def testLinesWithMoreThan25CharactersWithNoWrapCharacterIsUnchanged(self):
factory = utils.WebRTCFactory()
string_26_len = '12345678901234567890123456'
result = factory._WrapLongLines([string_26_len, string_26_len])
self.assertEqual(string_26_len, result[0])
self.assertEqual(string_26_len, result[1])
def testLinesWithMoreThan25CharactersShallWrapOnWrapCharacter(self):
factory = utils.WebRTCFactory()
string_26_len = '123456789012345678901234_6'
test_list = [string_26_len, string_26_len]
result = factory._WrapLongLines(test_list)
expected_result = '123456789012345678901234 _6'
self.assertEqual(expected_result, result[0])
self.assertEqual(expected_result, result[1])
# Verify the original test_list was not modified too.
self.assertEqual(string_26_len, test_list[0])
self.assertEqual(string_26_len, test_list[1])
if __name__ == '__main__':
unittest.main()

View File

@ -1,57 +0,0 @@
#!/usr/bin/env python
# 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.
"""Utility class to build Chromium with the latest WebRTC.
Based on chromium_factory.py and adds WebRTC-specific custom_deps."""
from master.factory import chromium_factory
from webrtc_buildbot import webrtc_commands
class ChromiumWebRTCFactory(chromium_factory.ChromiumFactory):
# gclient additional custom deps
CUSTOM_DEPS_WEBRTC_LATEST = ('src/third_party/webrtc',
'http://webrtc.googlecode.com/svn/stable/src')
def ChromiumWebRTCLatestFactory(self, target='Release', clobber=False,
tests=None, mode=None,
slave_type='BuilderTester', options=None,
compile_timeout=1200, build_url=None,
project=None, factory_properties=None,
custom_deps_list=[]):
custom_deps_list.append(self.CUSTOM_DEPS_WEBRTC_LATEST)
self._solutions[0].custom_deps_list = custom_deps_list
factory = self.ChromiumFactory(target, clobber, tests, mode, slave_type,
options, compile_timeout, build_url, project,
factory_properties)
webrtc_cmd_obj = webrtc_commands.WebRTCCommands(factory, target,
self._build_dir,
self._target_platform)
webrtc_cmd_obj.AddCompilePeerConnectionServerStep()
webrtc_cmd_obj.AddPyAutoTests(factory_properties)
return factory
def ChromiumWebRTCBloatFactory(self, target='Release', clobber=False,
tests=None, mode=None,
slave_type='BuilderTester', options=None,
compile_timeout=1200, build_url=None,
project=None, factory_properties=None,
custom_deps_list=[]):
custom_deps_list.append(self.CUSTOM_DEPS_WEBRTC_LATEST)
self._solutions[0].custom_deps_list = custom_deps_list
factory = self.ChromiumFactory(target, clobber, tests, mode, slave_type,
options, compile_timeout, build_url, project,
factory_properties)
webrtc_cmd_obj = webrtc_commands.WebRTCCommands(factory, target,
self._build_dir,
self._target_platform)
webrtc_cmd_obj.AddBloatCalculationStep(factory_properties)
return factory

View File

@ -1,145 +0,0 @@
#!/usr/bin/env python
# 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.
"""Set of utilities to add commands to a buildbot factory.
This is based on chromium_commands.py and adds WebRTC-specific commands."""
from buildbot.steps.shell import ShellCommand
from master.factory import chromium_commands
from master.log_parser import cl_command
from webrtc_buildbot import utils
DEFAULT_BLOAT_DIR = '/var/www/bloat'
DEFAULT_BLOAT_URL = 'http://webrtc-chrome.lul/bloat/webrtc_bloat.html'
class PlatformNotSupportedException(Exception): pass
class MissingGypDefineException(Exception): pass
class WebRTCCommands(chromium_commands.ChromiumCommands):
"""Encapsulates methods to add WebRTC commands to a buildbot factory."""
def __init__(self, factory=None, target=None, build_dir=None,
target_platform=None, target_arch=None):
chromium_commands.ChromiumCommands.__init__(self, factory, target,
build_dir, target_platform)
self._arch = target_arch
self._factory = factory
def AddPyAutoTests(self, factory_properties=None, timeout=1200):
"""Adds WebRTC PyAuto test steps."""
# The WEBRTC group lists the PyAuto tests we have written for WebRTC.
# It's located at: src/chrome/test/functional/PYAUTO_TESTS
self.AddPyAutoFunctionalTest('WebRTC functional PyAuto test',
suite='WEBRTC', timeout=timeout, perf=False,
factory_properties=factory_properties)
def AddCompilePeerConnectionServerStep(self):
# Add platform dependent peerconnection_server compilation:
solution = None
options = None
if self._target_platform.startswith('linux'):
options=['peerconnection_server']
elif self._target_platform.startswith('win'):
solution=r'..\third_party\libjingle\libjingle.sln;peerconnection_server'
elif self._target_platform is 'mac':
options=['--', '-project', '../third_party/libjingle/libjingle.xcodeproj',
'-target', 'peerconnection_server'],
else:
raise PlatformNotSupportedException(
'Platform "%s" is not currently supported.' % self._target_platform)
self.AddCompileStep(solution=solution,
options=options,
description='compiling peerconnection_server',
descriptionDone='compile peerconnection_server')
def AddBloatCalculationStep(self, factory_properties):
"""Runs a bloat calculation, which will yield a size breakdown for Chrome.
If running in Release mode, you should also run with profiling to get the
symbols right. Running this on Debug mode will work but it will probably
take hours.
This step command is only supported on Linux platforms.
"""
if self._target is 'Release':
factory = factory_properties
if not (factory.has_key('gclient_env') and
factory['gclient_env'].has_key('GYP_DEFINES') and
factory['gclient_env']['GYP_DEFINES'].find('profiling=1') != -1):
raise MissingGypDefineException(
'You must add a dictionary to the gclient_env factory property'
'containing a key GYP_DEFINES and a value containing profiling=1.')
bloat_path = self.PathJoin(utils.WEBRTC_BUILD_DIR, '..', '..', '..', '..',
'..', '..', 'build_internal', 'symsrc',
'calculate_bloat.py')
output_filename = self.PathJoin(DEFAULT_BLOAT_DIR, 'bloat_latest.json')
chrome_binary = self.PathJoin('out', self._target, 'chrome')
cmd = [bloat_path, '--binary', chrome_binary, '--source-path', '.',
'--output-file', output_filename]
self._factory.addStep(ShellCommandWithUrl(command=cmd,
url=DEFAULT_BLOAT_URL,
description='calculate bloat',
warnOnFailure=True,
workdir='build/src',
timeout=7200))
def AddTestStep(self, command_class, test_name, test_command,
test_description='', timeout=10*60, max_time=8*60*60,
workdir=None, env=None, locks=None, halt_on_failure=False,
do_step_if=True):
"""This override is a hack to get the step to warn instead of failing."""
assert timeout <= max_time
do_step_if = do_step_if or self.TestStepFilter
self._factory.addStep(
command_class,
name=test_name,
timeout=timeout,
maxTime=max_time,
doStepIf=do_step_if,
workdir=workdir,
env=env,
description='running %s%s' % (test_name, test_description),
descriptionDone='%s%s' % (test_name, test_description),
haltOnFailure=halt_on_failure,
warnOnFailure=True,
flunkOnFailure=False,
command=test_command)
def AddCompileStep(self, solution, clobber=False, description='compiling',
descriptionDone='compile', timeout=600, mode=None,
options=None):
"""This override is a hack to get the step to warn instead of failing."""
self._factory.addStep(cl_command.CLCommand,
enable_warnings=0,
timeout=timeout,
description=description,
descriptionDone=descriptionDone,
warnOnFailure=True,
flunkOnFailure=False,
command=self.GetBuildCommand(clobber,
solution,
mode,
options))
class ShellCommandWithUrl(ShellCommand):
"""A regular shell command which posts a link when it's done."""
def __init__(self, url, **kwargs):
ShellCommand.__init__(self, **kwargs)
self.addFactoryArguments(url=url)
self.url = url
def createSummary(self, log):
self.addURL('click here', self.url)

View File

@ -1,164 +0,0 @@
#!/usr/bin/env python
# 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 file is based on the Chromium config.py located at
# /trunk/tools/build/site_config/config_default.py of the Chromium tools.
import socket
class Master(object):
# Repository URLs used by the SVNPoller and 'gclient config'.
webrtc_root_url = 'http://webrtc.googlecode.com/svn'
# Leave Chromium's server URL intact, since we also build Chrome.
server_url = 'http://src.chromium.org'
git_server_url = 'http://src.chromium.org/git'
repo_root = '/svn'
# External repos.
googlecode_url = 'http://%s.googlecode.com/svn'
sourceforge_url = 'http://%(repo)s.svn.sourceforge.net/svnroot/%(repo)s'
# Directly fetches from anonymous webkit svn server.
webkit_root_url = 'http://svn.webkit.org/repository/webkit'
nacl_trunk_url = 'http://src.chromium.org/native_client/trunk'
llvm_url = 'http://llvm.org/svn/llvm-project'
# Other non-redistributable repositories.
repo_root_internal = None
trunk_internal_url = None
trunk_internal_url_src = None
gears_url_internal = None
o3d_url_internal = None
nacl_trunk_url_internal = None
nacl_url_internal = None
syzygy_internal_url = None
# Other non-redistributable repositories.
repo_root_internal = None
trunk_internal_url = None
trunk_internal_url_src = None
# Please change this accordingly.
master_domain = 'webrtc.org'
permitted_domains = ('webrtc.org',)
# Your smtp server to enable mail notifications.
smtp = 'smtp'
# By default, bot_password will be filled in by config.GetBotPassword();
# if the private config wants to override this, it can do so.
bot_password = None
class _Base(object):
# Master address. You should probably copy this file in another svn repo
# so you can override this value on both the slaves and the master.
master_host = 'webrtc-cb-linux-master.cbf.corp.google.com'
# If set to True, the master will do nasty stuff like closing the tree,
# sending emails or other similar behaviors. Don't change this value unless
# you modified the other settings extensively.
is_production_host = socket.getfqdn() == master_host
# Additional email addresses to send gatekeeper (automatic tree closage)
# notifications. Unnecessary for experimental masters and try servers.
tree_closing_notification_recipients = []
# 'from:' field for emails sent from the server.
from_address = 'webrtc-cb-watchlist@google.com'
# Code review site to upload results. You should setup your own Rietveld
# instance with the code at
# http://code.google.com/p/rietveld/source/browse/#svn/branches/chromium
# You can host your own private rietveld instance on Django, see
# http://code.google.com/p/google-app-engine-django and
# http://code.google.com/appengine/articles/pure_django.html
code_review_site = 'https://webrtc-codereview.appspot.com/status_listener'
# For the following values, they are used only if non-0. Do not set them
# here, set them in the actual master configuration class.
# Used for the waterfall URL and the waterfall's WebStatus object.
master_port = 0
# Which port slaves use to connect to the master.
slave_port = 0
# The alternate read-only page. Optional.
master_port_alt = 0
# HTTP port for try jobs.
try_job_port = 0
## Chrome related
class _ChromiumBase(_Base):
# Tree status urls. You should fork the code from tools/chromium-status/ and
# setup your own AppEngine instance (or use directly Django to create a
# local instance).
# Defaulting urls that are used to POST data to 'localhost' so a local dev
# server can be used for testing and to make sure nobody updates the tree
# status by error!
#
# This url is used for HttpStatusPush:
base_app_url = 'http://localhost:8080'
# HTTP url that should return 0 or 1, depending if the tree is open or
# closed. It is also used as POST to update the tree status.
tree_status_url = base_app_url + '/status'
# Used by LKGR to POST data.
store_revisions_url = base_app_url + '/revisions'
# Used by the try server to sync to the last known good revision:
last_good_url = 'http://webrtc-dashboard.appspot.com/lkgr'
class WebRTC(_ChromiumBase):
# Used by the waterfall display.
project_name = 'WebRTC'
master_port = 8010
slave_port = 9112
master_port_alt = 9014
class WebRTCMemory(_ChromiumBase):
project_name = 'WebRTC Memory'
master_port = 9014
slave_port = 9119
master_port_alt = 9047
class WebRTCPerf(_ChromiumBase):
project_name = 'WebRTC Perf'
master_port = 9050
slave_port = 9151
master_port_alt = 9052
class TryServer(_ChromiumBase):
project_name = 'WebRTC Try Server'
master_port = 9010
slave_port = 9113
master_port_alt = 9015
try_job_port = 9018
# The svn repository to poll to grab try patches. For chrome, we use a
# separate repo to put all the diff files to be tried.
svn_url = None
class Libvpx(_ChromiumBase):
# Used by the waterfall display.
project_name = 'libvpx'
master_port = 8011
slave_port = 9114
master_port_alt = 9016
class Archive(object):
archive_host = 'localhost'
# Skip any filenames (exes, symbols, etc.) starting with these strings
# entirely, typically because they're not built for this distribution.
exes_to_skip_entirely = []
# Web server base path.
www_dir_base = "\\\\" + archive_host + "\\www\\"
@staticmethod
def Internal():
pass
class Distributed(object):
"""Not much to describe."""

View File

@ -1,88 +0,0 @@
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# 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.
__author__ = 'phoglund@webrtc.org (Patrik Höglund)'
import os
import sys
import subprocess
from optparse import OptionParser
"""Computes a webtreemap-compatible bloat .json file for a binary.
This will produce an overview of the binary which shows the sizes of its
constituent parts. The binary should be built with -g for symbols. If building
Chrome, you must include profiling=1 if building in Release mode.
This script only runs on Linux. It requires the nm utility (part of the binutils
package) as well as the bloat.py script. It can run from any working directory.
"""
THIS_SCRIPTS_PATH = os.path.dirname(os.path.realpath(__file__))
BLOAT_SCRIPT = THIS_SCRIPTS_PATH + '/../../../third_party/bloat/bloat.py'
def _run_nm(binary):
raw_nm_filename = 'nm.out'
raw_nm_file = open(raw_nm_filename, 'w')
subprocess.check_call(['nm', '-C', '-S', '-l', binary], stdout=raw_nm_file)
raw_nm_file.close()
return raw_nm_filename
def _run_bloat(raw_nm_filename, source_path, output_filename):
json_file = open(output_filename, 'w')
subprocess.check_call([BLOAT_SCRIPT,
'--strip-prefix=%s' % source_path,
'--nm-output=%s' % raw_nm_filename,
'syms'], stdout=json_file, stderr=None)
json_file.close()
def main():
if not os.path.exists(BLOAT_SCRIPT):
return 'Missing required dependency bloat (looked in %s).' % BLOAT_SCRIPT
usage = 'usage: %prog -b <binary> -s <path to source> -o <output JSON file>'
parser = OptionParser(usage)
parser.add_option('-b', '--binary', dest='binary', default=False,
help='Binary to run the bloat calculation on. ' +
'The binary should be built with -g for symbols.')
parser.add_option('-s', '--source-path', dest='source_path', default=False,
help='Where the binary\'s source code is.')
parser.add_option('-o', '--output-file', dest='output_file', default=False,
help='Where to put the resulting JSON file.')
options, unused_args = parser.parse_args()
if not options.binary:
return '%s\n\nYou must specify the binary to run on.' % usage
if not options.output_file:
return '%s\n\nYou must specify where to put the output file.' % usage
if not options.source_path:
return '%s\n\nYou must specify the binary\'s source code path.' % usage
if not os.path.exists(options.binary):
return 'Binary %s does not exist.' % options.binary
if not os.path.exists(options.source_path):
return 'Source path %s does not exist.' % options.source_path
# Convert the source path to an absolute path. The ending slash is important
# for --strip-prefix later!
options.source_path = os.path.realpath(options.source_path) + '/'
raw_nm_filename = _run_nm(options.binary)
_run_bloat(raw_nm_filename, options.source_path, options.output_file)
os.remove(raw_nm_filename)
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -1,50 +0,0 @@
#!/usr/bin/env python
# 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.
__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
"""Clean up a build by removing just compile output or everything (nuke).
This script assumes the trunk directory is located directly below the current
working directory.
"""
from optparse import OptionParser
import sys
from common import chromium_utils
def main():
usage = 'usage: %prog [--nuke]'
parser = OptionParser(usage)
parser.add_option('-n', '--nuke',
action='store_true', dest='nuke', default=False,
help='Nuke whole repository (not just build output)')
options, unused_args = parser.parse_args()
if options.nuke:
chromium_utils.RemoveDirectory('trunk')
else:
# Remove platform specific build output directories.
if chromium_utils.IsWindows():
chromium_utils.RemoveDirectory('trunk\\build\\Debug')
chromium_utils.RemoveDirectory('trunk\\build\\Release')
elif chromium_utils.IsMac():
chromium_utils.RemoveDirectory('trunk/out')
chromium_utils.RemoveDirectory('trunk/xcodebuild')
elif chromium_utils.IsLinux():
chromium_utils.RemoveDirectory('trunk/out')
else:
print 'Unknown platform: ' + sys.platform
return 1
return 0
if '__main__' == __name__:
sys.exit(main())

View File

@ -1,44 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<!--
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 HTML file displays the WebRTC bloat calculation. Some code here
is based on the webtreemap demo file. Copy this file to wherever
calculate_bloat.py writes its output .json file (which should be named
bloat_latest.json) and it will automatically display the .json file.
-->
<head>
<title>WebRTC Binary Size Tracker</title>
<link rel="stylesheet" href="webtreemap.css">
<script src="webtreemap.js" type="text/javascript"></script>
<script src="bloat_latest.json" type="text/javascript"></script>
<style type="text/css">
#map {
width: 500px;
height: 300px;
position: relative;
cursor: pointer;
-webkit-user-select: none;
}
</style>
</head>
<body>
<h1>WebRTC Binary Size Tracker</h1>
<p>Click on a box to zoom in. Click on the outermost box to zoom out.</p>
<div id="map"></div>
<script type="text/javascript">
// The kTree variable is defined by bloat_latest.json.
var map = document.getElementById("map");
appendTreemap(map, kTree);
</script>
</body>
</html>

View File

@ -1,8 +0,0 @@
#!/usr/bin/env python
# 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.

View File

@ -1,66 +0,0 @@
#!/usr/bin/env python
# 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.
__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
"""Contains a customized GClient class for WebRTC use.
It is essential that this class is imported after the chromium_commands so it
can overwrite its registration of the 'gclient' command.
This should by done by adding:
from webrtc_buildbot import slave_utils
into the buildbot.tac file of the try slave.
"""
from slave import chromium_commands
try:
# Buildbot 0.8.x
# Unable to import 'XX'
# pylint: disable=F0401
from buildslave.commands.registry import commandRegistry
except ImportError:
# Buildbot 0.7.12
# Unable to import 'XX'
# pylint: disable=E0611,E1101,F0401
from buildbot.slave.registry import registerSlaveCommand
class GClient(chromium_commands.GClient):
def doPatch(self, res):
# For some unknown reason, the patch tuple recieved only have two items:
# the patch level and the actual diff contents. The third optional root
# argument that tells which base directory to use for the patch is not
# included. Since we need this to be able to patch properly in WebRTC, we'll
# just create a new tuple with this added.
self.patch = (self.patch[0], self.patch[1], 'trunk')
return chromium_commands.GClient.doPatch(self, res)
def RegisterGclient():
try:
# This version should work on BB 8.3
# We run this code in a try because it fails with an assertion if
# the module is loaded twice.
commandRegistry['gclient'] = 'webrtc_buildbot.slave_utils.GClient'
return
except (AssertionError, NameError):
pass
try:
# This version should work on BB 7.12
# We run this code in a try because it fails with an assertion if
# the module is loaded twice.
registerSlaveCommand('gclient', GClient, commands.command_version)
except (AssertionError, NameError):
pass
RegisterGclient()

View File

@ -1,64 +0,0 @@
#!/usr/bin/env python
# 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.
import os
import sys
def main():
"""
Performs changes after checkout needed for WebRTC buildbot customizations.
This script performs the following tasks:
- Adds an import of the WebRTC slave_utils module in the buildbot.tac file.
It will add a comment and the import at the end of the file, if it's not
already present.
- Removes the slaves.cfg for the Libvpx waterfall on Windows platforms, since
symbolic links are not available on this platform and the resulting link
file causes a parsing error in Python when loaded during slave startup.
Using this script, we don't need to maintain our own version of the slave
scripts and can automatically stay up to date with their changes.
This script should be invoked as a hooks step in the DEPS file, like this:
hooks = [
{
# Update slave buildbot.tac to include WebRTC slave_utils import.
"pattern": ".",
"action": ["python", "tools/fix_webrtc_buildbots.py"],
},
]
"""
SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__))
# Patch buildbot.tac.
TARGET_FILE = os.path.join(SCRIPT_PATH,
'continuous_build/build/slave/buildbot.tac')
COMMENT_LINE = '# Load WebRTC custom slave script.\n'
IMPORT_LINE = 'from webrtc_buildbot import slave_utils\n'
file = open(TARGET_FILE, 'r')
if file.read().find(IMPORT_LINE) == -1:
print 'Patching %s with WebRTC imports.' % TARGET_FILE
file.close()
file = open(TARGET_FILE, 'a')
file.write(COMMENT_LINE)
file.write(IMPORT_LINE)
file.close()
# Remove Libvpx waterfall's slaves.cfg on Windows.
if sys.platform.startswith('win'):
slave_cfg = os.path.join(SCRIPT_PATH, ('continuous_build/build_internal/'
'masters/master.libvpx/slaves.cfg'))
if os.path.exists(slave_cfg):
os.remove(slave_cfg)
print 'Removed %s for Libvpx waterfall on Windows.' % slave_cfg
if __name__ == '__main__':
main()