From eb309f10d290f725fd7d323c3b15ca212ed67b60 Mon Sep 17 00:00:00 2001 From: Eric Seidel Date: Fri, 12 Feb 2016 16:17:23 -0800 Subject: [PATCH] Use mojo's scripts for downloading android tools on the bots R=abarth@chromium.org --- infra/.gitignore | 2 + infra/VERSION_LINUX_NDK | 1 + infra/VERSION_LINUX_SDK | 1 + infra/VERSION_MACOSX_NDK | 1 + infra/VERSION_MACOSX_SDK | 1 + infra/download_android_tools.py | 97 +++++++++++++++++++++++++++++++++ infra/find_depot_tools.py | 45 +++++++++++++++ 7 files changed, 148 insertions(+) create mode 100644 infra/VERSION_LINUX_NDK create mode 100644 infra/VERSION_LINUX_SDK create mode 100644 infra/VERSION_MACOSX_NDK create mode 100644 infra/VERSION_MACOSX_SDK create mode 100755 infra/download_android_tools.py create mode 100644 infra/find_depot_tools.py diff --git a/infra/.gitignore b/infra/.gitignore index c6beb3992a8..bc2309eb1c6 100644 --- a/infra/.gitignore +++ b/infra/.gitignore @@ -1,2 +1,4 @@ .recipe_deps dart-sdk +android_tools +*.pyc diff --git a/infra/VERSION_LINUX_NDK b/infra/VERSION_LINUX_NDK new file mode 100644 index 00000000000..f8f122d6f85 --- /dev/null +++ b/infra/VERSION_LINUX_NDK @@ -0,0 +1 @@ +7b727f0d4c853c9848847839a317300cb83f4ece diff --git a/infra/VERSION_LINUX_SDK b/infra/VERSION_LINUX_SDK new file mode 100644 index 00000000000..d24f5c1f6ea --- /dev/null +++ b/infra/VERSION_LINUX_SDK @@ -0,0 +1 @@ +0d320c50b0ed188c7e1182388e2beb623a1d307d diff --git a/infra/VERSION_MACOSX_NDK b/infra/VERSION_MACOSX_NDK new file mode 100644 index 00000000000..ef96811e491 --- /dev/null +++ b/infra/VERSION_MACOSX_NDK @@ -0,0 +1 @@ +e21479f1ae8d2fac385c3965672c912d08dff280 diff --git a/infra/VERSION_MACOSX_SDK b/infra/VERSION_MACOSX_SDK new file mode 100644 index 00000000000..2441d725226 --- /dev/null +++ b/infra/VERSION_MACOSX_SDK @@ -0,0 +1 @@ +fa5ea0ca1e0c7c2e40914f3202c7545de4dbca9c diff --git a/infra/download_android_tools.py b/infra/download_android_tools.py new file mode 100755 index 00000000000..d37de883a27 --- /dev/null +++ b/infra/download_android_tools.py @@ -0,0 +1,97 @@ +#!/usr/bin/python +# Copyright 2015 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. + +""" +Downloads trimmed-down Android Tools from Google Cloud Storage and extracts +them to INSTALL_DIR, updating INSTALL_DIR/VERSION_* stamp files with current +version. Does nothing if INSTALL_DIR/VERSION_* are already up to date. +""" + +import os +import shutil +import subprocess +import sys +import tarfile + +# Path constants. (All of these should be absolute paths.) +THIS_DIR = os.path.abspath(os.path.dirname(__file__)) +INSTALL_DIR = os.path.join(THIS_DIR, 'android_tools') + +import find_depot_tools + +DEPOT_PATH = find_depot_tools.add_depot_tools_to_path() +GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py') + +def RunCommand(command): + """Run command and return success (True) or failure.""" + + print 'Running %s' % (str(command)) + if subprocess.call(command, shell=False) == 0: + return True + print 'Failed.' + return False + +def GetInstalledVersion(version_stamp): + version_file = os.path.join(INSTALL_DIR, version_stamp) + if not os.path.exists(version_file): + return None + with open(version_file) as f: + return f.read().strip() + +def VersionStampName(tools_name): + if sys.platform.startswith('linux'): + return 'VERSION_LINUX_' + tools_name.upper() + elif sys.platform == 'darwin': + return 'VERSION_MACOSX_' + tools_name.upper() + else: + raise Exception('Unsupported platform: ' + sys.platform) + +def UpdateTools(tools_name): + """Downloads zipped tools from Google Cloud Storage and extracts them, + stamping current version.""" + + # Read latest version. + version_stamp = VersionStampName(tools_name) + version = '' + with open(os.path.join(THIS_DIR, version_stamp)) as f: + version = f.read().strip() + # Return if installed binaries are up to date. + if version == GetInstalledVersion(version_stamp): + return + + # Remove the old install directory checked out from git. + if os.path.exists(os.path.join(INSTALL_DIR, '.git')): + shutil.rmtree(INSTALL_DIR) + # Make sure that the install directory exists. + if not os.path.exists(INSTALL_DIR): + os.mkdir(INSTALL_DIR) + # Remove current installation. + tools_root = os.path.join(INSTALL_DIR, tools_name) + if os.path.exists(tools_root): + shutil.rmtree(tools_root) + + # Download tools from GCS. + archive_path = os.path.join(INSTALL_DIR, tools_name + '.tar.gz') + download_cmd = ['python', GSUTIL_PATH, 'cp', + 'gs://mojo/android/tool/%s.tar.gz' % version, + archive_path] + if not RunCommand(download_cmd): + print ('WARNING: Failed to download Android tools.') + return + + print "Extracting Android tools (" + tools_name + ")" + with tarfile.open(archive_path) as arch: + arch.extractall(INSTALL_DIR) + os.remove(archive_path) + # Write version as the last step. + with open(os.path.join(INSTALL_DIR, version_stamp), 'w+') as f: + f.write('%s\n' % version) + +def main(): + UpdateTools('sdk') + UpdateTools('ndk') + +if __name__ == '__main__': + sys.exit(main()) diff --git a/infra/find_depot_tools.py b/infra/find_depot_tools.py new file mode 100644 index 00000000000..1f91866279d --- /dev/null +++ b/infra/find_depot_tools.py @@ -0,0 +1,45 @@ +# 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. +"""Small utility function to find depot_tools and add it to the python path. + +Will throw an ImportError exception if depot_tools can't be found since it +imports breakpad. +""" + +import os +import sys + + +def IsRealDepotTools(path): + return os.path.isfile(os.path.join(path, 'gclient.py')) + + +def add_depot_tools_to_path(): + """Search for depot_tools and add it to sys.path.""" + # First look if depot_tools is already in PYTHONPATH. + for i in sys.path: + if i.rstrip(os.sep).endswith('depot_tools') and IsRealDepotTools(i): + return i + # Then look if depot_tools is in PATH, common case. + for i in os.environ['PATH'].split(os.pathsep): + if IsRealDepotTools(i): + sys.path.append(i.rstrip(os.sep)) + return i + # Rare case, it's not even in PATH, look upward up to root. + root_dir = os.path.dirname(os.path.abspath(__file__)) + previous_dir = os.path.abspath(__file__) + while root_dir and root_dir != previous_dir: + i = os.path.join(root_dir, 'depot_tools') + if IsRealDepotTools(i): + sys.path.append(i) + return i + previous_dir = root_dir + root_dir = os.path.dirname(root_dir) + print >> sys.stderr, 'Failed to find depot_tools' + return None + +add_depot_tools_to_path() + +# pylint: disable=W0611 +import breakpad