| # Copyright 2020 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Runs a single action remotely with RBE.""" |
| |
| import argparse |
| import os |
| import rbe |
| import subprocess |
| import sys |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) |
| parser.add_argument( |
| '--command', |
| default='echo RBE check successful.', |
| help='Command to run remotely with RBE.') |
| parser.add_argument( |
| '--print', '-p', |
| action='store_true', |
| help='Prints the executed commands') |
| args = parser.parse_args() |
| |
| env = [] |
| cleanup = rbe.setup(env, sys.stdout if args.print else subprocess.DEVNULL) |
| src_root = os.path.normpath( |
| os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../..')) |
| env = rbe.env_array_to_dict(rbe.prepare_env(env)) |
| env['PATH'] = os.getenv('PATH') |
| for d in ['FLAG_log_dir', 'RBE_output_dir', 'RBE_proxy_log_dir']: |
| env[d] = '/tmp' # We want the logs in /tmp instead of out. |
| try: |
| # Bootstrap the RBE proxy. |
| bootstrap_cmd = rbe.get_nsjail_bin_wrapper() + \ |
| [os.path.join(rbe.TOOLS_DIR, 'bootstrap')] |
| shell_env = ' '.join(['%s=%s' % (k,v) for k, v in env.items()]) |
| if args.print: |
| print('Bootstrap RBE reproxy:') |
| print('cd ' + src_root) |
| print('%s %s' % (shell_env, ' '.join(bootstrap_cmd))) |
| subprocess.check_call( |
| bootstrap_cmd, env=env, cwd=src_root, stdout=subprocess.DEVNULL) |
| # Execute the remote command. |
| rewrapper_cmd = rbe.get_nsjail_bin_wrapper() + [ |
| os.path.join(rbe.TOOLS_DIR, 'rewrapper'), |
| '--platform=container-image=docker://gcr.io/androidbuild-re-dockerimage/android-build-remoteexec-image@sha256:582efb38f0c229ea39952fff9e132ccbe183e14869b39888010dacf56b360d62', \ |
| '--labels=type=tool', |
| '--exec_strategy=remote', |
| '--dial_timeout=5s', |
| '--exec_root=' + src_root, |
| '--', |
| ] + args.command.split() |
| if args.print: |
| print('Run remote command with RBE:') |
| print('%s %s' % (shell_env, ' '.join(rewrapper_cmd))) |
| subprocess.check_call(rewrapper_cmd, env=env, cwd=src_root) |
| finally: |
| # Shut down the RBE proxy. |
| if args.print: |
| print('RBE proxy shutdown:') |
| print('killall reproxy') |
| subprocess.call( |
| ['killall', 'reproxy'], |
| stdout=subprocess.DEVNULL, |
| stderr=subprocess.DEVNULL) |
| cleanup() |
| |
| |
| if __name__ == '__main__': |
| main() |