mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
Zulip's previous model for managing static asset files via Django pipeline had some broken behavior around upgrades. In particular, it was for some reason storing the information as to which static files should be used in a memcached cache that was shared between different deployments of Zulip. This means that during the upgrade process, some clients might be served a version of the static assets that does not correspond to the server they were connected to. We've replaced that model with using ManifestStaticFilesStorage, which instead allows each Zulip deployment directory to have its own complete copy of the mapping of files to static assets, as it should be. We have to do a little bit of hackery with the staticfiles.json path to make this work, basically because Django expects staticfiles.json to be under STATIC_ROOT (aka the path nginx is serving to users), but doing that doesn't really make sense for Zulip, since that directory is shared between different deployments.
121 lines
3.3 KiB
Bash
Executable File
121 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eux
|
|
|
|
usage() {
|
|
echo "Usage: $0 [--py3] <ZULIP_VERSION>" >&2
|
|
exit 1
|
|
}
|
|
|
|
args="$(getopt -o '' -l 'py3' -n "$0" -- "$@")"
|
|
eval "set -- $args"
|
|
|
|
py3=
|
|
while true; do
|
|
case "$1" in
|
|
--py3) py3=t; shift;;
|
|
--) shift; break;;
|
|
*) usage;;
|
|
esac
|
|
done
|
|
|
|
GITID=$(git rev-parse HEAD)
|
|
|
|
if [ -z "${1:-}" ]; then
|
|
usage
|
|
fi
|
|
version="$1"
|
|
prefix="zulip-server-$version"
|
|
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
TMPDIR=/tmp/voyager-build
|
|
rm -Rf "$TMPDIR"
|
|
mkdir -p "$TMPDIR"
|
|
else
|
|
TMPDIR=$(mktemp -d)
|
|
fi
|
|
|
|
if ! git diff --exit-code >/dev/null; then
|
|
set +x
|
|
echo; echo "\033[31mWARNING: tarballs builds are based on a commit hash so your changes will not be included\033[0m"; echo
|
|
set -x
|
|
fi
|
|
|
|
TMP_CHECKOUT=$TMPDIR/$prefix/
|
|
TARBALL=$TMPDIR/$prefix.tar
|
|
|
|
# .gitattributes lists the files that are not exported
|
|
git archive -o "$TARBALL" "--prefix=$prefix/" HEAD
|
|
|
|
|
|
if tar -tf "$TARBALL" | grep -q -e zilencer -e zproject/local_settings.py -e puppet/zulip_internal; then
|
|
echo "Excluded files remain in tarball!";
|
|
echo "Versions of git 1.8.1.1 - 1.8.1.6 have broken .gitattributes syntax";
|
|
exit 1;
|
|
else
|
|
echo "Check for excluded files passed";
|
|
fi
|
|
|
|
if [ "$py3" ]; then
|
|
tools/replace-tarball-shebang \
|
|
'#!/usr/bin/env python' '#!/usr/bin/env python3' \
|
|
< "$TARBALL" > "$TARBALL.new"
|
|
mv "$TARBALL.new" "$TARBALL"
|
|
fi
|
|
|
|
# Check out a temporary full copy of the index to generate static files
|
|
git checkout-index -f -a --prefix "$TMP_CHECKOUT"
|
|
cd "$TMP_CHECKOUT"
|
|
|
|
# create var/log directory in the new temporary checkout
|
|
mkdir -p "var/log"
|
|
|
|
# Some settings need to be updated for update-prod-static to work
|
|
#
|
|
# TODO: Would be much better to instead run the below tools with some
|
|
# sort of environment hack to make settings.VOYAGER=True so that we
|
|
# don't need to create this dummy secrets file.
|
|
cat >> zproject/prod_settings_template.py <<EOF
|
|
DEBUG = False
|
|
EOF
|
|
cat >> zproject/dev-secrets.conf <<EOF
|
|
[secrets]
|
|
local_database_password = ''
|
|
secret_key = 'not_used_here'
|
|
shared_secret = 'not_used_here'
|
|
avatar_salt = 'not_used_here'
|
|
rabbitmq_password = 'not_used_here'
|
|
initial_password_salt = 'not_used_here'
|
|
EOF
|
|
|
|
# update-prod-static generates the prod-static directory.
|
|
# See COLLECTSTATIC in settings.py
|
|
set +x
|
|
# We do a bit of gymnastics to have update-prod-static.log be easily
|
|
# visible to the user and end up in the same directory as the final
|
|
# release tarball.
|
|
USER_PROD_STATIC_LOGPATH="${TMPDIR}/update-prod-static.log"
|
|
BUILD_PROD_STATIC_LOGPATH="${TMP_CHECKOUT}/var/log/update-prod-static.log"
|
|
ln -nfs "$BUILD_PROD_STATIC_LOGPATH" "$USER_PROD_STATIC_LOGPATH"
|
|
echo; echo -e "\033[33mRunning update-prod-static; check ${TMPDIR}/update-prod-static.log if it fails\033[0m"; echo
|
|
set -x
|
|
|
|
./tools/update-prod-static
|
|
echo "$GITID" > build_id
|
|
echo "$version" > version
|
|
rm -f "$USER_PROD_STATIC_LOGPATH"
|
|
mv "$BUILD_PROD_STATIC_LOGPATH" "$USER_PROD_STATIC_LOGPATH"
|
|
|
|
rm -f zproject/dev-secrets.conf
|
|
|
|
# We don't need duplicate copies of emoji with hashed paths, and they would break bugdown
|
|
find prod-static/serve/generated/emoji/images/emoji/ -regex '.*\.[0-9a-f]+\.png' -delete
|
|
|
|
cd "$TMPDIR"
|
|
|
|
tar --append -f "$TARBALL" "$prefix/prod-static" "$prefix/build_id" "$prefix/version" "$prefix/staticfiles.json"
|
|
|
|
rm -rf "$prefix"
|
|
|
|
gzip "$TARBALL"
|
|
echo "Generated $TARBALL.gz"
|