#!/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 CONFIRM_MESSAGE = """This tool is destructive and will revert your current branch to upstream/master among other things. Are you sure you wish to continue?""" 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'), ], 'linux-x64': [ Artifact('shell', 'icudtl.dat'), Artifact('shell', 'sky_shell'), Artifact('viewer', 'sky_viewer.mojo'), ] } 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('sky_engine_root', help='Path to sky_engine/src') parser.add_argument('--dry-run', action='store_true', default=False, help='Just print commands w/o executing.') parser.add_argument('--no-pub-publish', dest='publish', action='store_false', default=True, help='Skip pub publish step.') args = parser.parse_args() global DRY_RUN DRY_RUN = args.dry_run if not args.dry_run and not confirm(CONFIRM_MESSAGE): print "Aborted." return 1 sky_engine_root = os.path.abspath(os.path.expanduser(args.sky_engine_root)) # Derived paths: dart_sdk_root = os.path.join(sky_engine_root, 'third_party/dart-sdk/dart-sdk') pub_path = os.path.join(dart_sdk_root, 'bin/pub') android_dist_root = os.path.join(sky_engine_root, 'out/android_Release/dist') linux_dist_root = os.path.join(sky_engine_root, 'out/Release/dist') sky_package_root = os.path.join(linux_dist_root, 'sdk/sky') run(sky_engine_root, ['git', 'fetch', 'upstream']) run(sky_engine_root, ['git', 'reset', 'upstream/master', '--hard']) run(sky_engine_root, ['gclient', 'sync']) commit_hash = git_revision(sky_engine_root) run(sky_engine_root, ['sky/tools/gn', '--android', '--release']) run(sky_engine_root, ['ninja', '-C', 'out/android_Release', ':dist']) run(sky_engine_root, ['sky/tools/gn', '--release']) run(sky_engine_root, ['ninja', '-C', 'out/Release', ':dist']) upload_artifacts(android_dist_root, 'android-arm', commit_hash) upload_artifacts(linux_dist_root, 'linux-x64', commit_hash) if args.publish: run(sky_package_root, [pub_path, 'publish', '--force']) if __name__ == '__main__': sys.exit(main())