Index: infra/bots/common.py |
diff --git a/infra/bots/common.py b/infra/bots/common.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9b96440c4fad1cae66c06276bcb00b2c41f3eeef |
--- /dev/null |
+++ b/infra/bots/common.py |
@@ -0,0 +1,150 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright 2016 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+ |
+import os |
+import subprocess |
+import sys |
+ |
+from flavor import android_flavor |
+from flavor import chromeos_flavor |
+from flavor import cmake_flavor |
+from flavor import coverage_flavor |
+from flavor import default_flavor |
+from flavor import ios_flavor |
+from flavor import valgrind_flavor |
+from flavor import xsan_flavor |
+ |
+ |
+CONFIG_COVERAGE = 'Coverage' |
+CONFIG_DEBUG = 'Debug' |
+CONFIG_RELEASE = 'Release' |
+VALID_CONFIGS = (CONFIG_COVERAGE, CONFIG_DEBUG, CONFIG_RELEASE) |
+ |
+GM_ACTUAL_FILENAME = 'actual-results.json' |
+GM_EXPECTATIONS_FILENAME = 'expected-results.json' |
+GM_IGNORE_TESTS_FILENAME = 'ignored-tests.txt' |
+ |
+GS_GM_BUCKET = 'chromium-skia-gm' |
+GS_SUMMARIES_BUCKET = 'chromium-skia-gm-summaries' |
+ |
+SKIA_REPO = 'https://skia.googlesource.com/skia.git' |
+INFRA_REPO = 'https://skia.googlesource.com/buildbot.git' |
+ |
+SERVICE_ACCOUNT_FILE = 'service-account-skia.json' |
+SERVICE_ACCOUNT_INTERNAL_FILE = 'service-account-skia-internal.json' |
+ |
+ |
+def is_android(bot_cfg): |
+ """Determine whether the given bot is an Android bot.""" |
+ return ('Android' in bot_cfg.get('extra_config', '') or |
+ bot_cfg.get('os') == 'Android') |
+ |
+def is_chromeos(bot_cfg): |
+ return ('CrOS' in bot_cfg.get('extra_config', '') or |
+ bot_cfg.get('os') == 'ChromeOS') |
+ |
+def is_cmake(bot_cfg): |
+ return 'CMake' in bot_cfg.get('extra_config', '') |
+ |
+def is_ios(bot_cfg): |
+ return ('iOS' in bot_cfg.get('extra_config', '') or |
+ bot_cfg.get('os') == 'iOS') |
+ |
+ |
+def is_valgrind(bot_cfg): |
+ return 'Valgrind' in bot_cfg.get('extra_config', '') |
+ |
+ |
+def is_xsan(bot_cfg): |
+ return (bot_cfg.get('extra_config') == 'ASAN' or |
+ bot_cfg.get('extra_config') == 'MSAN' or |
+ bot_cfg.get('extra_config') == 'TSAN') |
+ |
+ |
+class BotInfo(object): |
+ def __init__(self, bot_name, slave_name, out_dir): |
+ """Initialize the bot, given its name. |
+ |
+ Assumes that CWD is the directory containing this file. |
+ """ |
+ self.name = bot_name |
+ self.slave_name = slave_name |
+ self.skia_dir = os.path.abspath(os.path.join( |
+ os.path.dirname(os.path.realpath(__file__)), |
+ os.pardir, os.pardir)) |
+ os.chdir(self.skia_dir) |
+ self.build_dir = os.path.abspath(os.path.join(self.skia_dir, os.pardir)) |
+ self.out_dir = out_dir |
+ self.spec = self.get_bot_spec(bot_name) |
+ self.configuration = self.spec['configuration'] |
+ self.default_env = { |
+ 'SKIA_OUT': self.out_dir, |
+ 'BUILDTYPE': self.configuration, |
+ 'PATH': os.environ['PATH'], |
+ } |
+ self.default_env.update(self.spec['env']) |
+ self.build_targets = [str(t) for t in self.spec['build_targets']] |
+ self.bot_cfg = self.spec['builder_cfg'] |
+ self.is_trybot = self.bot_cfg['is_trybot'] |
+ self.upload_dm_results = self.spec['upload_dm_results'] |
+ self.upload_perf_results = self.spec['upload_perf_results'] |
+ self.dm_flags = self.spec['dm_flags'] |
+ self.nanobench_flags = self.spec['nanobench_flags'] |
+ self._ccache = None |
+ self._checked_for_ccache = False |
+ self.flavor = self.get_flavor(self.bot_cfg) |
+ |
+ @property |
+ def ccache(self): |
+ if not self._checked_for_ccache: |
+ self._checked_for_ccache = True |
+ if sys.platform != 'win32': |
+ try: |
+ result = subprocess.check_output(['which', 'ccache']) |
+ self._ccache = result.rstrip() |
+ except subprocess.CalledProcessError: |
+ pass |
+ |
+ return self._ccache |
+ |
+ def get_bot_spec(self, bot_name): |
+ """Retrieve the bot spec for this bot.""" |
+ sys.path.append(self.skia_dir) |
+ from tools import buildbot_spec |
+ return buildbot_spec.get_builder_spec(bot_name) |
+ |
+ def get_flavor(self, bot_cfg): |
+ """Return a flavor utils object specific to the given bot.""" |
+ if is_android(bot_cfg): |
+ return android_flavor.AndroidFlavorUtils(self) |
+ elif is_chromeos(bot_cfg): |
+ return chromeos_flavor.ChromeOSFlavorUtils(self) |
+ elif is_cmake(bot_cfg): |
+ return cmake_flavor.CMakeFlavorUtils(self) |
+ elif is_ios(bot_cfg): |
+ return ios_flavor.iOSFlavorUtils(self) |
+ elif is_valgrind(bot_cfg): |
+ return valgrind_flavor.ValgrindFlavorUtils(self) |
+ elif is_xsan(bot_cfg): |
+ return xsan_flavor.XSanFlavorUtils(self) |
+ elif bot_cfg.get('configuration') == CONFIG_COVERAGE: |
+ return coverage_flavor.CoverageFlavorUtils(self) |
+ else: |
+ return default_flavor.DefaultFlavorUtils(self) |
+ |
+ def run(self, cmd, env=None, cwd=None): |
+ _env = {} |
+ _env.update(self.default_env) |
+ _env.update(env or {}) |
+ cwd = cwd or self.skia_dir |
+ print '============' |
+ print 'CMD: %s' % cmd |
+ print 'CWD: %s' % cwd |
+ print 'ENV: %s' % _env |
+ print '============' |
+ subprocess.check_call(cmd, env=_env, cwd=cwd) |