|  | #!/usr/bin/env python | 
|  | # Copyright 2017 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. | 
|  |  | 
|  | """ | 
|  | This script runs swarming_xcode_install on the bots.  It should be run when we | 
|  | need to upgrade all the swarming testers.  It: | 
|  | 1) Packages two python files into an isolate. | 
|  | 2) Runs the isolate on swarming machines that satisfy certain dimensions. | 
|  |  | 
|  | Example usage: | 
|  | $  ./build/run_swarming_xcode_install.py  --luci_path ~/work/luci-py \ | 
|  | --swarming-server touch-swarming.appspot.com \ | 
|  | --isolate-server touch-isolate.appspot.com | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  | import tempfile | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser( | 
|  | description='Run swarming_xcode_install on the bots.') | 
|  | parser.add_argument('--luci_path', required=True, type=os.path.abspath) | 
|  | parser.add_argument('--swarming-server', required=True, type=str) | 
|  | parser.add_argument('--isolate-server', required=True, type=str) | 
|  | parser.add_argument('--batches', type=int, default=25, | 
|  | help="Run xcode install in batches of size |batches|.") | 
|  | parser.add_argument('--dimension', nargs=2, action='append') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | args.dimension = args.dimension or [] | 
|  |  | 
|  | script_dir = os.path.dirname(os.path.abspath(__file__)) | 
|  | tmp_dir = tempfile.mkdtemp(prefix='swarming_xcode') | 
|  | try: | 
|  | print 'Making isolate.' | 
|  | shutil.copyfile(os.path.join(script_dir, 'swarming_xcode_install.py'), | 
|  | os.path.join(tmp_dir, 'swarming_xcode_install.py')) | 
|  | shutil.copyfile(os.path.join(script_dir, 'mac_toolchain.py'), | 
|  | os.path.join(tmp_dir, 'mac_toolchain.py')) | 
|  |  | 
|  | luci_client = os.path.join(args.luci_path, 'client') | 
|  | cmd = [ | 
|  | sys.executable, os.path.join(luci_client, 'isolateserver.py'), 'archive', | 
|  | '-I', args.isolate_server, tmp_dir, | 
|  | ] | 
|  | isolate_hash = subprocess.check_output(cmd).split()[0] | 
|  |  | 
|  | print 'Running swarming_xcode_install.' | 
|  | # TODO(crbug.com/765361): The dimensions below should be updated once | 
|  | # swarming for iOS is fleshed out, likely removing xcode_version 9 and | 
|  | # adding different dimensions. | 
|  | luci_tools = os.path.join(luci_client, 'tools') | 
|  | dimensions = [['pool', 'Chrome'], ['xcode_version', '9.0']] + args.dimension | 
|  | dim_args = [] | 
|  | for d in dimensions: | 
|  | dim_args += ['--dimension'] + d | 
|  | cmd = [ | 
|  | sys.executable, os.path.join(luci_tools, 'run_on_bots.py'), | 
|  | '--swarming', args.swarming_server, '--isolate-server', | 
|  | args.isolate_server, '--priority', '20', '--batches', str(args.batches), | 
|  | '--tags', 'name:run_swarming_xcode_install', | 
|  | ] + dim_args + ['--name', 'run_swarming_xcode_install', '--', isolate_hash, | 
|  | 'python', 'swarming_xcode_install.py', | 
|  | ] | 
|  | subprocess.check_call(cmd) | 
|  | print 'All tasks completed.' | 
|  |  | 
|  | finally: | 
|  | shutil.rmtree(tmp_dir) | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |