xref: /aosp_15_r20/tools/treble/build/sandbox/rbe_action.py (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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