mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
fcf696b835
This adds support for the upcoming Heroku-20 stack. The Heroku-20 Dockerfile is identical to that for Heroku-18, other than the base image, and stack-related env var changes. The initial Python versions made available will be those in: https://devcenter.heroku.com/articles/python-support#supported-runtimes https://devcenter.heroku.com/articles/python-support#supported-pypy-runtimes ...minus CPython 2.7, since it's EOL. Which are: * `python-3.6.12` * `python-3.7.9` * `python-3.8.6` * `python-3.9.0` * `pypy2.7-7.3.2` * `pypy3.6-7.3.2` Note: Unlike CPython 2.7, the PyPy 2.7 branch is still supported: https://doc.pypy.org/en/latest/faq.html#how-long-will-pypy-support-python2 In addition, I've generated binaries for each patch release immediately prior to the latest versions (with the exception of 3.9.0, since there isn't one), otherwise it's not possible to run the "out of date Python" warning tests. The binaries were generated using the process here: https://github.com/heroku/heroku-buildpack-python/blob/main/builds/README.md Specifically: ``` make deploy-runtimes STACKS='heroku-20' \ RUNTIMES='python-3.6.11 python-3.6.12 python-3.7.8 python-3.7.9 python-3.8.5 python-3.8.6 python-3.9.0 pypy2.7-7.3.1 pypy2.7-7.3.2 pypy3.6-7.3.1 pypy3.6-7.3.2' \ ENV_FILE=... ``` Binaries for the GDAL/GEOS/PROJ feature have not been generated, since it's deprecated and due for removal shortly: https://help.heroku.com/D5INLB1A/python-s-build_with_geo_libraries-legacy-feature-is-now-deprecated Note: Like the Python 3.9.0 release, this uses the new S3 bucket, so apps will need to be using a recent version of the buildpack in order to build on Heroku-20: https://devcenter.heroku.com/articles/python-support#checking-the-python-buildpack-version Closes @W-7485877@.
160 lines
4.5 KiB
Bash
Executable File
160 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Default Python Versions
|
|
# shellcheck source=bin/default_pythons
|
|
source "bin/default_pythons"
|
|
|
|
testGitEgg() {
|
|
compile "git-egg"
|
|
assertCaptured "requests"
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testSmartRequirements() {
|
|
local cache_dir="$(mktmpdir)"
|
|
compile "requirements-standard" "$cache_dir"
|
|
assertFile "requests" ".heroku/python/requirements-declared.txt"
|
|
assertCapturedSuccess
|
|
compile "psycopg2" "$cache_dir"
|
|
assertFile "psycopg2" ".heroku/python/requirements-declared.txt"
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testStackChange() {
|
|
local cache_dir="$(mktmpdir)"
|
|
mkdir -p "${cache_dir}/.heroku"
|
|
echo "different-stack" > "${cache_dir}/.heroku/python-stack"
|
|
compile "requirements-standard" "$cache_dir"
|
|
assertCaptured "clearing cache"
|
|
assertFile "$STACK" ".heroku/python-stack"
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testSetupPy() {
|
|
compile "setup-py"
|
|
assertCaptured "maya"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testStandardRequirements() {
|
|
compile "requirements-standard"
|
|
assertCaptured "requests"
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testPipenv() {
|
|
compile "pipenv"
|
|
assertCaptured "Installing pip 9.0.2, setuptools 47.1.1 and wheel 0.34.2"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testPipenvLock() {
|
|
compile "pipenv-lock"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testPipenvPythonVersion3_6() {
|
|
compile "pipenv-version"
|
|
assertCaptured "Installing ${LATEST_36}"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testPipenvPythonVersion2_7() {
|
|
# Python 2.7 is EOL, so it has not been built for Heroku-20.
|
|
if [[ $STACK == "heroku-20" ]]; then
|
|
return
|
|
fi
|
|
compile "pipenv-version2"
|
|
assertCaptured "Installing ${LATEST_27}"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testPipenvPythonFullVersion() {
|
|
# Python 3.7+ requires newer libssl than is present on Cedar-14.
|
|
if [[ "${STACK}" = "cedar-14" ]]; then
|
|
return
|
|
fi
|
|
compile "pipenv-full-version"
|
|
assertCaptured "3.7.8"
|
|
# Can't use `assertCapturedSuccess` since stderr contains:
|
|
# "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941)
|
|
assertCapturedSuccessWithStdErr
|
|
}
|
|
|
|
testNoRequirements() {
|
|
compile "no-requirements"
|
|
assertCapturedError
|
|
}
|
|
|
|
testWarnOldDjango() {
|
|
compile "old-django"
|
|
assertCaptured "Your Django version is nearing the end of its community support."
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testDontWarnOldDjango() {
|
|
compile "not-old-django"
|
|
assertNotCaptured "Your Django version is nearing the end of its community support."
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
testHooks() {
|
|
# Test that the hooks are called correctly, and that the environment contains
|
|
# the app's config vars but no unexpected env vars from the buildpack.
|
|
local env_dir="$(mktmpdir)"
|
|
echo 'test' > "${env_dir}/SOME_APP_CONFIG_VAR"
|
|
local expected_env_vars=(
|
|
_
|
|
BIN_DIR
|
|
BUILD_DIR
|
|
BUILDPACK_LOG_FILE
|
|
CACHE_DIR
|
|
C_INCLUDE_PATH
|
|
CPLUS_INCLUDE_PATH
|
|
ENV_DIR
|
|
EXPORT_PATH
|
|
HOME
|
|
LANG
|
|
LD_LIBRARY_PATH
|
|
LIBRARY_PATH
|
|
OLDPWD
|
|
PATH
|
|
PIP_NO_PYTHON_VERSION_WARNING
|
|
PKG_CONFIG_PATH
|
|
PROFILE_PATH
|
|
PWD
|
|
PYTHONUNBUFFERED
|
|
S3_BASE_URL
|
|
SHLVL
|
|
SOME_APP_CONFIG_VAR
|
|
STACK
|
|
)
|
|
if [[ "${STACK}" == "cedar-14" || "${STACK}" == "heroku-16" ]]; then
|
|
# Remove "OLDPWD" from expected_env_vars since for bash <4.4 it's not exported to subshells:
|
|
# https://github.com/heroku/heroku-buildpack-python/pull/1011#issuecomment-665117835
|
|
read -ra expected_env_vars <<< "${expected_env_vars[@]/OLDPWD/}"
|
|
fi
|
|
compile 'hooks' '' "${env_dir}"
|
|
assertCaptured "pre_compile ran!"
|
|
assertCaptured "pre_compile env: ${expected_env_vars[*]}."
|
|
assertCaptured "post_compile ran!"
|
|
assertCaptured "post_compile env: ${expected_env_vars[*]}."
|
|
assertCapturedSuccess
|
|
}
|
|
|
|
pushd $(dirname 0) >/dev/null
|
|
popd >/dev/null
|
|
|
|
source $(pwd)/test/utils
|
|
source $(pwd)/test/shunit2
|