Index: infra/bots/isolate_android_sdk.py |
diff --git a/infra/bots/isolate_android_sdk.py b/infra/bots/isolate_android_sdk.py |
index 456670b69c9a0cacb181e5f67d069072e95cc3de..1cb0accac42b42f2733e69872b53889838151148 100644 |
--- a/infra/bots/isolate_android_sdk.py |
+++ b/infra/bots/isolate_android_sdk.py |
@@ -18,15 +18,68 @@ import sys |
import utils |
+INFRA_BOTS_DIR = os.path.realpath(os.path.dirname(os.path.abspath(__file__))) |
ISOLATE_FILE_NAME = 'android_sdk.isolate' |
REPO_SKIA = 'https://skia.googlesource.com/skia.git' |
SDK_DIR_NAME = 'android-sdk' |
+def get_isolate_binary(): |
+ """Find or, if necessary, obtain the isolate binary.""" |
+ # Try to find isolate locally. |
+ platform = 'linux64' |
+ if sys.platform == 'win32': |
+ platform = 'win64' |
+ elif sys.platform == 'darwin': |
+ platform = 'mac64' |
+ repo_isolate = os.path.join(INFRA_BOTS_DIR, |
+ 'tools', 'luci-go', platform) |
+ path = os.pathsep.join((repo_isolate, os.environ['PATH'])) |
+ try: |
+ output = subprocess.check_output( |
+ ['which', 'isolate'], |
+ env={'PATH':path}).rstrip() |
+ print 'Found isolate binary: %s' % output |
+ return output |
+ except subprocess.CalledProcessError: |
+ pass |
+ |
+ # Download isolate from GS. |
+ print 'Unable to find isolate binary; attempting to download...' |
+ try: |
+ subprocess.check_call( |
+ ['download_from_google_storage', |
+ '--bucket', 'chromium-luci', |
+ '-d', repo_isolate]) |
+ except OSError as e: |
+ raise Exception('Failed to download isolate binary. ' |
+ 'Is depot_tools in PATH? Error: %s' % e) |
+ except subprocess.CalledProcessError as e: |
+ raise Exception('Failed to download isolate binary. ' |
+ 'Are you authenticated to Google Storage? Error: %s' % e) |
+ |
+ output = subprocess.check_output( |
+ ['which', 'isolate'], |
+ env={'PATH':path}).rstrip() |
+ return output |
+ |
+ |
+def check_isolate_auth(isolate): |
+ """Ensure that we're authenticated to the isolate server.""" |
+ not_logged_in = 'Not logged in' |
+ try: |
+ output = subprocess.check_output([isolate, 'whoami']) |
+ |
+ except subprocess.CalledProcessError: |
+ output = not_logged_in |
+ if output == not_logged_in: |
+ raise Exception('Not authenticated to isolate server. You probably need to ' |
+ 'run:\n$ %s login' % isolate) |
+ |
+ |
def isolate_android_sdk(android_sdk_root): |
"""Isolate the Android SDK and return the isolated hash.""" |
- repo_isolate_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), |
- ISOLATE_FILE_NAME) |
+ repo_isolate_file = os.path.join(INFRA_BOTS_DIR, ISOLATE_FILE_NAME) |
with utils.tmp_dir(): |
# Copy the SDK dir contents into a directory with a known name. |
sdk_dir = os.path.join(os.getcwd(), SDK_DIR_NAME) |
@@ -35,7 +88,8 @@ def isolate_android_sdk(android_sdk_root): |
shutil.copyfile(repo_isolate_file, isolate_file) |
# Isolate the SDK. |
- isolate = 'isolate' # TODO(borenet): Don't assume this is in PATH. |
+ isolate = get_isolate_binary() |
+ check_isolate_auth(isolate) |
android_sdk_relpath = os.path.relpath( |
sdk_dir, os.path.dirname(isolate_file)) |
isolate_cmd = [isolate, 'archive', '--quiet', |
@@ -47,7 +101,6 @@ def isolate_android_sdk(android_sdk_root): |
return shlex.split(isolate_out)[0] |
- |
def update_sdk_file(skia_path, isolated_hash): |
"""Edit the android_sdk_hash file, upload a CL.""" |
with utils.chdir(skia_path): |
@@ -64,8 +117,8 @@ def main(): |
parser = argparse.ArgumentParser() |
parser.add_argument('--android_sdk_root', required=True) |
args = parser.parse_args() |
- skia_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), |
- os.pardir, os.pardir) |
+ skia_path = os.path.abspath(os.path.join(INFRA_BOTS_DIR, |
+ os.pardir, os.pardir)) |
with utils.print_timings(): |
isolated_hash = isolate_android_sdk(args.android_sdk_root) |