mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
146 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 39d64c5fd1 | |||
| 645cf5e338 | |||
| 7430c48b72 | |||
| 783d9e4b12 | |||
| eab957c8c9 | |||
| 6e80c391a8 | |||
| 58bae65a28 | |||
| 70d8c7a625 | |||
| 66611ca21a | |||
| 20fe371ac7 | |||
| d23143b801 | |||
| c98615cdd0 | |||
| 0749a04773 | |||
| a4f072714d | |||
| 427ec9e431 | |||
| 168939d14f | |||
| 58ecbd8a73 | |||
| 10eb361975 | |||
| 1242d71382 | |||
| 6ef93693c5 | |||
| 69b8b25322 | |||
| b706cd13f7 | |||
| 724e51b5c7 | |||
| 7b4835a98e | |||
| 477773b331 | |||
| c98c481f24 | |||
| 462fe074f9 | |||
| 70bfc5eab3 | |||
| a4d2592438 | |||
| 8306f84236 | |||
| 6952a2e728 | |||
| 7142c747f4 | |||
| 11db8e126a | |||
| 6f1fce3cdb | |||
| b2e12f9ec8 | |||
| 44f8e393d6 | |||
| b8cbc64d20 | |||
| 5d51be5679 | |||
| d550b8cd15 | |||
| 25b28af19d | |||
| dbe2cdac37 | |||
| 767af30453 | |||
| df02e34a5b | |||
| 26c918863e | |||
| 1c458cee2e | |||
| 433570c27b | |||
| 30cb4ecef3 | |||
| 84e2a51337 | |||
| f1c2bc39d2 | |||
| ad53dc61f0 | |||
| 8598296756 | |||
| f5ef10326e | |||
| 16ec3c8325 | |||
| 49676e12af | |||
| 0aa123995b | |||
| cd4d811d4f | |||
| 76ebf9279b | |||
| 3c3e621040 | |||
| 40e91ffa67 | |||
| 72710696a0 | |||
| d27228999d | |||
| a4e8ba3cdf | |||
| e27b5656fd | |||
| f132d3198a | |||
| 6afd6bbce9 | |||
| 6fa14b55d3 | |||
| 8f4eb44d36 | |||
| 67f4c4238a | |||
| ffb89feb0d | |||
| 45b00e32a7 | |||
| 90edd88b22 | |||
| 2533cc68c1 | |||
| a11a765b93 | |||
| 6505f98bae | |||
| eb3e7851f7 | |||
| 78b6142d18 | |||
| af58f322e2 | |||
| e4bcc68c9a | |||
| 9a024b8595 | |||
| 581177b219 | |||
| 669f0b0e2a | |||
| e5ac89c4df | |||
| 1e8ad56b0f | |||
| b6607f0f42 | |||
| 8615bf5272 | |||
| 7f475977b5 | |||
| 53eee452eb | |||
| 031c9d576f | |||
| b0568b5f90 | |||
| 359a3b0d61 | |||
| d46e0efc16 | |||
| b97a104ad6 | |||
| a2ee94a8fb | |||
| 3b35c2c296 | |||
| 97834d305a | |||
| 86a53e6479 | |||
| 8c746e3e17 | |||
| b1d1a7cca5 | |||
| f172a83d48 | |||
| 4346b41c70 | |||
| 195ed4ae15 | |||
| e4fee65430 | |||
| 4f10a7e14a | |||
| a637ec3d11 | |||
| 1dd7be4250 | |||
| c2b9121436 | |||
| 567120b4bc | |||
| b61a395cd0 | |||
| 2a3962aea7 | |||
| 364ddc98b7 | |||
| d93d283be2 | |||
| 42141c2bf9 | |||
| d82c898509 | |||
| 6545d71b46 | |||
| 93b707eae5 | |||
| 8d358218f8 | |||
| b84b168be8 | |||
| 35c810e46d | |||
| e1ea2f9354 | |||
| 7db6ea33ac | |||
| a53826a673 | |||
| b7ecb49a96 | |||
| 911140b3ac | |||
| f1c4efb464 | |||
| 5a979874ad | |||
| a32ca25520 | |||
| e304089c3e | |||
| 5d8932e5ee | |||
| 7770ab8ff2 | |||
| 277294817a | |||
| 25b17d51c3 | |||
| ac103519f8 | |||
| e8b8af045f | |||
| 0bb6d6e2bd | |||
| 0184dcac24 | |||
| 558e748e9e | |||
| dec86fbc2e | |||
| ddc310084b | |||
| 2a6053ec2c | |||
| 86e0e29a41 | |||
| bc754f402b | |||
| ea5bc23a76 | |||
| 46ecf15337 | |||
| d020d20bde | |||
| 01ff4269f2 | |||
| f507bb0c05 |
@@ -1,5 +1,50 @@
|
||||
# Python Buildpack Changelog
|
||||
|
||||
## v78 (2016-03-18)
|
||||
|
||||
Added automatic configuration of Gunicorn's `FORWARDED_ALLOW_IPS` setting.
|
||||
|
||||
Improved detection of libffi dependency when using bcrypt via `Django[bcrypt]`.
|
||||
|
||||
Improved GDAL support.
|
||||
|
||||
- GDAL dependency detection now checks for pygdal and is case-insensitive.
|
||||
- The vendored GDAL library has been updated to 1.11.1.
|
||||
- GDAL bootstrapping now also installs the GEOS and Proj.4 libraries.
|
||||
|
||||
Updated pip to 8.1.1 and setuptools to 20.3.
|
||||
|
||||
## v77 (2016-02-10)
|
||||
|
||||
Improvements to warnings and minor bugfix.
|
||||
|
||||
## v76 (2016-02-08)
|
||||
|
||||
Improved Django collectstatic support.
|
||||
|
||||
- `$ python manage.py collectstatic` will only be run if `Django` is present in `requirements.txt`.
|
||||
- If collectstatic fails, the build fails. Full traceback is provided.
|
||||
- `$DISABLE_COLLECTSTATIC`: skip collectstatic step completely (not new).
|
||||
- `$DEBUG_COLLECTSTATIC`: echo environment variables upon collectstatic failure.
|
||||
- Updated build output style.
|
||||
- New warning for outdated Python (via pip `InsecurePlatform` warning).
|
||||
|
||||
## v75 (2016-01-29)
|
||||
|
||||
Updated pip and Setuptools.
|
||||
|
||||
## v74 (2015-12-29)
|
||||
|
||||
Added warnings for lack of Procfile.
|
||||
|
||||
## v72 (2015-12-07)
|
||||
|
||||
Updated default Python to 2.7.11.
|
||||
|
||||
## v72 (2015-12-03)
|
||||
|
||||
Added friendly warnings for common build failures.
|
||||
|
||||
## v70 (2015-10-29)
|
||||
|
||||
Improved compatibility with multi and node.js buildpacks.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License:
|
||||
|
||||
Copyright (C) 2013 Heroku, Inc.
|
||||
Copyright (C) 2016 Heroku, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
||||
@@ -1,52 +1,54 @@
|
||||
# Heroku buildpack: Python
|
||||

