123 lines
4.3 KiB
Bash
Executable file
123 lines
4.3 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
function is_django_installed() {
|
|
python -c "import django" &>/dev/null
|
|
}
|
|
|
|
function should_collectstatic() {
|
|
is_django_installed && [[ -z "$DISABLE_COLLECTSTATIC" ]]
|
|
}
|
|
|
|
function virtualenv_bin() {
|
|
# New versions of Python (>3.6) should use venv module
|
|
# from stdlib instead of virtualenv package
|
|
python3.10 -m venv $1
|
|
}
|
|
|
|
# Install pipenv or micropipenv to the separate virtualenv to isolate it
|
|
# from system Python packages and packages in the main
|
|
# virtualenv. Executable is simlinked into ~/.local/bin
|
|
# to be accessible. This approach is inspired by pipsi
|
|
# (pip script installer).
|
|
function install_tool() {
|
|
echo "---> Installing $1 packaging tool ..."
|
|
VENV_DIR=$HOME/.local/venvs/$1
|
|
virtualenv_bin "$VENV_DIR"
|
|
# First, try to install the tool without --isolated which means that if you
|
|
# have your own PyPI mirror, it will take it from there. If this try fails, try it
|
|
# again with --isolated which ignores external pip settings (env vars, config file)
|
|
# and installs the tool from PyPI (needs internet connetion).
|
|
# $1$2 combines package name with [extras] or version specifier if is defined as $2```
|
|
if ! $VENV_DIR/bin/pip install -U $1$2; then
|
|
echo "WARNING: Installation of $1 failed, trying again from official PyPI with pip --isolated install"
|
|
$VENV_DIR/bin/pip install --isolated -U $1$2 # Combines package name with [extras] or version specifier if is defined as $2```
|
|
fi
|
|
mkdir -p $HOME/.local/bin
|
|
ln -s $VENV_DIR/bin/$1 $HOME/.local/bin/$1
|
|
}
|
|
|
|
set -e
|
|
|
|
# First of all, check that we don't have disallowed combination of ENVs
|
|
if [[ ! -z "$ENABLE_PIPENV" && ! -z "$ENABLE_MICROPIPENV" ]]; then
|
|
echo "ERROR: Pipenv and micropipenv cannot be enabled at the same time!"
|
|
# podman/buildah does not relay this exit code but it will be fixed hopefuly
|
|
# https://github.com/containers/buildah/issues/2305
|
|
exit 3
|
|
fi
|
|
|
|
shopt -s dotglob
|
|
echo "---> Installing application source ..."
|
|
mv /tmp/src/* "$HOME"
|
|
|
|
# set permissions for any installed artifacts
|
|
fix-permissions /opt/app-root -P
|
|
|
|
|
|
if [[ ! -z "$UPGRADE_PIP_TO_LATEST" ]]; then
|
|
echo "---> Upgrading pip, setuptools and wheel to latest version ..."
|
|
if ! pip install -U pip setuptools wheel; then
|
|
echo "WARNING: Installation of the latest pip, setuptools and wheel failed, trying again from official PyPI with pip --isolated install"
|
|
pip install --isolated -U pip setuptools wheel
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -z "$ENABLE_PIPENV" ]]; then
|
|
if [[ ! -z "$PIN_PIPENV_VERSION" ]]; then
|
|
# Add == as a prefix to pipenv version, if defined
|
|
PIN_PIPENV_VERSION="==$PIN_PIPENV_VERSION"
|
|
fi
|
|
install_tool "pipenv" "$PIN_PIPENV_VERSION"
|
|
echo "---> Installing dependencies via pipenv ..."
|
|
if [[ -f Pipfile ]]; then
|
|
pipenv install --deploy
|
|
elif [[ -f requirements.txt ]]; then
|
|
pipenv install -r requirements.txt
|
|
fi
|
|
# pipenv check
|
|
elif [[ ! -z "$ENABLE_MICROPIPENV" ]]; then
|
|
install_tool "micropipenv" "[toml]"
|
|
echo "---> Installing dependencies via micropipenv ..."
|
|
# micropipenv detects Pipfile.lock and requirements.txt in this order
|
|
micropipenv install --deploy
|
|
elif [[ -f requirements.txt ]]; then
|
|
echo "---> Installing dependencies ..."
|
|
pip install -r requirements.txt
|
|
fi
|
|
|
|
if [[ ( -f setup.py || -f setup.cfg ) && -z "$DISABLE_SETUP_PY_PROCESSING" ]]; then
|
|
echo "---> Installing application ..."
|
|
pip install .
|
|
fi
|
|
|
|
if should_collectstatic; then
|
|
(
|
|
echo "---> Collecting Django static files ..."
|
|
|
|
APP_HOME=$(readlink -f "${APP_HOME:-.}")
|
|
# Change the working directory to APP_HOME
|
|
PYTHONPATH="$(pwd)${PYTHONPATH:+:$PYTHONPATH}"
|
|
cd "$APP_HOME"
|
|
|
|
# Look for 'manage.py' in the current directory
|
|
manage_file=./manage.py
|
|
|
|
if [[ ! -f "$manage_file" ]]; then
|
|
echo "WARNING: seems that you're using Django, but we could not find a 'manage.py' file."
|
|
echo "'manage.py collectstatic' ignored."
|
|
exit
|
|
fi
|
|
|
|
if ! python $manage_file collectstatic --dry-run --noinput &> /dev/null; then
|
|
echo "WARNING: could not run 'manage.py collectstatic'. To debug, run:"
|
|
echo " $ python $manage_file collectstatic --noinput"
|
|
echo "Ignore this warning if you're not serving static files with Django."
|
|
exit
|
|
fi
|
|
|
|
python $manage_file collectstatic --noinput
|
|
)
|
|
fi
|
|
|
|
# set permissions for any installed artifacts
|
|
fix-permissions /opt/app-root -P
|