Chromium Code Reviews| Index: client/tools/pub_buildbot.py |
| diff --git a/client/tools/pub_buildbot.py b/client/tools/pub_buildbot.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2b6a0aec5cafeac2a68c0b1e625cd5193ce03652 |
| --- /dev/null |
| +++ b/client/tools/pub_buildbot.py |
| @@ -0,0 +1,154 @@ |
| +#!/usr/bin/python |
| + |
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +"""Pub buildbot steps |
| + |
| +Runs tests for pub and the pub packages that are hosted in the main Dart repo. |
| +This file is heartily inspired by utils/compiler/buildbot.py. |
| +""" |
| + |
| +import optparse |
| +import os |
| +from os.path import abspath |
| +from os.path import dirname |
| +import re |
| +import subprocess |
| +import sys |
| + |
| +BUILDER_NAME = 'BUILDBOT_BUILDERNAME' |
| +BUILDER_CLOBBER = 'BUILDBOT_CLOBBER' |
| + |
| +DART_PATH = dirname(dirname(dirname(abspath(__file__)))) |
| + |
| +PUB_BUILDER = r'pub-(linux|mac|win)' |
| + |
| +NO_COLOR_ENV = dict(os.environ) |
| +NO_COLOR_ENV['TERM'] = 'nocolor' |
| + |
| + |
| +def GetBuildInfo(): |
| + """Returns info for the current buildbot based on the name of the builder. |
| + |
| + Currently, this is just: |
| + - mode: always "release" |
| + - system: "linux", "mac", or "win" |
| + """ |
| + |
| + # For testing the bot locally, allow the user to pass in a buildbot name. |
|
Emily Fortuna
2012/10/19 21:35:53
:-D
|
| + parser = optparse.OptionParser() |
| + parser.add_option('-n', '--name', dest='name', help='The name of the build' |
| + 'bot you would like to emulate (ex: web-chrome-win7)', default=None) |
|
Emily Fortuna
2012/10/19 21:35:53
nit: change the name to a pub-like bot name instea
Bob Nystrom
2012/10/20 01:06:38
Done.
|
| + args, _ = parser.parse_args() |
| + |
| + if args.name: |
| + builder_name = args.name |
| + else: |
| + builder_name = os.environ.get(BUILDER_NAME) |
| + if not builder_name: |
| + print 'Use -n $BUILDBOT_NAME for the bot you would like to emulate.' |
| + sys.exit(1) |
| + |
| + pub_pattern = re.match(PUB_BUILDER, builder_name) |
| + if not pub_pattern: |
| + print 'Could not handle unfamiliar bot name "$builder_name".' |
| + sys.exit(1) |
| + |
| + system = pub_pattern.group(1) |
| + if system == 'win': system = 'windows' |
| + |
| + return ('release', system) |
| + |
| + |
| +def TestStepName(name, flags): |
| + # Filter out flags with '=' as this breaks the /stats feature of the |
| + # build bot. |
| + flags = [x for x in flags if not '=' in x] |
| + return ('%s tests %s' % (name, ' '.join(flags))).strip() |
| + |
| + |
| +def TestStep(name, mode, system, compiler, runtime, targets, flags): |
| + step_name = TestStepName(name, flags) |
| + print '@@@BUILD_STEP %s@@@' % step_name |
| + sys.stdout.flush() |
| + |
| + cmd = [ |
| + sys.executable, os.path.join(os.curdir, 'tools', 'test.py'), |
| + '--step_name=' + step_name, |
| + '--mode=' + mode, |
| + '--compiler=' + compiler, |
| + '--runtime=' + runtime, |
| + '--progress=buildbot', |
| + '-v', '--time', '--use-sdk', '--checked', '--report' |
| + ] |
| + |
| + if flags: |
| + cmd.extend(flags) |
| + cmd.extend(targets) |
| + |
| + print 'Running: %s' % (' '.join(cmd)) |
| + exit_code = subprocess.call(cmd, env=NO_COLOR_ENV) |
| + return CheckFailure(exit_code) |
| + |
| + |
| +def BuildSDK(mode, system): |
|
Emily Fortuna
2012/10/19 21:35:53
A lot of this is pretty much exactly copied code f
Bob Nystrom
2012/10/20 01:06:38
I don't want to add pub stuff to the original scri
|
| + """ build the SDK. |
| + Args: |
| + - mode: either 'debug' or 'release' |
| + - system: either 'linux', 'mac', or 'win7' |
| + """ |
| + print '@@@BUILD_STEP build sdk@@@' |
| + args = [sys.executable, './tools/build.py', '--mode=' + mode, 'create_sdk'] |
| + print 'Building SDK: %s' % (' '.join(args)) |
| + return subprocess.call(args, env=NO_COLOR_ENV) |
| + |
| + |
| +def ClobberBuilder(mode): |
| + """ Clobber the builder before we do the build, if appropriate. |
| + Args: |
| + - mode: either 'debug' or 'release' |
| + """ |
| + if os.environ.get(BUILDER_CLOBBER) != "1": |
| + return 0 |
| + |
| + print '@@@BUILD_STEP Clobber@@@' |
| + cmd = [sys.executable, |
| + './tools/clean_output_directory.py', |
| + '--mode=' + mode] |
| + print 'Clobbering %s' % (' '.join(cmd)) |
| + return subprocess.call(cmd, env=NO_COLOR_ENV) |
| + |
| + |
| +def CheckFailure(status): |
| + """ Prints the appropriate buildbot message if status is a failure code. |
| + """ |
| + if status != 0: |
| + print '@@@STEP_FAILURE@@@' |
| + |
| + return status |
| + |
| + |
| +def main(): |
| + if len(sys.argv) == 0: |
| + print 'Script pathname not known, giving up.' |
| + return 1 |
| + |
| + (mode, system) = GetBuildInfo() |
| + |
| + # Make sure we are in the dart directory |
| + os.chdir(DART_PATH) |
| + |
| + status = ClobberBuilder(mode) |
| + if CheckFailure(status): return status |
| + |
| + status = BuildSDK(mode, system) |
| + if CheckFailure(status): return status |
| + |
| + # TODO(rnystrom): Eventually test other targets here like 'utils'? |
| + status = TestStep('pub', mode, system, 'none', 'vm', ['pub'], []) |
| + if CheckFailure(status): return status |
| + |
| +if __name__ == '__main__': |
| + sys.exit(main()) |