#!/usr/bin/env bash # Django Collectstatic runner. If you have Django installed, collectstatic will # automatically be executed as part of the build process. If collectstatic # fails, your build fails. # This functionality will only activate if Django is in requirements.txt. # Runtime arguments: # - $DISABLE_COLLECTSTATIC: disables this functionality. # - $DEBUG_COLLECTSTATIC: upon failure, print out environment variables. # shellcheck source=bin/utils source "$BIN_DIR/utils" # Location of 'manage.py', if it exists. MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1) MANAGE_FILE=${MANAGE_FILE:-fakepath} # Legacy file-based support for $DISABLE_COLLECTSTATIC [ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1 # Ensure that Django is actually installed. is_module_available 'django' && DJANGO_INSTALLED=1 if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then set +e puts-step "$ python $MANAGE_FILE collectstatic --noinput" # Run collectstatic, cleanup some of the noisy output. PYTHONPATH=${PYTHONPATH:-.} export PYTHONPATH # Create a temporary file for collecting the collectstaic logs. COLLECTSTATIC_LOG=$(mktemp) python "$MANAGE_FILE" collectstatic --noinput --traceback 2>&1 | tee "$COLLECTSTATIC_LOG" | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent COLLECTSTATIC_STATUS="${PIPESTATUS[0]}" set -e # Display a warning if collectstatic failed. [ "$COLLECTSTATIC_STATUS" -ne 0 ] && { if grep -q 'SyntaxError' "$COLLECTSTATIC_LOG"; then mcount "failure.collectstatic.syntax-error" elif grep -q 'ImproperlyConfigured' "$COLLECTSTATIC_LOG"; then mcount "failure.collectstatic.improper-configuration" elif grep -q 'The CSS file' "$COLLECTSTATIC_LOG"; then mcount "failure.collectstatic.fancy-references" elif grep -q 'OSError' "$COLLECTSTATIC_LOG"; then mcount "failure.collectstatic.missing-file" else mcount "failure.collectstatic.other" fi echo echo " ! Error while running '$ python $MANAGE_FILE collectstatic --noinput'." echo " See traceback above for details." echo echo " You may need to update application code to resolve this error." echo " Or, you can disable collectstatic for this application:" echo echo " $ heroku config:set DISABLE_COLLECTSTATIC=1" echo echo " https://devcenter.heroku.com/articles/django-assets" # Additionally, dump out the environment, if debug mode is on. if [ "$DEBUG_COLLECTSTATIC" ]; then echo echo "****** Collectstatic environment variables:" echo env | indent fi # Abort the build. exit 1 } echo fi