def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option('-t', '--no-tests', action="store_true", dest="notests", help="Don't run 'make check' before deploy", default="") parser.add_option('--all-tests', action="store_true", dest="alltests", help="Run 'make allcheck' before deploy, instead of 'make check'", default="") parser.add_option('-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option('-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option('-r', '--report', action="store_true", dest="report", help="Generate a report that displays minified, gzipped file size for " "each package element", default=False) parser.add_option('-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) parser.add_option('-p', '--force-priming', action="store_true", dest="force_priming", help=("Prime instances after the deploy, even if a version name is " "specified (by default, only daily deploys with no version " "names have caches primed and many instances thrown up"), default=False) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = hg_st() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 if not options.noup: version = hg_pull_up() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying " print "from a directory with the appropriate secrets.py." return # Delete obsolete .pyc files, that do not have an associated .py file. delete_orphan_pyc_files('.') if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return if not compile_less_stylesheets(): print "Failed to compile less stylesheets, bailing." return compress_js() compress_css() compress_exercises() if not options.notests: if not run_tests(options.alltests): print "Some tests failed, bailing." return if not options.dryrun: last_version = None changeset_authors = [] if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return else: # Default deploy from tip of tree - find the changesets delta # from the last daily (most likely the last prod default) last_version = guess_last_prod_version() if last_version: changeset_authors = get_changeset_authors(last_version) print "Deploying version " + str(version) (email, password) = get_app_engine_credentials() with VersionedConfigs(version): success = deploy(version, email, password) if success: send_hipchat_deploy_message(last_version, version, includes_local_changes, email, changeset_authors) open_browser_to_ka_version(version) if options.force_priming or not options.version: # For default/daily deploys (where no version is specified) # and when explicitly told to, we send a bunch of requests to # the new version to prime it up for real users. prime_cache(version) start_many_instances(version) # TODO(benkomalo): auto-tag this version? But this should # only happen if this version gets marked as stable. How can # we do this so it's semi-automatic and hard to forget, but is # also accurate? end = datetime.datetime.now() print "Done. Duration: %s" % (end - start)
def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option( '-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option( '-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option( '-r', '--report', action="store_true", dest="report", help= "Generate a report that displays minified, gzipped file size for each package element", default=False) parser.add_option( '-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = hg_st() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 last_version = None if not options.noup: version = hg_pull_up() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying from a directory with" print "the appropriate secrets.py." return if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return if not compile_less_stylesheets(): print "Failed to compile less stylesheets, bailing." return compress_js() compress_css() compress_exercises() if not options.dryrun: changeset_authors = [] if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return else: # TODO(benkomalo): figure out a way to programmatically do this # without having the deployer enter the SHA of the current default. # For now, just open the versions page for the deployer. # Default deploy from tip of tree - find the changesets delta # from the last production default. _quiet_browser_open( "https://appengine.google.com/deployment?&app_id=s~khan-academy" ) last_version = raw_input( "Changeset SHA of the current default version: ").strip() if last_version: changeset_authors = get_changeset_authors(last_version) print "Deploying version " + str(version) (email, password) = get_app_engine_credentials() success = deploy(version, email, password) if success: send_hipchat_deploy_message(version, includes_local_changes, email, changeset_authors) open_browser_to_ka_version(version) prime_cache(version) end = datetime.datetime.now() print "Done. Duration: %s" % (end - start)
def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="AUTO") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option('-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option('-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option('-r', '--report', action="store_true", dest="report", help="Generate a report that displays minified, gzipped file size for each package element", default=False) parser.add_option('-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) parser.add_option('--set-default', action="store_true", dest="set_default_version", help="Set the newly created version as the default version to serve", default=False) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = git_status() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 if not options.noup: version = git_pull() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying from a directory with the appropriate secrets.py." return if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return compress_js() compress_css() compress_exercises() if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return if version == "AUTO": version = time.strftime("%Y-%m-%d-") + git_version() print "Deploying version " + str(version) if not options.dryrun: (email, password) = get_app_engine_credentials() success = deploy(version, email, password) if success: # open_browser_to_ka_version(version) prime_cache(version) if options.set_default_version: set_default_version(version, email, password) end = datetime.datetime.now() print "Done. Duration: %s" % (end - start) return success
def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option('-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option('-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option('-r', '--report', action="store_true", dest="report", help="Generate a report that displays minified, gzipped file size for each package element", default=False) parser.add_option('-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = hg_st() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 last_version = None if not options.noup: version = hg_pull_up() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying from a directory with" print "the appropriate secrets.py." return if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return if not compile_less_stylesheets(): print "Failed to compile less stylesheets, bailing." return compress_js() compress_css() compress_exercises() if not options.dryrun: changeset_authors = [] if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return else: # TODO(benkomalo): figure out a way to programmatically do this # without having the deployer enter the SHA of the current default. # For now, just open the versions page for the deployer. # Default deploy from tip of tree - find the changesets delta # from the last production default. _quiet_browser_open("https://appengine.google.com/deployment?&app_id=s~khan-academy") last_version = raw_input( "Changeset SHA of the current default version: ").strip() if last_version: changeset_authors = get_changeset_authors(last_version) print "Deploying version " + str(version) (email, password) = get_app_engine_credentials() success = deploy(version, email, password) if success: send_hipchat_deploy_message(version, includes_local_changes, email, changeset_authors) open_browser_to_ka_version(version) prime_cache(version) end = datetime.datetime.now() print "Done. Duration: %s" % (end - start)
def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option('-t', '--no-tests', action="store_true", dest="notests", help="Don't run 'make check' before deploy", default="") parser.add_option( '--all-tests', action="store_true", dest="alltests", help="Run 'make allcheck' before deploy, instead of 'make check'", default="") parser.add_option( '-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option( '-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option( '-r', '--report', action="store_true", dest="report", help="Generate a report that displays minified, gzipped file size for " "each package element", default=False) parser.add_option( '-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) parser.add_option( '-p', '--force-priming', action="store_true", dest="force_priming", help=("Prime instances after the deploy, even if a version name is " "specified (by default, only daily deploys with no version " "names have caches primed and many instances thrown up"), default=False) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = hg_st() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 if not options.noup: version = hg_pull_up() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying " print "from a directory with the appropriate secrets.py." return # Delete obsolete .pyc files, that do not have an associated .py file. delete_orphan_pyc_files('.') if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return if not compile_less_stylesheets(): print "Failed to compile less stylesheets, bailing." return compress_js() compress_css() compress_exercises() if not options.notests: if not run_tests(options.alltests): print "Some tests failed, bailing." return if not options.dryrun: last_version = None changeset_authors = [] if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return else: # Default deploy from tip of tree - find the changesets delta # from the last daily (most likely the last prod default) last_version = guess_last_prod_version() if last_version: changeset_authors = get_changeset_authors(last_version) print "Deploying version " + str(version) (email, password) = get_app_engine_credentials() with VersionedConfigs(version): success = deploy(version, email, password) if success: send_hipchat_deploy_message(last_version, version, includes_local_changes, email, changeset_authors) open_browser_to_ka_version(version) if options.force_priming or not options.version: # For default/daily deploys (where no version is specified) # and when explicitly told to, we send a bunch of requests to # the new version to prime it up for real users. prime_cache(version) start_many_instances(version) # TODO(benkomalo): auto-tag this version? But this should # only happen if this version gets marked as stable. How can # we do this so it's semi-automatic and hard to forget, but is # also accurate? end = datetime.datetime.now() print "Done. Duration: %s" % (end - start)
def main(): start = datetime.datetime.now() parser = optparse.OptionParser() parser.add_option('-f', '--force', action="store_true", dest="force", help="Force deploy even with local changes", default=False) parser.add_option('-v', '--version', action="store", dest="version", help="Override the deployed version identifier", default="AUTO") parser.add_option('-x', '--no-up', action="store_true", dest="noup", help="Don't hg pull/up before deploy", default="") parser.add_option( '-s', '--no-secrets', action="store_true", dest="nosecrets", help="Don't check for production secrets.py file before deploying", default="") parser.add_option( '-d', '--dryrun', action="store_true", dest="dryrun", help="Dry run without the final deploy-to-App-Engine step", default=False) parser.add_option( '-r', '--report', action="store_true", dest="report", help= "Generate a report that displays minified, gzipped file size for each package element", default=False) parser.add_option( '-n', '--no-npm', action="store_false", dest="node", help="Don't check for local npm modules and don't install/update them", default=True) parser.add_option( '--set-default', action="store_true", dest="set_default_version", help="Set the newly created version as the default version to serve", default=False) options, args = parser.parse_args() if options.node: print "Checking for node and dependencies" if not check_deps(): return if options.report: print "Generating file size report" compile_handlebar_templates() compress.file_size_report() return includes_local_changes = git_status() if not options.force and includes_local_changes: print "Local changes found in this directory, canceling deploy." return version = -1 if not options.noup: version = git_pull() if version <= 0: print "Could not find version after 'hg pull', 'hg up', 'hg tip'." return if not options.nosecrets: if not check_secrets(): print "Stopping deploy. It doesn't look like you're deploying from a directory with the appropriate secrets.py." return if not compile_templates(): print "Failed to compile jinja templates, bailing." return if not compile_handlebar_templates(): print "Failed to compile handlebars templates, bailing." return compress_js() compress_css() compress_exercises() if options.version: version = options.version elif options.noup: print 'You must supply a version when deploying with --no-up' return if version == "AUTO": version = time.strftime("%Y-%m-%d-") + git_version() print "Deploying version " + str(version) if not options.dryrun: (email, password) = get_app_engine_credentials() success = deploy(version, email, password) if success: # open_browser_to_ka_version(version) prime_cache(version) if options.set_default_version: set_default_version(version, email, password) end = datetime.datetime.now() print "Done. Duration: %s" % (end - start) return success