| #!/usr/bin/env python |
| # Copyright (c) 2015 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. |
| |
| |
| """Download recipe prerequisites and run a single recipe.""" |
| |
| |
| import base64 |
| import json |
| import os |
| import subprocess |
| import sys |
| import tarfile |
| import urllib2 |
| import zlib |
| |
| |
| def download(source, dest): |
| u = urllib2.urlopen(source) # TODO: Verify certificate? |
| with open(dest, 'wb') as f: |
| while True: |
| buf = u.read(8192) |
| if not buf: |
| break |
| f.write(buf) |
| |
| |
| def unzip(source, dest): |
| with tarfile.open(source, 'r') as z: |
| z.extractall(dest) |
| |
| |
| def get_infra(dt_dir, root_dir): |
| fetch = os.path.join(dt_dir, 'fetch.py') |
| subprocess.check_call([sys.executable, fetch, 'infra'], cwd=root_dir) |
| |
| |
| def seed_properties(args): |
| # Assumes args[0] is factory properties and args[1] is build properties. |
| fact_prop_str = args[0][len('--factory-properties-gz='):] |
| build_prop_str = args[1][len('--build-properties-gz='):] |
| fact_prop = json.loads(zlib.decompress(base64.b64decode(fact_prop_str))) |
| build_prop = json.loads(zlib.decompress(base64.b64decode(build_prop_str))) |
| for k, v in fact_prop.iteritems(): |
| print '@@@SET_BUILD_PROPERTY@%s@%s@@@' % (k, v) |
| for k, v in build_prop.iteritems(): |
| print '@@@SET_BUILD_PROPERTY@%s@%s@@@' % (k, v) |
| |
| |
| def main(args): |
| cwd = os.getcwd() |
| |
| # Bootstrap depot tools (required for fetching build/infra) |
| dt_url = 'https://storage.googleapis.com/dumbtest/depot_tools.tar.gz' |
| dt_dir = os.path.join(cwd, 'staging') |
| os.makedirs(dt_dir) |
| dt_zip = os.path.join(dt_dir, 'depot_tools.tar.gz') |
| download(dt_url, os.path.join(dt_zip)) |
| unzip(dt_zip, dt_dir) |
| dt_path = os.path.join(dt_dir, 'depot_tools') |
| os.environ['PATH'] = '%s:%s' % (dt_path, os.environ['PATH']) |
| |
| # Fetch infra (which comes with build, which comes with recipes) |
| root_dir = os.path.join(cwd, 'b') |
| os.makedirs(root_dir) |
| get_infra(dt_path, root_dir) |
| work_dir = os.path.join(root_dir, 'build', 'slave', 'bot', 'build') |
| os.makedirs(work_dir) |
| |
| # Emit annotations that encapsulates build properties. |
| seed_properties(args) |
| |
| # JUST DO IT. |
| cmd = [sys.executable, '-u', '../../../scripts/slave/annotated_run.py'] |
| cmd.extend(args) |
| subprocess.check_call(cmd, cwd=work_dir) |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |