1 #!/usr/bin/env python 2 # Copyright (c) 2014 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 7 """Run the webpages_playback automation script.""" 8 9 10 import os 11 import subprocess 12 import sys 13 14 sys.path.insert(0, os.getcwd()) 15 16 from common.py.utils import gs_utils 17 from common.py.utils import shell_utils 18 19 20 SKP_VERSION_FILE = 'SKP_VERSION' 21 22 23 def _get_skp_version(): 24 """Find an unused SKP version.""" 25 current_skp_version = None 26 with open(SKP_VERSION_FILE) as f: 27 current_skp_version = int(f.read().rstrip()) 28 29 # Find the first SKP version which has no uploaded SKPs. 30 new_version = current_skp_version + 1 31 while True: 32 gs_path = 'playback_%d/skps' % new_version 33 if not gs_utils.GSUtils().does_storage_object_exist('chromium-skia-gm', 34 gs_path): 35 return new_version 36 new_version += 1 37 38 39 def main(chrome_src_path, browser_executable, dry_run): 40 browser_executable = os.path.realpath(browser_executable) 41 dry_run = (dry_run == 'True') 42 skp_version = _get_skp_version() 43 print 'SKP_VERSION=%d' % skp_version 44 45 if os.environ.get('CHROME_HEADLESS'): 46 # Start Xvfb if running on a bot. 47 try: 48 shell_utils.run('sudo Xvfb :0 -screen 0 1280x1024x24 &', shell=True) 49 except Exception: 50 # It is ok if the above command fails, it just means that DISPLAY=:0 51 # is already up. 52 pass 53 54 upload_dir = 'playback_%d' % skp_version 55 webpages_playback_cmd = [ 56 'python', os.path.join(os.path.dirname(os.path.realpath(__file__)), 57 'webpages_playback.py'), 58 '--page_sets', 'all', 59 '--browser_executable', browser_executable, 60 '--non-interactive', 61 '--upload', 62 '--alternate_upload_dir', upload_dir, 63 '--chrome_src_path', chrome_src_path, 64 ] 65 if not dry_run: 66 webpages_playback_cmd.append('--upload_to_partner_bucket') 67 68 try: 69 shell_utils.run(webpages_playback_cmd) 70 finally: 71 # Clean up any leftover browser instances. This can happen if there are 72 # telemetry crashes, processes are not always cleaned up appropriately by 73 # the webpagereplay and telemetry frameworks. 74 procs = subprocess.check_output(['ps', 'ax']) 75 for line in procs.splitlines(): 76 if browser_executable in line: 77 pid = line.strip().split(' ')[0] 78 if pid != str(os.getpid()) and not 'python' in line: 79 try: 80 shell_utils.run(['kill', '-9', pid]) 81 except shell_utils.CommandFailedException as e: 82 print e 83 else: 84 print 'Refusing to kill self.' 85 86 print 'writing %s: %s' % (SKP_VERSION_FILE, skp_version) 87 with open(SKP_VERSION_FILE, 'w') as f: 88 f.write(str(skp_version)) 89 90 91 if '__main__' == __name__: 92 if len(sys.argv) != 4: 93 print >> sys.stderr, ('USAGE: %s <chrome src path> <browser executable> ' 94 '<dry run>') 95 sys.exit(1) 96 main(*sys.argv[1:]) 97