Files
zulip/scripts/lib/upgrade-zulip-from-git
Alex Vandiver 4c8502f7fd upgrade: Show fewer stacktraces.
The stacktraces here are seldom useful -- for the calls to
upgrade-stage-2, we know precisely what was run.  For the `run`
wrapper, the output contains the command that failed, which is
sufficient to identify where in the upgrade process it was.  Showing
more stacktrace below the actual error merely confuses users and
scrolls the real error off of the screen.
2021-04-21 09:51:40 -07:00

103 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import logging
import os
import subprocess
import sys
import time
LOCAL_GIT_CACHE_DIR = "/srv/zulip.git"
os.environ["PYTHONUNBUFFERED"] = "y"
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))
from scripts.lib.zulip_tools import (
DEPLOYMENTS_DIR,
assert_running_as_root,
get_config,
get_config_file,
get_deploy_options,
get_deployment_lock,
make_deploy_path,
overwrite_symlink,
release_deployment_lock,
su_to_zulip,
)
config_file = get_config_file()
deploy_options = get_deploy_options(config_file)
remote_url = get_config(
config_file, "deployment", "git_repo_url", "https://github.com/zulip/zulip.git"
)
assert_running_as_root(strip_lib_from_paths=True)
# make sure we have appropriate file permissions
os.umask(0o22)
logging.Formatter.converter = time.gmtime
logging.basicConfig(format="%(asctime)s upgrade-zulip-from-git: %(message)s", level=logging.INFO)
parser = argparse.ArgumentParser()
parser.add_argument("refname", help="Git reference, e.g. a branch, tag, or commit ID.")
parser.add_argument(
"--remote-url", help="Override the Git remote URL configured in /etc/zulip/zulip.conf."
)
args = parser.parse_args()
refname = args.refname
# Command line remote URL will be given preference above the one
# in /etc/zulip/zulip.conf.
if args.remote_url:
remote_url = args.remote_url
os.makedirs(DEPLOYMENTS_DIR, exist_ok=True)
os.makedirs("/home/zulip/logs", exist_ok=True)
error_rerun_script = f"{DEPLOYMENTS_DIR}/current/scripts/upgrade-zulip-from-git {refname}"
get_deployment_lock(error_rerun_script)
try:
deploy_path = make_deploy_path()
if not os.path.exists(LOCAL_GIT_CACHE_DIR):
logging.info("Cloning the repository")
subprocess.check_call(
["git", "clone", "-q", remote_url, "--mirror", LOCAL_GIT_CACHE_DIR],
stdout=open("/dev/null", "w"),
)
if os.stat(LOCAL_GIT_CACHE_DIR).st_uid == 0:
subprocess.check_call(["chown", "-R", "zulip:zulip", LOCAL_GIT_CACHE_DIR])
logging.info("Fetching the latest commits")
os.chdir(LOCAL_GIT_CACHE_DIR)
subprocess.check_call(
["git", "remote", "set-url", "origin", remote_url], preexec_fn=su_to_zulip
)
subprocess.check_call(["git", "fetch", "-q", "--tags"], preexec_fn=su_to_zulip)
subprocess.check_call(
["git", "clone", "-q", "-b", refname, LOCAL_GIT_CACHE_DIR, deploy_path],
stdout=open("/dev/null", "w"),
preexec_fn=su_to_zulip,
)
os.chdir(deploy_path)
overwrite_symlink("/etc/zulip/settings.py", "zproject/prod_settings.py")
overwrite_symlink(deploy_path, os.path.join(DEPLOYMENTS_DIR, "next"))
try:
subprocess.check_call(
[
os.path.join(deploy_path, "scripts", "lib", "upgrade-zulip-stage-2"),
deploy_path,
"--from-git",
*deploy_options,
]
)
except subprocess.CalledProcessError:
# There's no use in showing a stacktrace here; it just hides
# the error from stage 2.
sys.exit(1)
finally:
release_deployment_lock()