diff --git a/Readme.md b/Readme.md index a0d4830..6849c86 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -# Heroku buildpack: Python +# Heroku Buildpack: Python ![python-banner](https://cloud.githubusercontent.com/assets/51578/8914205/ecf2047c-346b-11e5-98c5-42547f9f4410.jpg) This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/). @@ -42,7 +42,7 @@ Specify a Runtime You can also provide arbitrary releases Python with a `runtime.txt` file. $ cat runtime.txt - python-3.5.0 + python-3.5.1 Runtime options include: diff --git a/bin/compile b/bin/compile index 26930bb..f932cb5 100755 --- a/bin/compile +++ b/bin/compile @@ -48,6 +48,8 @@ export PATH=$PATH:$ROOT_DIR/vendor/pip-pop # Sanitizing environment variables. unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH +unset RECEIVE_DATA SOURCE_VERSION RUN_KEY BUILD_INFO DEPLOY +unset LOG_TOKEN DYNO CYTOKINE_LOG_FILE GEM_PATH bpwatch init $LOGPLEX_KEY bpwatch build python $BUILDPACK_VERSION $REQUEST_ID diff --git a/bin/steps/collectstatic b/bin/steps/collectstatic index 4ba2bc6..4b095fe 100755 --- a/bin/steps/collectstatic +++ b/bin/steps/collectstatic @@ -1,36 +1,62 @@ #!/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. + 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 -bpwatch start collectstatic +# Ensure that Django is explicitily specified in requirments.txt +pip-grep -s requirements.txt django Django && DJANGO_INSTALLED=1 -if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ]; then +bpwatch start collectstatic # metrics collection + +if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then set +e - echo "-----> Preparing static assets" - # Check if collectstatic is configured properly. - python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null && RUN_COLLECTSTATIC=true + echo "-----> Preparing static assets with 'collectstatic'" - # Compile assets if collectstatic appears to be kosher. - if [ "$RUN_COLLECTSTATIC" ]; then + # Run collectstatic, cleanup some of the noisy output. + python $MANAGE_FILE collectstatic --noinput --traceback 2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent + echo + python $MANAGE_FILE collectstatic 2>&1 | sed '/^Copying/d;/^$/d' | indent + COLLECTSTATIC_STATUS="${PIPESTATUS[0]}" - echo " Running collectstatic..." - python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Post-processed/d;/^Copying/d;/^$/d;/^ /d' | indent + set -e + + # Display a warning if collectstatic failed. + [ $COLLECTSTATIC_STATUS -ne 0 ] && { + echo + echo " ! Error while runnning '$ python $MANAGE_FILE collectstatic --noinput'." + echo " See traceback above for more details." + echo " More info: http://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 + } - [ $? -ne 0 ] && { - echo " ! Error running 'manage.py collectstatic'. More info:" - echo " http://devcenter.heroku.com/articles/django-assets" - } - else - echo " Collectstatic configuration error. To debug, run:" - echo " $ heroku run python $MANAGE_FILE collectstatic --noinput" - fi echo fi -bpwatch stop collectstatic +bpwatch stop collectstatic # metrics collection diff --git a/bin/utils b/bin/utils index 3655142..ff93b53 100755 --- a/bin/utils +++ b/bin/utils @@ -88,6 +88,10 @@ sub-env() { WHITELIST=${2:-''} BLACKLIST=${3:-'^(GIT_DIR|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'} + # Python-specific variables. + export PYHONHOME=$BUILD_DIR/.heroku/python + export PYTHONPATH=$BUILD_DIR/ + ( if [ -d "$ENV_DIR" ]; then for e in $(ls $ENV_DIR); do