blob: ddfd59fecccb1f421fe1bba0a27b785016572602 [file] [log] [blame]
#!/usr/bin/python
#
# 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