mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
We saw issues with /srv/zulip_npm_cache being cleaned incorrectly by this tool in production (more correctly, we noticed broken symlinks to those directories, even from the current deployment). Print-debugging showed that indeed older deployments were being ignored, because the logic for `get_caches_in_use` was totally broken (this was sorta masked because we also keep the last week's deployments). The specific bug here turned out to be that we weren't passing the `production` argument to generate_sha1sum_node_modules, but the broader problem is that this logic isn't robust to changes in the hashing algorithm. Fix this by replacing the broken logic for trying to compute the correct hash for that deployment with just checking the symlink inside the deployment to let it self-report. We can't easily do this same change for clean-venv-cache, because we use multiple virtualenvs there. But a similar change could be useful for the emoji cache as well. Fixes #8116.
61 lines
2.2 KiB
Python
Executable File
61 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
if False:
|
|
from typing import Set, Text
|
|
|
|
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
sys.path.append(ZULIP_PATH)
|
|
from scripts.lib.node_cache import generate_sha1sum_node_modules
|
|
from scripts.lib.zulip_tools import get_caches_to_be_purged, \
|
|
get_environment, get_recent_deployments, parse_cache_script_args, \
|
|
purge_unused_caches
|
|
|
|
ENV = get_environment()
|
|
NODE_MODULES_CACHE_PATH = "/srv/zulip-npm-cache"
|
|
if ENV == "travis":
|
|
NODE_MODULES_CACHE_PATH = os.path.join(os.environ["HOME"], "zulip-npm-cache")
|
|
try:
|
|
subprocess.check_output(["/home/travis/zulip-yarn/bin/yarn", '--version'])
|
|
except OSError:
|
|
print('yarn not found. Most probably we are running static-analysis and '
|
|
'hence yarn is not installed. Exiting without cleaning npm cache.')
|
|
sys.exit(0)
|
|
|
|
def get_caches_in_use(threshold_days):
|
|
# type: (int) -> Set[Text]
|
|
setups_to_check = set([ZULIP_PATH, ])
|
|
caches_in_use = set()
|
|
|
|
if ENV == "prod":
|
|
setups_to_check |= get_recent_deployments(threshold_days)
|
|
if ENV == "dev":
|
|
# In dev always include the currently active cache in order
|
|
# not to break current installation in case dependencies
|
|
# are updated with bumping the provision version.
|
|
CURRENT_CACHE = os.path.dirname(os.path.realpath(os.path.join(ZULIP_PATH, "node_modules")))
|
|
caches_in_use.add(CURRENT_CACHE)
|
|
|
|
for setup_dir in setups_to_check:
|
|
node_modules_link_path = os.path.join(setup_dir, "node_modules")
|
|
if not os.path.exists(node_modules_link_path):
|
|
# If 'package.json' file doesn't exist then no node_modules
|
|
# cache is associated with this setup.
|
|
continue
|
|
caches_in_use.add(os.readlink(node_modules_link_path))
|
|
|
|
return caches_in_use
|
|
|
|
def main():
|
|
# type: () -> None
|
|
args = parse_cache_script_args("This script cleans unused zulip npm caches.")
|
|
caches_in_use = get_caches_in_use(args.threshold_days)
|
|
purge_unused_caches(
|
|
NODE_MODULES_CACHE_PATH, caches_in_use, "node modules cache", args)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|