You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
6.3 KiB
180 lines
6.3 KiB
# Copyright 2011 Google Inc. All Rights Reserved. |
|
|
|
__author__ = 'asharif@google.com (Ahmad Sharif)' |
|
|
|
import os.path |
|
import re |
|
|
|
from automation.clients.helper import jobs |
|
from automation.clients.helper import perforce |
|
from automation.common import command as cmd |
|
from automation.common import machine |
|
|
|
|
|
class ScriptsFactory(object): |
|
|
|
def __init__(self, chromeos_root, scripts_path): |
|
self._chromeos_root = chromeos_root |
|
self._scripts_path = scripts_path |
|
|
|
def SummarizeResults(self, logs_path): |
|
return cmd.Shell('summarize_results.py', logs_path, path=self._scripts_path) |
|
|
|
def Buildbot(self, config_name): |
|
buildbot = os.path.join(self._chromeos_root, |
|
'chromite/cbuildbot/cbuildbot.py') |
|
|
|
return cmd.Shell(buildbot, '--buildroot=%s' % self._chromeos_root, |
|
'--resume', '--noarchive', '--noprebuilts', '--nosync', |
|
'--nouprev', '--notests', '--noclean', config_name) |
|
|
|
def RunBenchmarks(self, board, tests): |
|
image_path = os.path.join(self._chromeos_root, 'src/build/images', board, |
|
'latest/chromiumos_image.bin') |
|
|
|
return cmd.Shell('cros_run_benchmarks.py', |
|
'--remote=$SECONDARY_MACHINES[0]', |
|
'--board=%s' % board, |
|
'--tests=%s' % tests, |
|
'--full_table', |
|
image_path, |
|
path='/home/mobiletc-prebuild') |
|
|
|
def SetupChromeOS(self, version='latest', use_minilayout=False): |
|
setup_chromeos = cmd.Shell('setup_chromeos.py', |
|
'--public', |
|
'--dir=%s' % self._chromeos_root, |
|
'--version=%s' % version, |
|
path=self._scripts_path) |
|
|
|
if use_minilayout: |
|
setup_chromeos.AddOption('--minilayout') |
|
return setup_chromeos |
|
|
|
|
|
class CommandsFactory(object): |
|
DEPOT2_DIR = '//depot2/' |
|
P4_CHECKOUT_DIR = 'perforce2/' |
|
P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14') |
|
|
|
CHROMEOS_ROOT = 'chromeos' |
|
CHROMEOS_SCRIPTS_DIR = os.path.join(CHROMEOS_ROOT, 'src/scripts') |
|
CHROMEOS_BUILDS_DIR = '/home/mobiletc-prebuild/www/chromeos_builds' |
|
|
|
def __init__(self, chromeos_version, board, toolchain, p4_snapshot): |
|
self.chromeos_version = chromeos_version |
|
self.board = board |
|
self.toolchain = toolchain |
|
self.p4_snapshot = p4_snapshot |
|
|
|
self.scripts = ScriptsFactory(self.CHROMEOS_ROOT, self.P4_VERSION_DIR) |
|
|
|
def AddBuildbotConfig(self, config_name, config_list): |
|
config_header = 'add_config(%r, [%s])' % (config_name, |
|
', '.join(config_list)) |
|
config_file = os.path.join(self.CHROMEOS_ROOT, |
|
'chromite/cbuildbot/cbuildbot_config.py') |
|
quoted_config_header = '%r' % config_header |
|
quoted_config_header = re.sub("'", "\\\"", quoted_config_header) |
|
|
|
return cmd.Pipe( |
|
cmd.Shell('echo', quoted_config_header), |
|
cmd.Shell('tee', '--append', config_file)) |
|
|
|
def RunBuildbot(self): |
|
config_dict = {'board': self.board, |
|
'build_tests': True, |
|
'chrome_tests': True, |
|
'unittests': False, |
|
'vm_tests': False, |
|
'prebuilts': False, |
|
'latest_toolchain': True, |
|
'useflags': ['chrome_internal'], |
|
'usepkg_chroot': True, |
|
self.toolchain: True} |
|
config_name = '%s-toolchain-test' % self.board |
|
if 'arm' in self.board: |
|
config_list = ['arm'] |
|
else: |
|
config_list = [] |
|
config_list.extend(['internal', 'full', 'official', str(config_dict)]) |
|
|
|
add_config_shell = self.AddBuildbotConfig(config_name, config_list) |
|
return cmd.Chain(add_config_shell, self.scripts.Buildbot(config_name)) |
|
|
|
def BuildAndBenchmark(self): |
|
return cmd.Chain( |
|
self.CheckoutV14Dir(), |
|
self.SetupChromeOSCheckout(self.chromeos_version, True), |
|
self.RunBuildbot(), |
|
self.scripts.RunBenchmarks(self.board, 'BootPerfServer,10:Page,3')) |
|
|
|
def GetP4Snapshot(self, p4view): |
|
p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view) |
|
|
|
if self.p4_snapshot: |
|
return p4client.CheckoutFromSnapshot(self.p4_snapshot) |
|
else: |
|
return p4client.SetupAndDo(p4client.Sync(), p4client.Remove()) |
|
|
|
def CheckoutV14Dir(self): |
|
p4view = perforce.View(self.DEPOT2_DIR, [ |
|
perforce.PathMapping('gcctools/chromeos/v14/...') |
|
]) |
|
return self.GetP4Snapshot(p4view) |
|
|
|
def SetupChromeOSCheckout(self, version, use_minilayout=False): |
|
version_re = '^\d+\.\d+\.\d+\.[a-zA-Z0-9]+$' |
|
|
|
location = os.path.join(self.CHROMEOS_BUILDS_DIR, version) |
|
|
|
if version in ['weekly', 'quarterly']: |
|
assert os.path.islink(location), 'Symlink %s does not exist.' % location |
|
|
|
location_expanded = os.path.abspath(os.path.realpath(location)) |
|
version = os.path.basename(location_expanded) |
|
|
|
if version in ['top', 'latest'] or re.match(version_re, version): |
|
return self.scripts.SetupChromeOS(version, use_minilayout) |
|
|
|
elif version.endswith('bz2') or version.endswith('gz'): |
|
return cmd.UnTar(location_expanded, self.CHROMEOS_ROOT) |
|
|
|
else: |
|
signature_file_location = os.path.join(location, |
|
'src/scripts/enter_chroot.sh') |
|
assert os.path.exists(signature_file_location), ( |
|
'Signature file %s does not exist.' % signature_file_location) |
|
|
|
return cmd.Copy(location, to_dir=self.CHROMEOS_ROOT, recursive=True) |
|
|
|
|
|
class JobsFactory(object): |
|
|
|
def __init__(self, |
|
chromeos_version='top', |
|
board='x86-mario', |
|
toolchain='trunk', |
|
p4_snapshot=''): |
|
self.chromeos_version = chromeos_version |
|
self.board = board |
|
self.toolchain = toolchain |
|
|
|
self.commands = CommandsFactory(chromeos_version, board, toolchain, |
|
p4_snapshot) |
|
|
|
def BuildAndBenchmark(self): |
|
command = self.commands.BuildAndBenchmark() |
|
|
|
label = 'BuildAndBenchmark(%s,%s,%s)' % (self.toolchain, self.board, |
|
self.chromeos_version) |
|
|
|
machine_label = 'chromeos-%s' % self.board |
|
|
|
job = jobs.CreateLinuxJob(label, command) |
|
job.DependsOnMachine( |
|
machine.MachineSpecification(label=machine_label, |
|
lock_required=True), |
|
False) |
|
|
|
return job
|
|
|