diff options
Diffstat (limited to 'Tools/BuildSlaveSupport/build.webkit.org-config')
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> + |