| #!/usr/bin/env python |
| # Copyright 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. |
| |
| # See https://github.com/domokit/sky_engine/wiki/Release-process |
| |
| import argparse |
| import os |
| import subprocess |
| import sys |
| import distutils.util |
| |
| |
| DRY_RUN = False |
| |
| |
| def run(cwd, args): |
| print 'RUNNING:', ' '.join(args), 'IN:', cwd |
| if DRY_RUN: |
| return |
| subprocess.check_call(args, cwd=cwd) |
| |
| |
| def confirm(prompt): |
| user_input = raw_input("%s (y/N) " % prompt) |
| try: |
| return distutils.util.strtobool(user_input) == 1 |
| except ValueError: |
| return False |
| |
| |
| def git_revision(cwd): |
| return subprocess.check_output([ |
| 'git', 'rev-parse', 'HEAD', |
| ], cwd=cwd).strip() |
| |
| |
| class Artifact(object): |
| def __init__(self, category, name): |
| self.category = category |
| self.name = name |
| |
| |
| GS_URL = 'gs://mojo/sky/%(category)s/%(config)s/%(commit_hash)s/%(name)s' |
| |
| |
| ARTIFACTS = { |
| 'android-arm': [ |
| Artifact('shell', 'SkyShell.apk'), |
| Artifact('viewer', 'sky_viewer.mojo'), |
| Artifact('viewer', 'libsky_viewer_library.so'), |
| ], |
| 'linux-x64': [ |
| Artifact('shell', 'icudtl.dat'), |
| Artifact('shell', 'sky_shell'), |
| Artifact('shell', 'sky_snapshot'), |
| Artifact('viewer', 'sky_viewer.mojo'), |
| Artifact('viewer', 'libsky_viewer_library.so'), |
| ] |
| } |
| |
| |
| def upload_artifacts(dist_root, config, commit_hash): |
| for artifact in ARTIFACTS[config]: |
| src = os.path.join(artifact.category, artifact.name) |
| dst = GS_URL % { |
| 'category': artifact.category, |
| 'config': config, |
| 'commit_hash': commit_hash, |
| 'name': artifact.name, |
| } |
| z = ','.join([ 'mojo', 'dat' ]) |
| run(dist_root, ['gsutil', 'cp', '-z', z, src, dst]) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description='Deploy!') |
| parser.add_argument('--dry-run', action='store_true', default=False, |
| help='Just print commands w/o executing.') |
| parser.add_argument('--revision', help='The git revision to publish.') |
| args = parser.parse_args() |
| |
| global DRY_RUN |
| DRY_RUN = args.dry_run |
| |
| engine_root = os.path.abspath('.') |
| if not os.path.exists(os.path.join(engine_root, 'sky')): |
| print "Cannot find //sky. Is %s the Flutter engine repository?" % engine_root |
| return 1 |
| |
| commit_hash = git_revision(engine_root) |
| |
| if commit_hash != args.revision: |
| print "Current revision %s does not match requested revision %s." % (commit_hash, args.revision) |
| print "Please update the current revision to %s." % args.revision |
| return 1 |
| |
| # Derived paths: |
| dart_sdk_root = os.path.join(engine_root, 'third_party/dart-sdk/dart-sdk') |
| pub_path = os.path.join(dart_sdk_root, 'bin/pub') |
| android_dist_root = os.path.join(engine_root, 'out/android_Release/dist') |
| linux_dist_root = os.path.join(engine_root, 'out/Release/dist') |
| sky_engine_package_root = os.path.join(android_dist_root, 'packages/sky_engine/sky_engine') |
| sky_services_package_root = os.path.join(android_dist_root, 'packages/sky_services/sky_services') |
| sky_engine_revision_file = os.path.join(sky_engine_package_root, 'lib', 'REVISION') |
| |
| run(engine_root, ['sky/tools/gn', '--android', '--release']) |
| run(engine_root, ['ninja', '-C', 'out/android_Release', ':dist']) |
| |
| run(engine_root, ['sky/tools/gn', '--release']) |
| run(engine_root, ['ninja', '-C', 'out/Release', ':dist']) |
| |
| with open(sky_engine_revision_file, 'w') as stream: |
| stream.write(commit_hash) |
| |
| upload_artifacts(android_dist_root, 'android-arm', commit_hash) |
| upload_artifacts(linux_dist_root, 'linux-x64', commit_hash) |
| |
| run(sky_engine_package_root, [pub_path, 'publish', '--force']) |
| run(sky_services_package_root, [pub_path, 'publish', '--force']) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |