1*105f6285SAndroid Build Coastguard Worker# Copyright 2020 Google LLC 2*105f6285SAndroid Build Coastguard Worker# 3*105f6285SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*105f6285SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*105f6285SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*105f6285SAndroid Build Coastguard Worker# 7*105f6285SAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*105f6285SAndroid Build Coastguard Worker# 9*105f6285SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*105f6285SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*105f6285SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*105f6285SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*105f6285SAndroid Build Coastguard Worker# limitations under the License. 14*105f6285SAndroid Build Coastguard Worker 15*105f6285SAndroid Build Coastguard Worker"""Runs a single action remotely with RBE.""" 16*105f6285SAndroid Build Coastguard Worker 17*105f6285SAndroid Build Coastguard Workerimport argparse 18*105f6285SAndroid Build Coastguard Workerimport os 19*105f6285SAndroid Build Coastguard Workerimport rbe 20*105f6285SAndroid Build Coastguard Workerimport subprocess 21*105f6285SAndroid Build Coastguard Workerimport sys 22*105f6285SAndroid Build Coastguard Worker 23*105f6285SAndroid Build Coastguard Worker 24*105f6285SAndroid Build Coastguard Workerdef main(): 25*105f6285SAndroid Build Coastguard Worker parser = argparse.ArgumentParser( 26*105f6285SAndroid Build Coastguard Worker description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) 27*105f6285SAndroid Build Coastguard Worker parser.add_argument( 28*105f6285SAndroid Build Coastguard Worker '--command', 29*105f6285SAndroid Build Coastguard Worker default='echo RBE check successful.', 30*105f6285SAndroid Build Coastguard Worker help='Command to run remotely with RBE.') 31*105f6285SAndroid Build Coastguard Worker parser.add_argument( 32*105f6285SAndroid Build Coastguard Worker '--print', '-p', 33*105f6285SAndroid Build Coastguard Worker action='store_true', 34*105f6285SAndroid Build Coastguard Worker help='Prints the executed commands') 35*105f6285SAndroid Build Coastguard Worker args = parser.parse_args() 36*105f6285SAndroid Build Coastguard Worker 37*105f6285SAndroid Build Coastguard Worker env = [] 38*105f6285SAndroid Build Coastguard Worker cleanup = rbe.setup(env, sys.stdout if args.print else subprocess.DEVNULL) 39*105f6285SAndroid Build Coastguard Worker src_root = os.path.normpath( 40*105f6285SAndroid Build Coastguard Worker os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../..')) 41*105f6285SAndroid Build Coastguard Worker env = rbe.env_array_to_dict(rbe.prepare_env(env)) 42*105f6285SAndroid Build Coastguard Worker env['PATH'] = os.getenv('PATH') 43*105f6285SAndroid Build Coastguard Worker env['HOME'] = os.getenv('HOME') 44*105f6285SAndroid Build Coastguard Worker for d in ['FLAG_log_dir', 'RBE_output_dir', 'RBE_proxy_log_dir']: 45*105f6285SAndroid Build Coastguard Worker env[d] = '/tmp' # We want the logs in /tmp instead of out. 46*105f6285SAndroid Build Coastguard Worker try: 47*105f6285SAndroid Build Coastguard Worker # Bootstrap the RBE proxy. 48*105f6285SAndroid Build Coastguard Worker bootstrap_cmd = rbe.get_nsjail_bin_wrapper() + \ 49*105f6285SAndroid Build Coastguard Worker [os.path.join(rbe.TOOLS_DIR, 'bootstrap')] 50*105f6285SAndroid Build Coastguard Worker shell_env = ' '.join(['%s=%s' % (k,v) for k, v in env.items()]) 51*105f6285SAndroid Build Coastguard Worker if args.print: 52*105f6285SAndroid Build Coastguard Worker print('Bootstrap RBE reproxy:') 53*105f6285SAndroid Build Coastguard Worker print('cd ' + src_root) 54*105f6285SAndroid Build Coastguard Worker print('%s %s' % (shell_env, ' '.join(bootstrap_cmd))) 55*105f6285SAndroid Build Coastguard Worker subprocess.check_call( 56*105f6285SAndroid Build Coastguard Worker bootstrap_cmd, env=env, cwd=src_root, stdout=subprocess.DEVNULL) 57*105f6285SAndroid Build Coastguard Worker # Execute the remote command. 58*105f6285SAndroid Build Coastguard Worker rewrapper_cmd = rbe.get_nsjail_bin_wrapper() + [ 59*105f6285SAndroid Build Coastguard Worker os.path.join(rbe.TOOLS_DIR, 'rewrapper'), 60*105f6285SAndroid Build Coastguard Worker '--platform=container-image=docker://gcr.io/androidbuild-re-dockerimage/android-build-remoteexec-image@sha256:582efb38f0c229ea39952fff9e132ccbe183e14869b39888010dacf56b360d62', \ 61*105f6285SAndroid Build Coastguard Worker '--labels=type=tool', 62*105f6285SAndroid Build Coastguard Worker '--exec_strategy=remote', 63*105f6285SAndroid Build Coastguard Worker '--dial_timeout=5s', 64*105f6285SAndroid Build Coastguard Worker '--exec_root=' + src_root, 65*105f6285SAndroid Build Coastguard Worker '--', 66*105f6285SAndroid Build Coastguard Worker ] + args.command.split() 67*105f6285SAndroid Build Coastguard Worker if args.print: 68*105f6285SAndroid Build Coastguard Worker print('Run remote command with RBE:') 69*105f6285SAndroid Build Coastguard Worker print('%s %s' % (shell_env, ' '.join(rewrapper_cmd))) 70*105f6285SAndroid Build Coastguard Worker subprocess.check_call(rewrapper_cmd, env=env, cwd=src_root) 71*105f6285SAndroid Build Coastguard Worker finally: 72*105f6285SAndroid Build Coastguard Worker # Shut down the RBE proxy. 73*105f6285SAndroid Build Coastguard Worker if args.print: 74*105f6285SAndroid Build Coastguard Worker print('RBE proxy shutdown:') 75*105f6285SAndroid Build Coastguard Worker print('killall reproxy') 76*105f6285SAndroid Build Coastguard Worker subprocess.call( 77*105f6285SAndroid Build Coastguard Worker ['killall', 'reproxy'], 78*105f6285SAndroid Build Coastguard Worker stdout=subprocess.DEVNULL, 79*105f6285SAndroid Build Coastguard Worker stderr=subprocess.DEVNULL) 80*105f6285SAndroid Build Coastguard Worker cleanup() 81*105f6285SAndroid Build Coastguard Worker 82*105f6285SAndroid Build Coastguard Worker 83*105f6285SAndroid Build Coastguard Workerif __name__ == '__main__': 84*105f6285SAndroid Build Coastguard Worker main() 85