mirror of
https://github.com/zulip/zulip.git
synced 2025-10-26 09:34:02 +00:00
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.
103 lines
3.1 KiB
Python
Executable File
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()
|