| #!/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 |