|
||||
# Heroku Buildpack: Python
|
||||

|
||||
|
||||
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/).
|
||||
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](https://pip.pypa.io/) and other excellent software.
|
||||
|
||||
Recommended web frameworks include **Django** and **Flask**. The recommended webserver is **Gunicorn**. There are no restrictions around what software can be used (as long as it's pip-installable). Web processes must bind to `$PORT`, and only the HTTP protocol is permitted for incoming connections.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Some Python packages with obscure C dependencies (e.g. scipy) are [not compatible](https://devcenter.heroku.com/articles/python-c-deps).
|
||||
|
||||
Example usage:
|
||||
See it in Action
|
||||
----------------
|
||||
|
||||
Deploying a Python application couldn't be easier:
|
||||
|
||||
$ ls
|
||||
Procfile requirements.txt web.py
|
||||
|
||||
$ heroku create --buildpack git://github.com/heroku/heroku-buildpack-python.git
|
||||
$ heroku create --buildpack heroku/python
|
||||
|
||||
$ git push heroku master
|
||||
...
|
||||
-----> Python app detected
|
||||
-----> Installing runtime (python-2.7.10)
|
||||
-----> Installing dependencies using pip
|
||||
Downloading/unpacking requests (from -r requirements.txt (line 1))
|
||||
-----> Installing python-2.7.11
|
||||
$ pip install -r requirements.txt
|
||||
Collecting requests (from -r requirements.txt (line 1))
|
||||
Downloading requests-2.9.1-py2.py3-none-any.whl (501kB)
|
||||
Installing collected packages: requests
|
||||
Successfully installed requests
|
||||
Cleaning up...
|
||||
Successfully installed requests-2.9.1
|
||||
|
||||
-----> Discovering process types
|
||||
Procfile declares types -> (none)
|
||||
|
||||
You can also add it to upcoming builds of an existing application:
|
||||
A `requirements.txt` file must be present at the root of your application's repository.
|
||||
|
||||
$ heroku buildpacks:set git://github.com/heroku/heroku-buildpack-python.git
|
||||
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
|
||||
|
||||
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root.
|
||||
$ heroku buildpacks:set heroku/python
|
||||
|
||||
It will use Pip to install your dependencies, vendoring a copy of the Python runtime into your slug.
|
||||
|
||||
Specify a Runtime
|
||||
-----------------
|
||||
Specify a Python Runtime
|
||||
------------------------
|
||||
|
||||
You can also provide arbitrary releases Python with a `runtime.txt` file.
|
||||
Specific versions of the Python runtime can be specified with a `runtime.txt` file:
|
||||
|
||||
$ cat runtime.txt
|
||||
python-3.5.0
|
||||
python-3.5.1
|
||||
|
||||
Runtime options include:
|
||||
|
||||
- python-2.7.10
|
||||
- python-3.5.0
|
||||
- pypy-2.6.1 (unsupported, experimental)
|
||||
- pypy3-2.4.0 (unsupported, experimental)
|
||||
- `python-2.7.11`
|
||||
- `python-3.5.1`
|
||||
- `pypy-4.0.1` (unsupported, experimental)
|
||||
|
||||
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well.
|
||||
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well. Use at your own risk.
|
||||
|
||||
+42
-18
@@ -1,5 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# The Heroku Python Buildpack. This script accepts parameters for a build
|
||||
# directory, a cache directory, and a directory for app environment variables.
|
||||
|
||||
# Warning: there are a few hacks in this script to accommodate excellent builds
|
||||
# on Heroku. No guarantee for external compatibility is made. However,
|
||||
# everything should work fine outside of the Heroku environment, if the
|
||||
# environment is setup correctly.
|
||||
|
||||
# Usage:
|
||||
#
|
||||
# $ bin/compile <build-dir> <cache-dir> <env-path>
|
||||
@@ -23,11 +31,15 @@ ENV_DIR=$3
|
||||
VIRTUALENV_LOC=".heroku/venv"
|
||||
LEGACY_TRIGGER="lib/python2.7"
|
||||
|
||||
DEFAULT_PYTHON_VERSION="python-2.7.10"
|
||||
DEFAULT_PYTHON_STACK="cedar"
|
||||
DEFAULT_PYTHON_VERSION="python-2.7.11"
|
||||
DEFAULT_PYTHON_STACK="cedar-14"
|
||||
PYTHON_EXE="/app/.heroku/python/bin/python"
|
||||
PIP_VERSION="7.1.2"
|
||||
SETUPTOOLS_VERSION="18.3.2"
|
||||
PIP_VERSION="8.1.1"
|
||||
SETUPTOOLS_VERSION="20.3"
|
||||
|
||||
# Common Problem Warnings
|
||||
export WARNINGS_LOG=$(mktemp)
|
||||
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
|
||||
|
||||
# Setup bpwatch
|
||||
export PATH=$PATH:$ROOT_DIR/vendor/bpwatch
|
||||
@@ -45,7 +57,10 @@ export PATH=$PATH:$ROOT_DIR/vendor/pip-pop
|
||||
|
||||
# Sanitizing environment variables.
|
||||
unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH
|
||||
unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN DYNO
|
||||
unset CYTOKINE_LOG_FILE GEM_PATH
|
||||
|
||||
# Setup buildpack instrumentation.
|
||||
bpwatch init $LOGPLEX_KEY
|
||||
bpwatch build python $BUILDPACK_VERSION $REQUEST_ID
|
||||
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
||||
@@ -55,7 +70,10 @@ bpwatch start compile
|
||||
# Syntax sugar.
|
||||
source $BIN_DIR/utils
|
||||
|
||||
# Directory Hacks for path consistiency.
|
||||
# Import collection of warnings.
|
||||
source $BIN_DIR/warnings
|
||||
|
||||
# Directory Hacks for path consistency.
|
||||
APP_DIR='/app'
|
||||
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
||||
|
||||
@@ -85,12 +103,12 @@ BUILD_DIR=$APP_DIR
|
||||
|
||||
# Set up outputs under new context
|
||||
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
||||
WEBCONCURRENCY_PROFILE_PATH="$BUILD_DIR/.profile.d/python.webconcurrency.sh"
|
||||
GUNICORN_PROFILE_PATH="$BUILD_DIR/.profile.d/python.gunicorn.sh"
|
||||
|
||||
# We'll need to send these statics to other scripts we `source`.
|
||||
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
|
||||
|
||||
# Prepend proper path buildpack use.
|
||||
# Prepend proper environment variables for Python use.
|
||||
export PATH=$BUILD_DIR/.heroku/python/bin:$BUILD_DIR/.heroku/vendor/bin:$PATH
|
||||
export PYTHONUNBUFFERED=1
|
||||
export LANG=en_US.UTF-8
|
||||
@@ -103,12 +121,18 @@ export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:$BUILD_DIR/.heroku/ven
|
||||
# Switch to the repo's context.
|
||||
cd $BUILD_DIR
|
||||
|
||||
# Warn for lack of Procfile.
|
||||
if [[ ! -f Procfile ]]; then
|
||||
puts-warn 'Warning: Your application is missing a Procfile. This file tells Heroku how to run your application.'
|
||||
puts-warn 'Learn more: https://devcenter.heroku.com/articles/procfile'
|
||||
fi
|
||||
|
||||
# Experimental pre_compile hook.
|
||||
bpwatch start pre_compile
|
||||
source $BIN_DIR/steps/hooks/pre_compile
|
||||
bpwatch stop pre_compile
|
||||
|
||||
# If no requirements given, assume `setup.py develop`.
|
||||
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
||||
if [ ! -f requirements.txt ]; then
|
||||
echo "-e ." > requirements.txt
|
||||
fi
|
||||
@@ -123,7 +147,7 @@ fi
|
||||
if [ -f $CACHE_DIR/.heroku/python-stack ]; then
|
||||
CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
|
||||
else
|
||||
CACHED_PYTHON_STACK=$DEFAULT_PYTHON_STACK
|
||||
CACHED_PYTHON_STACK=$STACK
|
||||
fi
|
||||
|
||||
# If no runtime given, assume default version.
|
||||
@@ -131,7 +155,7 @@ if [ ! -f runtime.txt ]; then
|
||||
echo $DEFAULT_PYTHON_VERSION > runtime.txt
|
||||
fi
|
||||
|
||||
# ### The Cache
|
||||
# Prepare the cache.
|
||||
mkdir -p $CACHE_DIR
|
||||
|
||||
# Purge "old-style" virtualenvs.
|
||||
@@ -177,6 +201,9 @@ source $BIN_DIR/steps/pylibmc
|
||||
# Libffi support.
|
||||
source $BIN_DIR/steps/cryptography
|
||||
|
||||
# Support for Geo libraries.
|
||||
sub-env $BIN_DIR/steps/geo-libs
|
||||
|
||||
# GDAL support.
|
||||
source $BIN_DIR/steps/gdal
|
||||
|
||||
@@ -187,10 +214,7 @@ source $BIN_DIR/steps/pip-install
|
||||
sub-env $BIN_DIR/steps/collectstatic
|
||||
|
||||
|
||||
# ### Finalize
|
||||
#
|
||||
|
||||
# Set context environment variables.
|
||||
# Create .profile script for application runtime environment variables.
|
||||
set-env PATH '$HOME/.heroku/python/bin:$PATH'
|
||||
set-env PYTHONUNBUFFERED true
|
||||
set-env PYTHONHOME /app/.heroku/python
|
||||
@@ -200,8 +224,8 @@ set-default-env LANG en_US.UTF-8
|
||||
set-default-env PYTHONHASHSEED random
|
||||
set-default-env PYTHONPATH /app/
|
||||
|
||||
# Install sane-default script for WEB_CONCURRENCY environment variable.
|
||||
cp $ROOT_DIR/vendor/python.webconcurrency.sh $WEBCONCURRENCY_PROFILE_PATH
|
||||
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
||||
cp $ROOT_DIR/vendor/python.gunicorn.sh $GUNICORN_PROFILE_PATH
|
||||
|
||||
|
||||
# Experimental post_compile hook.
|
||||
@@ -221,13 +245,13 @@ bpwatch start dump_cache
|
||||
mkdir -p $CACHE_DIR/.heroku
|
||||
cp -R .heroku/python $CACHE_DIR/.heroku/
|
||||
cp -R .heroku/python-version $CACHE_DIR/.heroku/
|
||||
cp -R .heroku/python-stack $CACHE_DIR/.heroku/
|
||||
cp -R .heroku/python-stack $CACHE_DIR/.heroku/ &> /dev/null || true
|
||||
cp -R .heroku/vendor $CACHE_DIR/.heroku/ &> /dev/null || true
|
||||
cp -R .heroku/venv $CACHE_DIR/.heroku/ &> /dev/null || true
|
||||
|
||||
bpwatch stop dump_cache
|
||||
|
||||
# ### Fin.
|
||||
# Fin.
|
||||
if [[ ! "$DOCKER_BUILD" ]]; then
|
||||
|
||||
bpwatch start appdir_commit
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# detector.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
|
||||
# ## Usage
|
||||
|
||||
+1
-1
@@ -18,6 +18,6 @@ if [[ $MANAGE_FILE ]]; then
|
||||
cat <<EOF
|
||||
|
||||
addons:
|
||||
heroku-postgresql:hobby-dev
|
||||
- heroku-postgresql
|
||||
EOF
|
||||
fi
|
||||
|
||||
+49
-18
@@ -1,36 +1,67 @@
|
||||
#!/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 explicitly specified in requirements.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
|
||||
puts-cmd "python $MANAGE_FILE collectstatic --noinput"
|
||||
|
||||
# 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 '/^Post-processed/d;/^Copying/d;/^$/d' | indent
|
||||
COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"
|
||||
|
||||
echo " Running collectstatic..."
|
||||
python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent
|
||||
set -e
|
||||
|
||||
# Display a warning if collectstatic failed.
|
||||
[ $COLLECTSTATIC_STATUS -ne 0 ] && {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
[ $? -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
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
# The location of the pre-compiled cryptography binary.
|
||||
# The location of the pre-compiled libffi binary.
|
||||
VENDORED_LIBFFI="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libffi.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
@@ -19,15 +19,15 @@ source $BIN_DIR/utils
|
||||
|
||||
bpwatch start libffi_install
|
||||
|
||||
# If pylibmc exists within requirements, use vendored cryptography.
|
||||
if (pip-grep -s requirements.txt bcrypt cffi cryptography pyOpenSSL PyOpenSSL requests[security] &> /dev/null) then
|
||||
# If a package using cffi exists within requirements, use vendored libffi.
|
||||
if (pip-grep -s requirements.txt bcrypt cffi cryptography django[bcrypt] Django[bcrypt] pyOpenSSL PyOpenSSL requests[security] &> /dev/null) then
|
||||
|
||||
if [ -d ".heroku/vendor/lib/libffi-3.1.1" ]; then
|
||||
export LIBFFI=$(pwd)/vendor
|
||||
else
|
||||
echo "-----> Noticed cffi. Bootstrapping libffi."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
# Download and extract libffi into target vendor directory.
|
||||
curl $VENDORED_LIBFFI -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
export LIBFFI=$(pwd)/vendor
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
@@ -20,7 +20,7 @@ source $BIN_DIR/utils
|
||||
bpwatch start gdal_install
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if (pip-grep -s requirements.txt GDAL &> /dev/null) then
|
||||
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||
|
||||
if [ -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
export GDAL=$(pwd)/vendor
|
||||
|
||||
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the GDAL build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
# The location of the pre-compiled cryptography binary.
|
||||
VENDORED_GDAL="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
||||
VENDORED_GEOS="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/geos.tar.gz"
|
||||
VENDORED_PROJ="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/proj.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
|
||||
# Syntax sugar.
|
||||
source $BIN_DIR/utils
|
||||
|
||||
bpwatch start geo_libs_install
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||
|
||||
if [ -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
export GDAL=$(pwd)/vendor
|
||||
else
|
||||
echo "-----> Bootstrapping gdal, geos, proj."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl $VENDORED_GDAL -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl $VENDORED_GEOS -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl $VENDORED_PROJ -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
export GDAL=$(pwd)/vendor
|
||||
fi
|
||||
fi
|
||||
|
||||
bpwatch stop geo_libs_install
|
||||
+14
-4
@@ -1,16 +1,26 @@
|
||||
# Install dependencies with Pip.
|
||||
puts-step "Installing dependencies with pip"
|
||||
puts-cmd "pip install -r requirements.txt"
|
||||
|
||||
[ ! "$FRESH_PYTHON" ] && bpwatch start pip_install
|
||||
[ "$FRESH_PYTHON" ] && bpwatch start pip_install_first
|
||||
|
||||
/app/.heroku/python/bin/pip install -r requirements.txt --exists-action=w --src=./.heroku/src --allow-all-external --disable-pip-version-check --no-cache-dir | cleanup | indent
|
||||
set +e
|
||||
/app/.heroku/python/bin/pip install -r requirements.txt --exists-action=w --src=./.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee $WARNINGS_LOG | cleanup | indent
|
||||
PIP_STATUS="${PIPESTATUS[0]}"
|
||||
set -e
|
||||
|
||||
show-warnings
|
||||
|
||||
if [[ ! $PIP_STATUS -eq 0 ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Smart Requirements handling
|
||||
cp requirements.txt .heroku/python/requirements-declared.txt
|
||||
/app/.heroku/python/bin/pip freeze > .heroku/python/requirements-installed.txt
|
||||
/app/.heroku/python/bin/pip freeze --disable-pip-version-check > .heroku/python/requirements-installed.txt
|
||||
|
||||
[ ! "$FRESH_PYTHON" ] && bpwatch stop pip_install
|
||||
[ "$FRESH_PYTHON" ] && bpwatch stop pip_install_first
|
||||
|
||||
echo
|
||||
echo
|
||||
|
||||
@@ -5,7 +5,7 @@ if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||
|
||||
cp .heroku/python/requirements-declared.txt requirements-declared.txt
|
||||
|
||||
pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip > .heroku/python/requirements-stale.txt
|
||||
pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt
|
||||
|
||||
rm -fr requirements-declared.txt
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ PYTHON_VERSION=$(cat runtime.txt)
|
||||
if [ -f .heroku/python-version ]; then
|
||||
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
|
||||
bpwatch start uninstall_python
|
||||
puts-step "Found runtime $(cat .heroku/python-version), removing"
|
||||
puts-step "Found $(cat .heroku/python-version), removing"
|
||||
rm -fr .heroku/python
|
||||
bpwatch stop uninstall_python
|
||||
else
|
||||
@@ -23,7 +23,7 @@ fi
|
||||
|
||||
if [ ! "$SKIP_INSTALL" ]; then
|
||||
bpwatch start install_python
|
||||
puts-step "Installing runtime ($PYTHON_VERSION)"
|
||||
puts-step "Installing $PYTHON_VERSION"
|
||||
|
||||
# Prepare destination directory.
|
||||
mkdir -p .heroku/python
|
||||
|
||||
@@ -16,6 +16,11 @@ cleanup() {
|
||||
sed -e 's/\.\.\.\+/.../g' | sed -e '/already satisfied/Id' | sed -e '/Overwriting/Id' | sed -e '/python executable/Id' | sed -e '/no previously-included files/Id'
|
||||
}
|
||||
|
||||
# Buildpack Indented line.
|
||||
puts-line() {
|
||||
echo " $@"
|
||||
}
|
||||
|
||||
# Buildpack Steps.
|
||||
puts-step() {
|
||||
echo "-----> $@"
|
||||
@@ -26,6 +31,11 @@ puts-warn() {
|
||||
echo " ! $@"
|
||||
}
|
||||
|
||||
# Buildpack Commands.
|
||||
puts-cmd() {
|
||||
echo " $ $@"
|
||||
}
|
||||
|
||||
# Usage: $ set-env key value
|
||||
set-env() {
|
||||
echo "export $1=$2" >> $PROFILE_PATH
|
||||
@@ -78,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
|
||||
@@ -91,3 +105,4 @@ sub-env() {
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
shopt -s extglob
|
||||
|
||||
old-platform() {
|
||||
if grep -qi 'InsecurePlatformWarning' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! It looks like your application is using an outdated version of Python."
|
||||
puts-warn "This caused the security warning you saw above during the 'pip install' step."
|
||||
puts-warn "We recommend '$RECOMMENDED_PYTHON_VERSION', which you can specify in a 'runtime.txt' file."
|
||||
puts-warn " -- Much Love, Heroku."
|
||||
fi
|
||||
}
|
||||
|
||||
pylibmc-missing() {
|
||||
if grep -qi 'fatal error: libmemcached/memcached.h: No such file or directory' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! There was a problem with your build related to libmemcache."
|
||||
puts-warn "The Python library 'pylibmc' must be explicitly specified in 'requirements.txt' in order to build correctly."
|
||||
puts-warn "Once you do that, everything should work as expected. -- Much Love, Heroku."
|
||||
fi
|
||||
}
|
||||
|
||||
scipy-included() {
|
||||
if grep -qi 'running setup.py install for scipy' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! It looks like you're trying to use scipy on Heroku."
|
||||
puts-warn "Unfortunately, at this time, we do not directly support this library."
|
||||
puts-warn "There is, however, a buildpack available that makes it possible to use it on Heroku."
|
||||
puts-warn "You can learn more here: https://devcenter.heroku.com/articles/python-c-deps"
|
||||
puts-warn "Sorry for the inconvenience. -- Much Love, Heroku."
|
||||
fi
|
||||
}
|
||||
|
||||
distribute-included() {
|
||||
if grep -qi 'Running setup.py install for distribute' "$WARNINGS_LOG"; then
|
||||
echo
|
||||
puts-warn "Hello! Your requirements.txt file contains the distribute package."
|
||||
puts-warn "This library is automatically installed by Heroku and shouldn't be in"
|
||||
puts-warn "Your requirements.txt file. This can cause unexpected behavior."
|
||||
puts-warn " -- Much Love, Heroku."
|
||||
fi
|
||||
}
|
||||
|
||||
show-warnings() {
|
||||
old-platform
|
||||
pylibmc-missing
|
||||
scipy-included
|
||||
distribute-included
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building libffi..."
|
||||
|
||||
SOURCE_TARBALL='https://cl.ly/2s1t1u3v0N0I/download/libffi-3.1.tar'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar x
|
||||
|
||||
cd libffi-3.1
|
||||
./configure --prefix=$OUT_PREFIX --disable-static &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
Vendored
+2
-2
@@ -10,11 +10,11 @@ hash -r
|
||||
|
||||
echo "Building gdal..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.0/gdal-1.11.0.tar.gz'
|
||||
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.1/gdal-1.11.1.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
cd gdal-1.11.0
|
||||
cd gdal-1.11.1
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building geos..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/geos/geos-3.4.2.tar.bz2'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar xj
|
||||
|
||||
cd geos-3.4.2
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building gdal..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/proj/proj-4.8.0.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
cd proj-4.8.0
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-4.0.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy-4.0.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.11 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://www.python.org/ftp/python/2.7.11/Python-2.7.11rc1.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.11rc1 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.1/Python-3.5.1.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.1 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -1,27 +1,32 @@
|
||||
case $(ulimit -u) in
|
||||
|
||||
# 1X DYNO
|
||||
# Automatic configuration for Gunicorn's Workers setting.
|
||||
|
||||
# Standard-1X (+Free, +Hobby) Dyno
|
||||
256)
|
||||
export DYNO_RAM=512
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-2}
|
||||
;;
|
||||
|
||||
# 2X DYNO
|
||||
# Standard-2X Dyno
|
||||
512)
|
||||
export DYNO_RAM=1024
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-4}
|
||||
;;
|
||||
|
||||
# IX DYNO
|
||||
# Performance-M Dyno
|
||||
16384)
|
||||
export DYNO_RAM=2560
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-8}
|
||||
;;
|
||||
|
||||
# PX DYNO
|
||||
# Performance-L Dyno
|
||||
32768)
|
||||
export DYNO_RAM=6656
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-11}
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Automatic configuration for Gunicorn's ForwardedAllowIPS setting.
|
||||
export FORWARDED_ALLOW_IPS='*'
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Reference in New Issue
Block a user