Add Android SDK asset
This will allow us to use CIPD to install the Android SDK on bots. BUG=skia:5427 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2086003002 Review-Url: https://codereview.chromium.org/2086003002
This commit is contained in:
parent
df4f47b8ff
commit
501ca7f538
@ -1,7 +0,0 @@
|
||||
{
|
||||
'variables': {
|
||||
'files': [
|
||||
'<(ANDROID_SDK_DIR)/',
|
||||
],
|
||||
},
|
||||
}
|
@ -1 +0,0 @@
|
||||
1665a0011fc1ee7bfdf35ad071d979ad8a608695
|
1
infra/bots/assets/android_sdk/VERSION
Normal file
1
infra/bots/assets/android_sdk/VERSION
Normal file
@ -0,0 +1 @@
|
||||
0
|
26
infra/bots/assets/android_sdk/common.py
Executable file
26
infra/bots/assets/android_sdk/common.py
Executable file
@ -0,0 +1,26 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Common vars used by scripts in this directory."""
|
||||
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
FILE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
INFRA_BOTS_DIR = os.path.realpath(os.path.join(FILE_DIR, os.pardir, os.pardir))
|
||||
|
||||
sys.path.insert(0, INFRA_BOTS_DIR)
|
||||
from assets import assets
|
||||
|
||||
ASSET_NAME = os.path.basename(FILE_DIR)
|
||||
|
||||
|
||||
def run(cmd):
|
||||
"""Run a command, eg. "upload" or "download". """
|
||||
assets.main([cmd, ASSET_NAME] + sys.argv[1:])
|
39
infra/bots/assets/android_sdk/create.py
Normal file
39
infra/bots/assets/android_sdk/create.py
Normal file
@ -0,0 +1,39 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Create the asset."""
|
||||
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
def create_asset(target_dir, android_sdk_root):
|
||||
"""Create the asset."""
|
||||
if not android_sdk_root:
|
||||
android_sdk_root = (os.environ.get('ANDROID_HOME') or
|
||||
os.environ.get('ANDROID_SDK_ROOT'))
|
||||
if not android_sdk_root:
|
||||
raise Exception('No --android_sdk_root provided and no ANDROID_HOME or '
|
||||
'ANDROID_SDK_ROOT environment variables.')
|
||||
|
||||
dst = os.path.join(target_dir, 'android-sdk')
|
||||
shutil.copytree(android_sdk_root, dst)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--android_sdk_root')
|
||||
parser.add_argument('--target_dir', '-t', required=True)
|
||||
args = parser.parse_args()
|
||||
create_asset(args.target_dir, args.android_sdk_root)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
47
infra/bots/assets/android_sdk/create_and_upload.py
Executable file
47
infra/bots/assets/android_sdk/create_and_upload.py
Executable file
@ -0,0 +1,47 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Create the asset and upload it."""
|
||||
|
||||
|
||||
import argparse
|
||||
import common
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import utils
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--android_sdk_root')
|
||||
parser.add_argument('--gsutil')
|
||||
args = parser.parse_args()
|
||||
|
||||
with utils.tmp_dir():
|
||||
cwd = os.getcwd()
|
||||
create_script = os.path.join(common.FILE_DIR, 'create.py')
|
||||
upload_script = os.path.join(common.FILE_DIR, 'upload.py')
|
||||
|
||||
try:
|
||||
cmd = ['python', create_script, '-t', cwd]
|
||||
if args.android_sdk_root:
|
||||
cmd.extend(['--android_sdk_root', args.android_sdk_root])
|
||||
subprocess.check_call(cmd)
|
||||
|
||||
cmd = ['python', upload_script, '-t', cwd]
|
||||
if args.gsutil:
|
||||
cmd.extend(['--gsutil', args.gsutil])
|
||||
subprocess.check_call(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Trap exceptions to avoid printing two stacktraces.
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
16
infra/bots/assets/android_sdk/download.py
Executable file
16
infra/bots/assets/android_sdk/download.py
Executable file
@ -0,0 +1,16 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Download the current version of the asset."""
|
||||
|
||||
|
||||
import common
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
common.run('download')
|
16
infra/bots/assets/android_sdk/upload.py
Executable file
16
infra/bots/assets/android_sdk/upload.py
Executable file
@ -0,0 +1,16 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Upload a new version of the asset."""
|
||||
|
||||
|
||||
import common
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
common.run('upload')
|
@ -1,129 +0,0 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
"""Isolate a locally-managed Android SDK."""
|
||||
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import shlex
|
||||
import shutil
|
||||
import subprocess
|
||||
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(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)
|
||||
shutil.copytree(android_sdk_root, sdk_dir)
|
||||
isolate_file = os.path.join(os.getcwd(), ISOLATE_FILE_NAME)
|
||||
shutil.copyfile(repo_isolate_file, isolate_file)
|
||||
|
||||
# Isolate the SDK.
|
||||
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',
|
||||
'--isolate-server', 'https://isolateserver.appspot.com',
|
||||
'-i', isolate_file,
|
||||
'-s', 'android_sdk.isolated',
|
||||
'--extra-variable', 'ANDROID_SDK_DIR=%s' % android_sdk_relpath]
|
||||
isolate_out = subprocess.check_output(isolate_cmd).rstrip()
|
||||
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):
|
||||
with utils.git_branch():
|
||||
hash_file = os.path.join('infra', 'bots', 'android_sdk_hash')
|
||||
with open(hash_file, 'w') as f:
|
||||
f.write(isolated_hash)
|
||||
subprocess.check_call([utils.GIT, 'add', hash_file])
|
||||
subprocess.check_call([utils.GIT, 'commit', '-m', 'Update Android SDK'])
|
||||
subprocess.check_call([utils.GIT, 'cl', 'upload', '--bypass-hooks'])
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--android_sdk_root', required=True)
|
||||
args = parser.parse_args()
|
||||
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)
|
||||
update_sdk_file(skia_path, isolated_hash)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user