blob: 5d3392c1f6bbd267ada5deb66bd3a63dc709583b [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
# Copyright (c) 2011 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.
"""Dart client buildbot steps
Compiles dart client apps with dartc, and run the client tests both in headless
chromium and headless dartium.
"""
import os
import re
import socket
import subprocess
import sys
import shutil
import glob
BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
BUILDER_CLOBBER = 'BUILDBOT_CLOBBER'
REVISION = 'BUILDBOT_REVISION'
# latest dartium location
DARTIUM_VERSION_FILE = 'client/tests/drt/LAST_VERSION'
DARTIUM_V_MATCHER = (
'gs://dartium-archive/[^/]*/dartium-\w*-inc-([0-9]*).([0-9]*).zip')
def GetBuildInfo():
"""Returns a tuple (name, version, mode) where:
- name: A name for the build - the buildbot host if a buildbot.
- version: A version string corresponding to this build.
"""
name = None
version = None
# Populate via builder environment variables.
name = os.environ.get(BUILDER_NAME)
version = os.environ.get(REVISION)
# Fall back if not on builder.
if not name:
name = socket.gethostname().split('.')[0]
if not version:
# In Windows we need to run in the shell, so that we have all the
# environment variables available.
pipe = subprocess.Popen(
['svnversion', '-n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)
output = pipe.communicate()
if pipe.returncode == 0:
version = output[0]
else:
version = 'unknown'
return (name, version)
def GetUtils():
'''
dynamically get the utils module
We use a dynamic import for tools/util.py because we derive its location
dynamically using sys.argv[0]. This allows us to run this script from
different directories.
args:
'''
sys.path.append(os.path.abspath(os.path.join('.', 'tools')))
utils = __import__('utils')
return utils
def GetOutDir(utils, mode):
'''
get the location to place the output
args:
utils - the tools/utils.py module
mode - the mode release or debug
'''
return utils.GetBuildRoot(utils.GuessOS(), mode, utils.ARCH_GUESS)
def ProcessTools(mode, name, version):
'''
build and test the tools
args:
srcpath - the location of the source code to build
mode - the mode release or debug
version - the svn version of the currently checked out code
'''
print 'ProcessTools'
toolsBuildScript = os.path.join('.', 'editor', 'build', 'build.py')
# TODO(devoncarew): should we move this into GetBuildInfo()?
# get the latest changed revision from the current repository sub-tree
version = GetLatestChangedRevision()
utils = GetUtils()
outdir = GetOutDir(utils, mode)
cmds = [sys.executable, toolsBuildScript,
'--mode=' + mode, '--revision=' + version,
'--name=' + name, '--out=' + outdir]
local_env = os.environ
#if 'linux' in name:
# javahome = os.path.join(os.path.expanduser('~'), 'jdk1.6.0_25')
# local_env['JAVA_HOME'] = javahome
# local_env['PATH'] = (os.path.join(javahome, 'bin') +
# os.pathsep + local_env['PATH'])
return subprocess.call(cmds, env=local_env)
def ProcessBot(name, target):
'''
Build and test the named bot target (compiler, android, pub). We look for
the supporting script in tools/bots/ to run the tests and build.
'''
print 'Process%s' % target.capitalize()
has_shell=False
if '-win' in name:
# In Windows we need to run in the shell, so that we have all the
# environment variables available.
has_shell=True
return subprocess.call([sys.executable,
os.path.join('tools', 'bots', target + '.py')],
env=os.environ, shell=has_shell)
def FixJavaHome():
buildbot_javahome = os.getenv('BUILDBOT_JAVA_HOME')
if buildbot_javahome:
current_pwd = os.getenv('PWD')
java_home = os.path.join(current_pwd, buildbot_javahome)
java_bin = os.path.join(java_home, 'bin')
os.environ['JAVA_HOME'] = java_home
os.environ['PATH'] = '%s;%s' % (java_bin, os.environ['PATH'])
print 'Setting java home to ', java_home
sys.stdout.flush()
def ClobberBuilder():
""" Clobber the builder before we do the build.
"""
cmd = [sys.executable,
'./tools/clean_output_directory.py']
print 'Clobbering %s' % (' '.join(cmd))
return subprocess.call(cmd)
def GetShouldClobber():
return os.environ.get(BUILDER_CLOBBER) == "1"
def RunDart(scriptPath):
if sys.platform == 'darwin':
pipe = subprocess.Popen(
['./tools/testing/bin/macos/dart', scriptPath],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
elif os.name == 'posix':
pipe = subprocess.Popen(
['./tools/testing/bin/linux/dart', scriptPath],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
pipe = subprocess.Popen(
['tools\\testing\\bin\\windows\\dart.exe', scriptPath],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output = pipe.communicate()
return output[0]
def GetLatestChangedRevision():
# 0.1.2.0_r13661
# 0.1.2.0_r13661_username
fullVersion = RunDart("tools/version.dart")
m = re.search('._r(\d+)', fullVersion)
svnRev = m.group(1)
return svnRev
def main():
if len(sys.argv) == 0:
print 'Script pathname not known, giving up.'
return 1
scriptdir = os.path.dirname(sys.argv[0])
# Get at the top-level directory. This script is in client/tools
os.chdir(os.path.abspath(os.path.join(scriptdir, os.pardir, os.pardir)))
if GetShouldClobber():
print '@@@BUILD_STEP Clobber@@@'
status = ClobberBuilder()
if status != 0:
print '@@@STEP_FAILURE@@@'
return status
#TODO(sigmund): remove this indirection once we update our bots
(name, version) = GetBuildInfo()
# The buildbot will set a BUILDBOT_JAVA_HOME relative to the dart
# root directory, set JAVA_HOME based on that.
FixJavaHome()
if name.startswith('dart-editor'):
# TODO(kustermann,ricow): This is a temporary hack until we can safely
# enable it on main waterfall. We need to remove this eventually
if name.startswith('dart-editor-fyi'):
match = re.search('dart-editor-fyi(.*)', name)
name = 'dart-editor' + match.group(1)
# In case we're an FYI builder, run 'tools/bots/editor.py'.
status = ProcessBot(name, 'editor')
else:
# Run the old annotated steps script
status = ProcessTools('release', name, version)
elif name.startswith('pub-'):
status = ProcessBot(name, 'pub')
elif name.startswith('vm-android'):
status = ProcessBot(name, 'android')
elif name.startswith('cross') or name.startswith('target'):
status = ProcessBot(name, 'cross-vm')
else:
status = ProcessBot(name, 'compiler')
if status:
print '@@@STEP_FAILURE@@@'
return status
if __name__ == '__main__':
sys.exit(main())