summaryrefslogtreecommitdiffstats
path: root/Tools/BuildSlaveSupport/build.webkit.org-config
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/BuildSlaveSupport/build.webkit.org-config')
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/Makefile19
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/README2
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/buildbot.tac21
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/config.json258
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg567
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/buildbot.css382
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css524
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/robots.txt13
-rwxr-xr-xTools/BuildSlaveSupport/build.webkit.org-config/templates/root.html24
9 files changed, 1810 insertions, 0 deletions
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/Makefile b/Tools/BuildSlaveSupport/build.webkit.org-config/Makefile
new file mode 100644
index 0000000..bd5e749
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/Makefile
@@ -0,0 +1,19 @@
+# -*- makefile -*-
+
+# This is a simple makefile which lives in a buildmaster/buildslave
+# directory (next to the buildbot.tac file). It allows you to start/stop the
+# master or slave by doing 'make start' or 'make stop'.
+
+# The 'reconfig' target will tell a buildmaster to reload its config file.
+
+start:
+ /opt/local/bin/twistd2.5 --no_save -y buildbot.tac
+
+stop:
+ kill `cat twistd.pid`
+
+reconfig:
+ kill -HUP `cat twistd.pid`
+
+log:
+ tail -f twistd.log
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/README b/Tools/BuildSlaveSupport/build.webkit.org-config/README
new file mode 100644
index 0000000..3ba8a22
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/README
@@ -0,0 +1,2 @@
+Note: This directory is *not* automatically synchronized with Subversion via a post-commit hook.
+Any changes made to code within this directory will need to be manually pushed to build.webkit.org.
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/buildbot.tac b/Tools/BuildSlaveSupport/build.webkit.org-config/buildbot.tac
new file mode 100644
index 0000000..1a53acf
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/buildbot.tac
@@ -0,0 +1,21 @@
+
+from twisted.application import service
+from buildbot.master import BuildMaster
+
+basedir = r'/buildbot/webkit'
+configfile = r'master.cfg'
+rotateLength = 1000000
+maxRotatedFiles = None
+
+application = service.Application('buildmaster')
+try:
+ from twisted.python.logfile import LogFile
+ from twisted.python.log import ILogObserver, FileLogObserver
+ logfile = LogFile.fromFullPath("twistd.log", rotateLength=rotateLength,
+ maxRotatedFiles=maxRotatedFiles)
+ application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
+except ImportError:
+ # probably not yet twisted 8.2.0 and beyond, can't set log yet
+ pass
+BuildMaster(basedir, configfile).setServiceParent(application)
+
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/config.json b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
new file mode 100644
index 0000000..19d7535
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
@@ -0,0 +1,258 @@
+{
+ "slaves": [ { "name": "test-slave", "platform": "*" },
+
+ { "name": "apple-xserve-1", "platform": "mac-leopard" },
+ { "name": "apple-xserve-2", "platform": "mac-leopard" },
+ { "name": "apple-xserve-3", "platform": "mac-leopard" },
+
+ { "name": "apple-xserve-4", "platform": "mac-snowleopard" },
+ { "name": "apple-xserve-5", "platform": "mac-snowleopard" },
+ { "name": "apple-xserve-6", "platform": "mac-snowleopard" },
+ { "name": "apple-xserve-7", "platform": "mac-snowleopard" },
+
+ { "name": "apple-pixel-1", "platform": "mac-leopard" },
+
+ { "name": "apple-macpro-1", "platform": "mac-snowleopard" },
+ { "name": "apple-macpro-2", "platform": "mac-snowleopard" },
+ { "name": "apple-macpro-3", "platform": "mac-snowleopard" },
+ { "name": "apple-macpro-4", "platform": "mac-leopard" },
+ { "name": "apple-macpro-5", "platform": "mac-leopard" },
+ { "name": "apple-macpro-6", "platform": "mac-leopard" },
+
+ { "name": "apple-windows-1", "platform": "win"},
+ { "name": "apple-windows-2", "platform": "win"},
+ { "name": "apple-windows-3", "platform": "win"},
+ { "name": "apple-windows-4", "platform": "win"},
+ { "name": "apple-windows-5", "platform": "win"},
+ { "name": "apple-windows-6", "platform": "win"},
+ { "name": "apple-windows-7", "platform": "win"},
+ { "name": "apple-windows-8", "platform": "win"},
+ { "name": "apple-windows-9", "platform": "win"},
+ { "name": "apple-windows-10", "platform": "win"},
+ { "name": "apple-windows-11", "platform": "win"},
+ { "name": "apple-windows-12", "platform": "win"},
+ { "name": "apple-windows-13", "platform": "win"},
+ { "name": "apple-windows-14", "platform": "win"},
+ { "name": "apple-windows-15", "platform": "win"},
+
+ { "name": "gtk-linux-slave-1", "platform": "gtk"},
+ { "name": "gtk-linux-slave-2", "platform": "gtk"},
+ { "name": "gtk-linux-slave-3", "platform": "gtk"},
+ { "name": "gtk-linux-slave-4", "platform": "gtk"},
+
+ { "name": "szeged-linux-1", "platform": "qt"},
+ { "name": "szeged-linux-2", "platform": "qt"},
+ { "name": "szeged-linux-3", "platform": "qt"},
+ { "name": "szeged-linux-4", "platform": "qt"},
+
+ { "name": "szeged-windows-1", "platform": "qt"},
+ { "name": "szeged-windows-2", "platform": "qt"},
+
+ { "name": "google-windows-1", "platform": "chromium-win" },
+ { "name": "google-mac-1", "platform": "chromium-mac" },
+ { "name": "google-linux-1", "platform": "chromium-linux" },
+ { "name": "google-windows-2", "platform": "chromium-win" },
+ { "name": "google-mac-2", "platform": "chromium-mac" },
+ { "name": "google-linux-2", "platform": "chromium-linux" },
+ { "name": "google-new-tests", "platform": "mac-leopard" },
+
+ { "name": "wincairo-1", "platform": "wincairo" },
+
+ { "name": "efl-linux-slave-1", "platform": "efl" }
+ ],
+
+ "builders": [ { "name": "Leopard Intel Release (Build)", "type": "Build", "builddir": "leopard-intel-release",
+ "platform": "mac-leopard", "configuration": "release", "architectures": ["i386"],
+ "triggers": ["leopard-intel-release-tests"],
+ "slavenames": ["apple-xserve-1", "apple-xserve-2", "test-slave"]
+ },
+ { "name": "Leopard Intel Release (Tests)", "type": "Test", "builddir": "leopard-intel-release-tests",
+ "platform": "mac-leopard", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["apple-macpro-4", "apple-pixel-1", "test-slave"]
+ },
+
+ { "name": "Leopard Intel Debug (Build)", "type": "Build", "builddir": "leopard-intel-debug",
+ "platform": "mac-leopard", "configuration": "debug", "architectures": ["i386"],
+ "triggers": ["leopard-intel-debug-tests"],
+ "slavenames": ["apple-xserve-1", "apple-xserve-2", "test-slave"]
+ },
+ { "name": "Leopard Intel Debug (Tests)", "type": "Test", "builddir": "leopard-intel-debug-tests",
+ "platform": "mac-leopard", "configuration": "debug", "architectures": ["i386"],
+ "slavenames": ["apple-xserve-3", "test-slave", "apple-macpro-5", "apple-macpro-6"]
+ },
+ { "name": "SnowLeopard Intel Release (Build)", "type": "Build", "builddir": "snowleopard-intel-release",
+ "platform": "mac-snowleopard", "configuration": "release", "architectures": ["x86_64"],
+ "triggers": ["snowleopard-intel-release-tests", "snowleopard-intel-release-tests-wk2"],
+ "slavenames": ["apple-xserve-4", "test-slave"]
+ },
+ { "name": "SnowLeopard Intel Release (Tests)", "type": "Test", "builddir": "snowleopard-intel-release-tests",
+ "platform": "mac-snowleopard", "configuration": "release", "architectures": ["x86_64"],
+ "slavenames": ["apple-xserve-5", "apple-xserve-6", "test-slave"]
+ },
+ { "name": "SnowLeopard Intel Leaks", "type": "BuildAndTestLeaks", "builddir": "snowleopard-intel-leaks",
+ "platform": "mac-snowleopard", "configuration": "debug", "architectures": ["x86_64"],
+ "slavenames": ["apple-macpro-1", "apple-macpro-3", "test-slave"]
+ },
+ { "name": "SnowLeopard Intel Release (WebKit2 Tests)", "type": "TestWebKit2", "builddir": "snowleopard-intel-release-tests-wk2",
+ "platform": "mac-snowleopard", "configuration": "release", "architectures": ["x86_64"],
+ "slavenames": ["apple-xserve-7", "test-slave"]
+ },
+ {
+ "name": "Windows Release (Build)", "type": "Build", "builddir": "win-release",
+ "platform": "win", "configuration": "release", "architectures": ["i386"],
+ "triggers": ["win-release-tests", "win-release-tests-wk2"],
+ "slavenames": ["apple-windows-2", "test-slave"]
+ },
+ {
+ "name": "Windows 7 Release (Tests)", "type": "Test", "builddir": "win-release-tests",
+ "platform": "win", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["apple-windows-5", "apple-windows-6", "apple-windows-11", "apple-windows-12", "test-slave"]
+ },
+ {
+ "name": "Windows Debug (Build)", "type": "Build", "builddir": "win-debug",
+ "platform": "win", "configuration": "debug", "architectures": ["i386"],
+ "triggers": ["win-debug-tests"],
+ "slavenames": ["apple-windows-1", "test-slave"]
+ },
+ {
+ "name": "Windows XP Debug (Tests)", "type": "Test", "builddir": "win-debug-tests",
+ "platform": "win", "configuration": "debug", "architectures": ["i386"],
+ "slavenames": ["apple-windows-3", "apple-windows-4", "apple-windows-13", "apple-windows-14", "apple-windows-15", "test-slave"]
+ },
+ { "name": "Windows 7 Release (WebKit2 Tests)", "type": "TestWebKit2", "builddir": "win-release-tests-wk2",
+ "platform": "win", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["apple-windows-7", "apple-windows-8", "apple-windows-9", "apple-windows-10", "test-slave"]
+ },
+ {
+ "name": "GTK Linux 32-bit Release", "type": "BuildAndTest", "builddir": "gtk-linux-32-release",
+ "platform": "gtk", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["gtk-linux-slave-1"]
+ },
+ {
+ "name": "GTK Linux 32-bit Debug", "type": "BuildAndTest", "builddir": "gtk-linux-32-debug",
+ "platform": "gtk", "configuration": "debug", "architectures": ["i386"],
+ "slavenames": ["gtk-linux-slave-2"]
+ },
+ {
+ "name": "GTK Linux 64-bit Debug", "type": "BuildAndTest", "builddir": "gtk-linux-64-debug",
+ "platform": "gtk", "configuration": "debug", "architectures": ["x86_64"],
+ "slavenames": ["gtk-linux-slave-3"]
+ },
+ {
+ "name": "GTK Linux 64-bit Release", "type": "BuildAndTest", "builddir": "gtk-linux-64-release",
+ "platform": "gtk", "configuration": "release", "architectures": ["x86_64"],
+ "slavenames": ["gtk-linux-slave-4"]
+ },
+ {
+ "name": "Qt Linux Release", "type": "BuildAndTest", "builddir": "qt-linux-release",
+ "platform": "qt", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["szeged-linux-1"]
+ },
+ {
+ "name": "Qt Linux Release minimal", "type": "Build", "builddir": "qt-linux-release-minimal",
+ "platform": "qt", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["szeged-linux-2"]
+ },
+ {
+ "name": "Qt Linux ARMv5 Release", "type": "Build", "builddir": "qt-linux-armv5-release",
+ "platform": "qt", "configuration": "release", "architectures": ["armv5"],
+ "slavenames": ["szeged-linux-3"]
+ },
+ {
+ "name": "Qt Linux ARMv7 Release", "type": "Build", "builddir": "qt-linux-armv7-release",
+ "platform": "qt", "configuration": "release", "architectures": ["armv7"],
+ "slavenames": ["szeged-linux-4"]
+ },
+ {
+ "name": "Qt Windows 32-bit Release", "type": "Build", "builddir": "qt-windows-32bit-release",
+ "platform": "qt", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["szeged-windows-1"]
+ },
+ {
+ "name": "Qt Windows 32-bit Debug", "type": "Build", "builddir": "qt-windows-32bit-debug",
+ "platform": "qt", "configuration": "debug", "architectures": ["i386"],
+ "slavenames": ["szeged-windows-2"]
+ },
+ {
+ "name": "Chromium Win Release", "type": "Build", "builddir": "chromium-win-release",
+ "platform": "chromium-win", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-windows-1"]
+ },
+ {
+ "name": "Chromium Mac Release", "type": "Build", "builddir": "chromium-mac-release",
+ "platform": "chromium-mac", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-mac-1"]
+ },
+ {
+ "name": "Chromium Linux Release", "type": "Build", "builddir": "chromium-linux-release",
+ "platform": "chromium-linux", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-linux-1"]
+ },
+ {
+ "name": "Chromium Win Release (Tests)", "type": "NewBuildAndTest", "builddir": "chromium-win-release-tests",
+ "platform": "chromium-win", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-windows-2"]
+ },
+ {
+ "name": "Chromium Mac Release (Tests)", "type": "NewBuildAndTest", "builddir": "chromium-mac-release-tests",
+ "platform": "chromium-mac", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-mac-2"]
+ },
+ {
+ "name": "Chromium Linux Release (Tests)", "type": "NewBuildAndTest", "builddir": "chromium-linux-release-tests",
+ "platform": "chromium-linux", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-linux-2"]
+ },
+ {
+ "name": "New run-webkit-tests", "type": "NewBuildAndTest", "builddir": "google-new-tests",
+ "platform": "mac-leopard", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["google-new-tests"]
+ },
+ {
+ "name": "WinCairo Debug (Build)", "type": "Build", "builddir": "win-cairo-debug",
+ "platform": "wincairo", "configuration": "debug", "architectures": ["i386"],
+ "slavenames": ["wincairo-1"]
+ },
+ {
+ "name": "EFL Linux Release (Build)", "type": "Build", "builddir": "efl-linux-release",
+ "platform": "efl", "configuration": "release", "architectures": ["i386"],
+ "slavenames": ["efl-linux-slave-1"]
+ }
+ ],
+
+ "schedulers": [ { "type": "AnyBranchScheduler", "name": "trunk", "change_filter": "trunk_filter", "treeStableTimer": 45.0,
+ "builderNames": ["Leopard Intel Release (Build)", "Leopard Intel Debug (Build)",
+ "SnowLeopard Intel Release (Build)", "SnowLeopard Intel Leaks",
+ "GTK Linux 32-bit Release", "GTK Linux 32-bit Debug", "GTK Linux 64-bit Debug", "GTK Linux 64-bit Release",
+ "Qt Linux Release", "Qt Linux Release minimal", "Qt Linux ARMv5 Release", "Qt Linux ARMv7 Release",
+ "Qt Windows 32-bit Release", "Qt Windows 32-bit Debug",
+ "Chromium Win Release", "Chromium Mac Release", "Chromium Linux Release",
+ "Chromium Win Release (Tests)", "Chromium Mac Release (Tests)", "Chromium Linux Release (Tests)",
+ "WinCairo Debug (Build)", "EFL Linux Release (Build)"]
+ },
+ { "type": "PlatformSpecificScheduler", "platform": "win", "branch": "trunk", "treeStableTimer": 45.0,
+ "builderNames": ["Windows Release (Build)", "Windows Debug (Build)"]
+ },
+ { "type": "Triggerable", "name": "leopard-intel-release-tests",
+ "builderNames": ["Leopard Intel Release (Tests)"]
+ },
+ { "type": "Triggerable", "name": "leopard-intel-debug-tests",
+ "builderNames": ["Leopard Intel Debug (Tests)"]
+ },
+ { "type": "Triggerable", "name": "snowleopard-intel-release-tests",
+ "builderNames": ["SnowLeopard Intel Release (Tests)"]
+ },
+ { "type": "Triggerable", "name": "snowleopard-intel-release-tests-wk2",
+ "builderNames": ["SnowLeopard Intel Release (WebKit2 Tests)"]
+ },
+ { "type": "Triggerable", "name": "win-release-tests",
+ "builderNames": ["Windows 7 Release (Tests)"]
+ },
+ { "type": "Triggerable", "name": "win-debug-tests",
+ "builderNames": ["Windows XP Debug (Tests)"]
+ },
+ { "type": "Triggerable", "name": "win-release-tests-wk2",
+ "builderNames": ["Windows 7 Release (WebKit2 Tests)"]
+ }
+ ]
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
new file mode 100644
index 0000000..df9dcb0
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
@@ -0,0 +1,567 @@
+# -*- python -*-
+# ex: set syntax=python:
+
+c = BuildmasterConfig = {}
+
+from buildbot.buildslave import BuildSlave
+from buildbot.changes.pb import PBChangeSource
+from buildbot.scheduler import AnyBranchScheduler, Triggerable
+from buildbot.schedulers.filter import ChangeFilter
+from buildbot.status import html
+from buildbot.status.web.authz import Authz
+from buildbot.process import buildstep, factory, properties
+from buildbot.steps import master, shell, source, transfer, trigger
+from buildbot.status.builder import SUCCESS, FAILURE, WARNINGS, SKIPPED
+
+from twisted.internet import defer
+
+import re
+import simplejson
+
+from webkitpy.common.config import build as wkbuild
+from webkitpy.common.net.buildbot import BuildBot as wkbuildbot
+
+WithProperties = properties.WithProperties
+
+class ConfigureBuild(buildstep.BuildStep):
+ name = "configure build"
+ description = ["configuring build"]
+ descriptionDone = ["configured build"]
+ def __init__(self, platform, configuration, architecture, buildOnly, *args, **kwargs):
+ buildstep.BuildStep.__init__(self, *args, **kwargs)
+ self.platform = platform.split('-', 1)[0]
+ self.fullPlatform = platform
+ self.configuration = configuration
+ self.architecture = architecture
+ self.buildOnly = buildOnly
+ self.addFactoryArguments(platform=platform, configuration=configuration, architecture=architecture, buildOnly=buildOnly)
+
+ def start(self):
+ self.setProperty("platform", self.platform)
+ self.setProperty("fullPlatform", self.fullPlatform)
+ self.setProperty("configuration", self.configuration)
+ self.setProperty("architecture", self.architecture)
+ self.setProperty("buildOnly", self.buildOnly)
+ self.finished(SUCCESS)
+ return defer.succeed(None)
+
+
+class CheckOutSource(source.SVN):
+ baseURL = "http://svn.webkit.org/repository/webkit/"
+ mode = "update"
+ def __init__(self, *args, **kwargs):
+ source.SVN.__init__(self, baseURL=self.baseURL, defaultBranch="trunk", mode=self.mode, *args, **kwargs)
+
+
+class InstallWin32Dependencies(shell.Compile):
+ description = ["installing dependencies"]
+ descriptionDone = ["installed dependencies"]
+ command = ["perl", "./Tools/Scripts/update-webkit-auxiliary-libs"]
+
+class KillOldProcesses(shell.Compile):
+ name = "kill old processes"
+ description = ["killing old processes"]
+ descriptionDone = ["killed old processes"]
+ command = ["python", "./Tools/BuildSlaveSupport/win/kill-old-processes"]
+
+class InstallChromiumDependencies(shell.ShellCommand):
+ name = "gclient"
+ description = ["updating chromium dependencies"]
+ descriptionDone = ["updated chromium dependencies"]
+ command = ["perl", "./Tools/Scripts/update-webkit-chromium", "--force"]
+ haltOnFailure = True
+
+class CleanupChromiumLinuxCrashLogs(shell.ShellCommand):
+ name = "cleanup crash logs"
+ description = ["removing crash logs"]
+ descriptionDone = ["removed crash logs"]
+ command = ["sh", "-c", "rm -rf /tmp/.org.chromium.*"]
+ haltOnFailure = False
+
+
+def appendCustomBuildFlags(step, platform):
+ if platform in ('gtk', 'wx', 'qt', 'chromium', 'wincairo', 'efl'):
+ step.setCommand(step.command + ['--' + platform])
+
+
+class CompileWebKit(shell.Compile):
+ command = ["perl", "./Tools/Scripts/build-webkit", WithProperties("--%(configuration)s")]
+ env = {'MFLAGS':''}
+ name = "compile-webkit"
+ description = ["compiling"]
+ descriptionDone = ["compiled"]
+ warningPattern = ".*arning: .*"
+
+ def start(self):
+ platform = self.getProperty('platform')
+ buildOnly = self.getProperty('buildOnly')
+ if platform == 'mac' and buildOnly:
+ self.setCommand(self.command + ['DEBUG_INFORMATION_FORMAT=dwarf-with-dsym'])
+
+ appendCustomBuildFlags(self, platform)
+ return shell.Compile.start(self)
+
+
+class ArchiveBuiltProduct(shell.ShellCommand):
+ command = ["python", "./Tools/BuildSlaveSupport/built-product-archive",
+ WithProperties("--platform=%(platform)s"), WithProperties("--%(configuration)s"), "archive"]
+ name = "archive-built-product"
+ description = ["archiving built product"]
+ descriptionDone = ["archived built product"]
+ haltOnFailure = True
+
+
+class ExtractBuiltProduct(shell.ShellCommand):
+ command = ["python", "./Tools/BuildSlaveSupport/built-product-archive",
+ WithProperties("--platform=%(platform)s"), WithProperties("--%(configuration)s"), "extract"]
+ name = "extract-built-product"
+ description = ["extracting built product"]
+ descriptionDone = ["extracted built product"]
+ haltOnFailure = True
+
+
+class UploadBuiltProduct(transfer.FileUpload):
+ slavesrc = WithProperties("WebKitBuild/%(configuration)s.zip")
+ masterdest = WithProperties("archives/%(fullPlatform)s-%(architecture)s-%(configuration)s/%(got_revision)s.zip")
+ haltOnFailure = True
+
+ def __init__(self):
+ transfer.FileUpload.__init__(self, self.slavesrc, self.masterdest)
+
+
+class DownloadBuiltProduct(transfer.FileDownload):
+ slavedest = WithProperties("WebKitBuild/%(configuration)s.zip")
+ mastersrc = WithProperties("archives/%(fullPlatform)s-%(architecture)s-%(configuration)s/%(got_revision)s.zip")
+ haltOnFailure = True
+ flunkOnFailure = True
+
+ def __init__(self):
+ transfer.FileDownload.__init__(self, self.mastersrc, self.slavedest)
+
+
+class RunJavaScriptCoreTests(shell.Test):
+ name = "jscore-test"
+ description = ["jscore-tests running"]
+ descriptionDone = ["jscore-tests"]
+ command = ["perl", "./Tools/Scripts/run-javascriptcore-tests", WithProperties("--%(configuration)s")]
+ logfiles = {'results': 'JavaScriptCore/tests/mozilla/actual.html'}
+
+ def __init__(self, skipBuild=False, *args, **kwargs):
+ self.skipBuild = skipBuild
+ shell.Test.__init__(self, *args, **kwargs)
+ self.addFactoryArguments(skipBuild=skipBuild)
+
+ def start(self):
+ appendCustomBuildFlags(self, self.getProperty('platform'))
+ if self.skipBuild:
+ self.setCommand(self.command + ['--skip-build'])
+ return shell.Test.start(self)
+
+ def commandComplete(self, cmd):
+ shell.Test.commandComplete(self, cmd)
+
+ logText = cmd.logs['stdio'].getText()
+ statusLines = [line for line in logText.splitlines() if line.find('regression') >= 0 and line.find(' found.') >= 0]
+ if statusLines and statusLines[0].split()[0] != '0':
+ self.regressionLine = statusLines[0]
+ else:
+ self.regressionLine = None
+
+ def evaluateCommand(self, cmd):
+ if self.regressionLine:
+ return FAILURE
+
+ if cmd.rc != 0:
+ return FAILURE
+
+ return SUCCESS
+
+ def getText(self, cmd, results):
+ return self.getText2(cmd, results)
+
+ def getText2(self, cmd, results):
+ if results != SUCCESS and self.regressionLine:
+ return [self.name, self.regressionLine]
+
+ return [self.name]
+
+
+class RunWebKitTests(shell.Test):
+ name = "layout-test"
+ description = ["layout-tests running"]
+ descriptionDone = ["layout-tests"]
+ command = ["perl", "./Tools/Scripts/run-webkit-tests", "--no-launch-safari", "--no-new-test-results",
+ "--no-sample-on-timeout", "--results-directory", "layout-test-results", "--use-remote-links-to-tests",
+ WithProperties("--%(configuration)s"), "--exit-after-n-crashes-or-timeouts", "20"]
+
+ def __init__(self, skipBuild=False, *args, **kwargs):
+ self.skipBuild = skipBuild
+ shell.Test.__init__(self, *args, **kwargs)
+ self.addFactoryArguments(skipBuild=skipBuild)
+
+ def start(self):
+ appendCustomBuildFlags(self, self.getProperty('platform'))
+ if self.skipBuild:
+ self.setCommand(self.command + ['--root=WebKitBuild/bin'])
+ return shell.Test.start(self)
+
+ def commandComplete(self, cmd):
+ shell.Test.commandComplete(self, cmd)
+
+ logText = cmd.logs['stdio'].getText()
+ incorrectLayoutLines = []
+ for line in logText.splitlines():
+ if line.find('had incorrect layout') >= 0 or line.find('were new') >= 0 or line.find('was new') >= 0:
+ incorrectLayoutLines.append(line)
+ elif line.find('test case') >= 0 and (line.find(' crashed') >= 0 or line.find(' timed out') >= 0):
+ incorrectLayoutLines.append(line)
+ elif line.startswith("WARNING:") and line.find(' leak') >= 0:
+ incorrectLayoutLines.append(line.replace('WARNING: ', ''))
+ elif line.find('Exiting early') >= 0:
+ incorrectLayoutLines.append(line)
+
+ # FIXME: Detect and summarize leaks of RefCounted objects
+
+ self.incorrectLayoutLines = incorrectLayoutLines
+
+ def evaluateCommand(self, cmd):
+ if self.incorrectLayoutLines:
+ if len(self.incorrectLayoutLines) == 1:
+ line = self.incorrectLayoutLines[0]
+ if line.find('were new') >= 0 or line.find('was new') >= 0 or line.find(' leak') >= 0:
+ return WARNINGS
+
+ return FAILURE
+
+ if cmd.rc != 0:
+ return FAILURE
+
+ return SUCCESS
+
+ def getText(self, cmd, results):
+ return self.getText2(cmd, results)
+
+ def getText2(self, cmd, results):
+ if results != SUCCESS and self.incorrectLayoutLines:
+ return self.incorrectLayoutLines
+
+ return [self.name]
+
+
+class NewRunWebKitTests(RunWebKitTests):
+ command = ["python", "./Tools/Scripts/new-run-webkit-tests", "--noshow-results",
+ "--verbose", "--results-directory", "layout-test-results",
+ "--builder-name", WithProperties("%(buildername)s"),
+ "--build-number", WithProperties("%(buildnumber)s"),
+ "--master-name", "webkit.org",
+ "--test-results-server", "test-results.appspot.com",
+ WithProperties("--%(configuration)s")]
+
+
+class RunPythonTests(shell.Test):
+ name = "webkitpy-test"
+ description = ["python-tests running"]
+ descriptionDone = ["python-tests"]
+ command = ["python", "./Tools/Scripts/test-webkitpy"]
+
+
+class RunPerlTests(shell.Test):
+ name = "webkitperl-test"
+ description = ["perl-tests running"]
+ descriptionDone = ["perl-tests"]
+ command = ["perl", "./Tools/Scripts/test-webkitperl"]
+
+
+class RunGtkAPITests(shell.Test):
+ name = "API tests"
+ description = ["API tests running"]
+ descriptionDone = ["API tests"]
+ command = ["perl", "./Tools/Scripts/run-gtk-tests", WithProperties("--%(configuration)s")]
+
+ def commandComplete(self, cmd):
+ shell.Test.commandComplete(self, cmd)
+
+ logText = cmd.logs['stdio'].getText()
+ incorrectLines = []
+ for line in logText.splitlines():
+ if line.startswith('ERROR'):
+ incorrectLines.append(line)
+
+ self.incorrectLines = incorrectLines
+
+ def evaluateCommand(self, cmd):
+ if self.incorrectLines:
+ return FAILURE
+
+ if cmd.rc != 0:
+ return FAILURE
+
+ return SUCCESS
+
+ def getText(self, cmd, results):
+ return self.getText2(cmd, results)
+
+ def getText2(self, cmd, results):
+ if results != SUCCESS and self.incorrectLines:
+ return ["%d API tests failed" % len(self.incorrectLines)]
+
+ return [self.name]
+
+class RunQtAPITests(shell.Test):
+ name = "API tests"
+ description = ["API tests running"]
+ descriptionDone = ["API tests"]
+ command = ["python", "./Tools/Scripts/run-qtwebkit-tests",
+ "--output-file=qt-unit-tests.html", "--do-not-open-results",
+ WithProperties("WebKitBuild/%(configuration_pretty)s/WebKit/qt/tests/")]
+
+ def start(self):
+ self.setProperty("configuration_pretty", self.getProperty("configuration").title())
+ return shell.Test.start(self)
+
+ def commandComplete(self, cmd):
+ shell.Test.commandComplete(self, cmd)
+
+ logText = cmd.logs['stdio'].getText()
+ foundItems = re.findall("TOTALS: (?P<passed>\d+) passed, (?P<failed>\d+) failed, (?P<skipped>\d+) skipped", logText)
+
+ self.incorrectTests = 0
+ self.statusLine = []
+
+ if foundItems:
+ self.incorrectTests = int(foundItems[0][1])
+ if self.incorrectTests > 0:
+ self.statusLine = [
+ "%s passed, %s failed, %s skipped" % (foundItems[0][0], foundItems[0][1], foundItems[0][2])
+ ]
+
+ def evaluateCommand(self, cmd):
+ if self.incorrectTests:
+ return WARNINGS
+
+ if cmd.rc != 0:
+ return FAILURE
+
+ return SUCCESS
+
+ def getText(self, cmd, results):
+ return self.getText2(cmd, results)
+
+ def getText2(self, cmd, results):
+ if results != SUCCESS and self.incorrectTests:
+ return self.statusLine
+
+ return [self.name]
+
+class RunWebKitLeakTests(RunWebKitTests):
+ def start(self):
+ self.setCommand(self.command + ["--leaks"])
+ return RunWebKitTests.start(self)
+
+
+class RunWebKit2Tests(RunWebKitTests):
+ def start(self):
+ self.setCommand(self.command + ["--webkit-test-runner"])
+ return RunWebKitTests.start(self)
+
+
+class RunChromiumWebKitUnitTests(shell.Test):
+ name = "webkit-unit-tests"
+ description = ["webkit-unit-tests running"]
+ descriptionDone = ["webkit-unit-tests"]
+ command = ["perl", "./Tools/Scripts/run-chromium-webkit-unit-tests",
+ WithProperties("--%(configuration)s")]
+
+
+class ArchiveTestResults(shell.ShellCommand):
+ command = ["python", "./Tools/BuildSlaveSupport/test-result-archive",
+ WithProperties("--platform=%(platform)s"), WithProperties("--%(configuration)s"), "archive"]
+ name = "archive-test-results"
+ description = ["archiving test results"]
+ descriptionDone = ["archived test results"]
+ haltOnFailure = True
+
+
+class UploadTestResults(transfer.FileUpload):
+ slavesrc = "layout-test-results.zip"
+ masterdest = WithProperties("public_html/results/%(buildername)s/r%(got_revision)s (%(buildnumber)s).zip")
+
+ def __init__(self):
+ transfer.FileUpload.__init__(self, self.slavesrc, self.masterdest)
+
+
+class ExtractTestResults(master.MasterShellCommand):
+ zipFile = WithProperties("public_html/results/%(buildername)s/r%(got_revision)s (%(buildnumber)s).zip")
+ resultDirectory = WithProperties("public_html/results/%(buildername)s/r%(got_revision)s (%(buildnumber)s)")
+
+ def __init__(self):
+ master.MasterShellCommand.__init__(self, "")
+
+ def start(self):
+ self.command = ["ditto", "-k", "-x", "-V", self.build.getProperties().render(self.zipFile), self.build.getProperties().render(self.resultDirectory)]
+ return master.MasterShellCommand.start(self)
+
+ def finished(self, result):
+ url = self.build.getProperties().render(self.resultDirectory).replace("public_html/", "/")
+ self.addURL("view results", url)
+ result = master.MasterShellCommand.finished(self, result)
+ self.step_status.setText(["uploaded results"])
+ return result
+
+
+class Factory(factory.BuildFactory):
+ def __init__(self, platform, configuration, architectures, buildOnly):
+ factory.BuildFactory.__init__(self)
+ self.addStep(ConfigureBuild, platform=platform, configuration=configuration, architecture=" ".join(architectures), buildOnly=buildOnly)
+ self.addStep(CheckOutSource)
+ if platform == "win":
+ self.addStep(KillOldProcesses)
+ self.addStep(InstallWin32Dependencies)
+ if platform.startswith("chromium"):
+ self.addStep(InstallChromiumDependencies)
+
+class BuildFactory(Factory):
+ def __init__(self, platform, configuration, architectures, triggers=None):
+ Factory.__init__(self, platform, configuration, architectures, True)
+ self.addStep(CompileWebKit)
+ if triggers:
+ self.addStep(ArchiveBuiltProduct)
+ self.addStep(UploadBuiltProduct)
+ self.addStep(trigger.Trigger, schedulerNames=triggers)
+
+class TestFactory(Factory):
+ TestClass = RunWebKitTests
+ def __init__(self, platform, configuration, architectures):
+ Factory.__init__(self, platform, configuration, architectures, False)
+ self.addStep(DownloadBuiltProduct)
+ self.addStep(ExtractBuiltProduct)
+ self.addStep(RunJavaScriptCoreTests, skipBuild=True)
+ self.addStep(self.TestClass, skipBuild=(platform == 'win'))
+ # Tiger's Python 2.3 is too old. WebKit Python requires 2.5+.
+ # Sadly we have no way to detect the version on the slave from here.
+ if platform != "mac-tiger":
+ self.addStep(RunPythonTests)
+ self.addStep(RunPerlTests)
+ self.addStep(ArchiveTestResults)
+ self.addStep(UploadTestResults)
+ self.addStep(ExtractTestResults)
+
+class BuildAndTestFactory(Factory):
+ TestClass = RunWebKitTests
+ def __init__(self, platform, configuration, architectures):
+ Factory.__init__(self, platform, configuration, architectures, False)
+ if platform == "chromium-linux":
+ self.addStep(CleanupChromiumLinuxCrashLogs)
+ self.addStep(CompileWebKit)
+ if not platform.startswith("chromium"):
+ self.addStep(RunJavaScriptCoreTests)
+ if platform.startswith("chromium"):
+ self.addStep(RunChromiumWebKitUnitTests)
+ self.addStep(self.TestClass)
+ # Tiger's Python 2.3 is too old. WebKit Python requires 2.5+.
+ # Sadly we have no way to detect the version on the slave from here.
+ if platform != "mac-tiger":
+ self.addStep(RunPythonTests)
+ self.addStep(RunPerlTests)
+ self.addStep(ArchiveTestResults)
+ self.addStep(UploadTestResults)
+ self.addStep(ExtractTestResults)
+ if platform == "gtk":
+ self.addStep(RunGtkAPITests)
+ if platform == "qt":
+ self.addStep(RunQtAPITests)
+
+class BuildAndTestLeaksFactory(BuildAndTestFactory):
+ TestClass = RunWebKitLeakTests
+
+class NewBuildAndTestFactory(BuildAndTestFactory):
+ TestClass = NewRunWebKitTests
+
+class TestWebKit2Factory(TestFactory):
+ TestClass = RunWebKit2Tests
+
+class PlatformSpecificScheduler(AnyBranchScheduler):
+ def __init__(self, platform, branch, **kwargs):
+ self.platform = platform
+ filter = ChangeFilter(branch=[branch, None], filter_fn=self.filter)
+ AnyBranchScheduler.__init__(self, name=platform, change_filter=filter, **kwargs)
+
+ def filter(self, change):
+ return wkbuild.should_build(self.platform, change.files)
+
+trunk_filter = ChangeFilter(branch=["trunk", None])
+
+def loadBuilderConfig(c):
+ # FIXME: These file handles are leaked.
+ passwords = simplejson.load(open('passwords.json'))
+ config = simplejson.load(open('config.json'))
+
+ # use webkitpy's buildbot module to test for core builders
+ wkbb = wkbuildbot()
+
+ c['slaves'] = [BuildSlave(slave['name'], passwords[slave['name']], max_builds=1) for slave in config['slaves']]
+
+ c['schedulers'] = []
+ for scheduler in config['schedulers']:
+ if "change_filter" in scheduler:
+ scheduler["change_filter"] = globals()[scheduler["change_filter"]]
+ kls = globals()[scheduler.pop('type')]
+ c['schedulers'].append(kls(**scheduler))
+
+ c['builders'] = []
+ for builder in config['builders']:
+ for slaveName in builder['slavenames']:
+ for slave in config['slaves']:
+ if slave['name'] != slaveName or slave['platform'] == '*':
+ continue
+
+ if slave['platform'] != builder['platform']:
+ raise Exception, "Builder %r is for platform %r but has slave %r for platform %r!" % (builder['name'], builder['platform'], slave['name'], slave['platform'])
+
+ break
+
+ factory = globals()["%sFactory" % builder.pop('type')]
+ factoryArgs = []
+ for key in "platform", "configuration", "architectures", "triggers":
+ value = builder.pop(key, None)
+ if value:
+ factoryArgs.append(value)
+
+ builder["factory"] = factory(*factoryArgs)
+
+ builder["category"] = "noncore"
+ if wkbb._is_core_builder(builder['name']):
+ builder["category"] = "core"
+
+ c['builders'].append(builder)
+
+loadBuilderConfig(c)
+
+c['change_source'] = PBChangeSource()
+
+# permissions for WebStatus
+authz = Authz(
+ forceBuild=True,
+ forceAllBuilds=True,
+ pingBuilder=True,
+ gracefulShutdown=False,
+ stopBuild=True,
+ stopAllBuilds=True,
+ cancelPendingBuild=True,
+ stopChange=True,
+ cleanShutdown=False)
+
+c['status'] = []
+c['status'].append(html.WebStatus(http_port=8710,
+ revlink="http://trac.webkit.org/changeset/%s",
+ authz=authz))
+
+c['slavePortnum'] = 17000
+c['projectName'] = "WebKit"
+c['projectURL'] = "http://webkit.org"
+c['buildbotURL'] = "http://build.webkit.org/"
+
+c['buildHorizon'] = 1000
+c['logHorizon'] = 500
+c['eventHorizon'] = 200
+c['buildCacheSize'] = 60
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/buildbot.css b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/buildbot.css
new file mode 100644
index 0000000..a71c81f
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/buildbot.css
@@ -0,0 +1,382 @@
+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;
+}
+
+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;
+}
+
+.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;
+}
+
+td.Project a:hover, td.start a:hover {
+ color: #000;
+}
+
+/* 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;
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css
new file mode 100644
index 0000000..4223807
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css
@@ -0,0 +1,524 @@
+div.header { display: none; }
+body > hr { display: none; }
+div.content h1 { display: none; }
+
+body.interface {
+ background: url(bg_gradient.jpg) repeat-x;
+ font-family: Verdana, Cursor;
+ font-size: 10px;
+ font-weight: bold;
+ background-color: #fff;
+ color: #333;
+}
+
+a:link,a:visited,a:active {
+ color: #444;
+}
+
+table {
+ border-spacing: 1px 1px;
+}
+
+table td {
+ padding: 3px 2px 3px 2px;
+}
+
+.Project {
+ min-width: 6em;
+}
+
+.LastBuild,.Activity {
+ padding: 0 0 0 4px;
+}
+
+/* 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: #ddd;
+}
+
+.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 {
+ color: #FFFFFF;
+ background-color: #E0B0FF;
+ border-color: #ACA0B3;
+}
+
+.start,.running,td.building {
+ color: #666666;
+ background-color: #FFFC6C;
+ border-color: #C5C56D;
+}
+
+.offline,td.offline {
+ color: #FFFFFF;
+ background-color: #E0B0FF;
+ border-color: #dddddd;
+}
+
+
+.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;
+ background-color: #fff;
+}
+
+.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;
+}
+
+/* column container */
+div.column {
+ margin: 0 2em 2em 0;
+ float: left;
+}
+
+/* info tables */
+table.info {
+ border-spacing: 1px;
+}
+
+table.info td {
+ padding: 0.1em 1em 0.1em 1em;
+ text-align: center;
+}
+
+table.info th {
+ padding: 0.2em 1.5em 0.2em 1.5em;
+ text-align: center;
+}
+
+table.info td.left {
+ text-align: left
+}
+
+.alt {
+ background-color: #d6d6d6;
+}
+
+li {
+ padding: 0.1em 1em 0.1em 1em;
+}
+
+.result {
+ padding: 0.3em 1em 0.3em 1em;
+}
+
+/* log view */
+.log * {
+ vlink: #800080;
+ font-family: "Courier New", courier, monotype;
+}
+
+span.stdout {
+ color: black;
+}
+
+span.stderr {
+ color: red;
+}
+
+span.header {
+ color: blue;
+}
+
+/* revision & email */
+.revision .full {
+ display: none;
+}
+
+.user .email {
+ display: none;
+}
+
+/* change comments (use regular colors here) */
+pre.comments>a:link,pre.comments>a:visited {
+ color: blue;
+}
+
+pre.comments>a:active {
+ color: purple;
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/robots.txt b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/robots.txt
new file mode 100644
index 0000000..579297c
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/robots.txt
@@ -0,0 +1,13 @@
+User-agent: *
+Disallow: /waterfall
+Disallow: /builders
+Disallow: /changes
+Disallow: /buildslaves
+Disallow: /schedulers
+Disallow: /one_line_per_build
+Disallow: /one_box_per_builder
+Disallow: /xmlrpc
+Disallow: /grid
+Disallow: /tgrid
+Disallow: /console
+Disallow: /results
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
new file mode 100755
index 0000000..c6d2343
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
+<title>Welcome to the Buildbot</title>
+</head>
+
+<body>
+<h1>Welcome to the Buildbot!</h1>
+
+<ul>
+ <li><a href="console?category=core">Core Console</a></li>
+ <li><a href="waterfall?category=core">Core Waterfall</a></li>
+ <li><a href="console">Console</a></li>
+ <li><a href="waterfall">Waterfall Display</a> will give you a time-oriented summary of recent buildbot activity.</li>
+ <li><a href="one_box_per_builder">Latest Build</a> for each builder is here.</li>
+ <li><a href="one_line_per_build">Recent Builds</a> are summarized here, one per line.</li>
+ <li><a href="buildslaves">Buildslave</a> information</li>
+ <li><a href="http://webkit-commit-queue.appspot.com/">Commit Queue Status</a> information.</li>
+ <li><a href="changes">ChangeSource</a> information.</li>
+ <li><a href="results">Test Results</a></li>
+</ul>
+</body> </html>
+