mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 446410f883 | |||
| abd9ffdbff | |||
| 408a081a08 | |||
| 01b0c1b0db | |||
| 2e5fe9f286 | |||
| 6b9ffb92d9 | |||
| bf1563eaa0 | |||
| dcb04b96c3 | |||
| ab79d077da | |||
| 3d31167511 | |||
| 0c2b954a6d | |||
| b65f0cfce3 | |||
| a1ef075b53 | |||
| dee86babe1 | |||
| 6a02499140 | |||
| b8fd617d9c | |||
| f7c422e07d | |||
| cc6a03aa54 | |||
| 56ecd1aef7 | |||
| a98a87e1bc | |||
| 8c9521d806 | |||
| a9e5c60106 | |||
| 1df55a6c3c | |||
| a51e4f8660 | |||
| 46281960c7 | |||
| a19d4950a9 | |||
| 753134a2fa | |||
| 998a15395b | |||
| e68f556e63 | |||
| 9ff9466fd5 |
@@ -10,3 +10,5 @@ buildpack/*
|
||||
|
||||
builds/dockerenv.staging*
|
||||
builds/dockerenv.production
|
||||
|
||||
test/scratch
|
||||
|
||||
+3
-3
@@ -10,11 +10,11 @@ before_script:
|
||||
|
||||
script:
|
||||
- docker build --pull --tag travis-build-cedar-14 --file $(pwd)/builds/cedar-14.Dockerfile .
|
||||
- docker run --rm -e "STACK=cedar-14" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-cedar-14 bash $TESTFOLDER
|
||||
- docker run --rm -e "STACK=cedar-14" travis-build-cedar-14 bash $TESTFOLDER
|
||||
- docker build --pull --tag travis-build-heroku-16 --file $(pwd)/builds/heroku-16.Dockerfile .
|
||||
- docker run --rm -e "STACK=heroku-16" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-heroku-16 bash $TESTFOLDER
|
||||
- docker run --rm -e "STACK=heroku-16" travis-build-heroku-16 bash $TESTFOLDER
|
||||
- docker build --pull --tag travis-build-heroku-18 --file $(pwd)/builds/heroku-18.Dockerfile .
|
||||
- docker run --rm -e "STACK=heroku-18" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-heroku-18 bash $TESTFOLDER
|
||||
- docker run --rm -e "STACK=heroku-18" travis-build-heroku-18 bash $TESTFOLDER
|
||||
|
||||
jobs:
|
||||
include:
|
||||
|
||||
+13
-2
@@ -2,11 +2,22 @@
|
||||
|
||||
# Master
|
||||
|
||||
- Update requirements.txt builds to use Pip 20.0.2
|
||||
- Download get-pip.py to tmpdir instead of root dir
|
||||
- Add failcase for cache busting
|
||||
- Bugfix: Clearing pip dependencies
|
||||
- Correct ftp to https in vendored file
|
||||
- Warn for Django 1.11 approaching EOL, provide link to roadmap
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# 165 (2020-02-27)
|
||||
|
||||
- Python 3.8.2 now available.
|
||||
|
||||
# 164 (2020-02-20)
|
||||
|
||||
- Update requirements.txt builds to use Pip 20.0.2
|
||||
- Download get-pip.py to tmpdir instead of root dir
|
||||
|
||||
# 163 (2019-12-23)
|
||||
|
||||
- New pythons released:
|
||||
|
||||
@@ -259,17 +259,8 @@ mtime "python.install.time" "${start}"
|
||||
# shellcheck source=bin/steps/pipenv
|
||||
source "$BIN_DIR/steps/pipenv"
|
||||
|
||||
# Uninstall removed dependencies with Pip.
|
||||
# The buildpack will automatically remove any declared dependencies (in requirements.txt)
|
||||
# that were explicitly removed. This machinery is a bit complex, but it is not complicated.
|
||||
(( start=$(nowms) ))
|
||||
# shellcheck source=bin/steps/pip-uninstall
|
||||
source "$BIN_DIR/steps/pip-uninstall"
|
||||
mtime "pip.uninstall.time" "${start}"
|
||||
|
||||
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
||||
# This allows for people to ship a setup.py application to Heroku
|
||||
# (which is rare, but I vouch that it should work!)
|
||||
|
||||
if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
|
||||
echo "-e ." > requirements.txt
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
DEFAULT_PYTHON_VERSION="python-3.6.10"
|
||||
LATEST_38="python-3.8.1"
|
||||
LATEST_38="python-3.8.2"
|
||||
LATEST_37="python-3.7.6"
|
||||
LATEST_36="python-3.6.10"
|
||||
LATEST_35="python-3.5.7"
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# Python Buildpack Install Steps
|
||||
|
||||
TODO: Add context on Python install steps, such as why symlinking vs copying
|
||||
|
||||
## Installing the Pip tool
|
||||
|
||||
The Python Buildpack uses a tool called `get-pip` to install the pip tool. This
|
||||
is done in the `python` script.
|
||||
|
||||
This is in part because Python historically did not come with pip by default.
|
||||
|
||||
## Installing Python packages using Pip
|
||||
|
||||
### Convention: Use `python` process to invoke Pip
|
||||
|
||||
We don't use this convention (yet) but this is an upcoming change being considered.
|
||||
|
||||
This is a bigger concern on Windows than it is in Linux environments, but an
|
||||
emerging convention in the Python community is to invoke pip using:
|
||||
|
||||
```
|
||||
python3 -m pip [options]
|
||||
```
|
||||
|
||||
Invoking pip this way ensures correct location - python knows where these
|
||||
packages are stored because it put them there (defaults to Python's pathing info).
|
||||
|
||||
All normal command line options are available using this method.
|
||||
@@ -38,9 +38,16 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
mcount "failure.none-version"
|
||||
fi
|
||||
|
||||
if grep -q 'django==1.*' requirements.txt; then
|
||||
puts-warn "Your Django version is nearing the end of its community support."
|
||||
puts-warn "Upgrade to continue to receive security updates and for the best experience with Django."
|
||||
puts-warn "For more information, check out https://www.djangoproject.com/weblog/2015/jun/25/roadmap/"
|
||||
fi
|
||||
|
||||
if [ ! -f "$BUILD_DIR/.heroku/python/bin/pip" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
/app/.heroku/python/bin/pip install -r "$BUILD_DIR/requirements.txt" --exists-action=w --src=/app/.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee "$WARNINGS_LOG" | cleanup | indent
|
||||
PIP_STATUS="${PIPESTATUS[0]}"
|
||||
set -e
|
||||
@@ -52,12 +59,9 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Smart Requirements handling
|
||||
cp requirements.txt .heroku/python/requirements-declared.txt
|
||||
/app/.heroku/python/bin/pip freeze --disable-pip-version-check > .heroku/python/requirements-installed.txt
|
||||
|
||||
echo
|
||||
|
||||
# Install test dependencies, for CI.
|
||||
if [ "$INSTALL_TEST" ]; then
|
||||
if [[ -f "$1/requirements-test.txt" ]]; then
|
||||
|
||||
+24
-9
@@ -86,14 +86,6 @@ if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor .heroku/python .heroku/python-sqlite3-version
|
||||
fi
|
||||
|
||||
# need to clear the cache for first time installing SQLite3,
|
||||
# since the version is changing and could lead to runtime errors
|
||||
# with compiled extensions.
|
||||
if [ -d .heroku/python ] && [ ! -f .heroku/python-sqlite3-version ] && python_sqlite3_check "$PYTHON_VERSION"; then
|
||||
puts-step "Need to update SQLite3, clearing cache"
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor
|
||||
fi
|
||||
|
||||
if [ -f .heroku/python-version ]; then
|
||||
if [ ! "$(cat .heroku/python-version)" = "$PYTHON_VERSION" ]; then
|
||||
puts-step "Found $(cat .heroku/python-version), removing"
|
||||
@@ -103,6 +95,29 @@ if [ -f .heroku/python-version ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check if we should reinstall python dependencies
|
||||
if [[ ! -f "$CACHE_DIR/.heroku/requirements.txt" ]]; then
|
||||
# IF there's no cached dependencies, update cached version of requirements.txt
|
||||
# This should only run for new apps and first deploys after this update
|
||||
cp -R "$BUILD_DIR/requirements.txt" "$CACHE_DIR/.heroku/requirements.txt"
|
||||
# If we don't already have a python version, this is a new app
|
||||
if [ -f .heroku/python-version ]; then
|
||||
puts-step "Clearing cached dependencies"
|
||||
# if there are any differences, clear the Python cache
|
||||
# Installing Python over again does not take noticably more time
|
||||
rm -rf .heroku/python
|
||||
unset SKIP_INSTALL
|
||||
fi
|
||||
else
|
||||
# IF there IS a cached directory, check for differences with the new one
|
||||
if ! diff "$BUILD_DIR/requirements.txt" "$CACHE_DIR/.heroku/requirements.txt"; then
|
||||
puts-step "Clearing cached dependencies"
|
||||
# if there are any differences, clear the Python cache
|
||||
# Installing Python over again does not take noticably more time
|
||||
rm -rf .heroku/python
|
||||
unset SKIP_INSTALL
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! "$SKIP_INSTALL" ]; then
|
||||
puts-step "Installing $PYTHON_VERSION"
|
||||
@@ -137,7 +152,7 @@ if ! curl -s "${GETPIP_URL}" -o "$GETPIP_PY" &> /dev/null; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If Pip isn't up to date:
|
||||
# If a new Python has been installed or Pip isn't up to date:
|
||||
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
|
||||
|
||||
puts-step "Installing pip"
|
||||
|
||||
Vendored
+2
-2
@@ -15,11 +15,11 @@ hash -r
|
||||
|
||||
echo "Building libffi…"
|
||||
|
||||
SOURCE_TARBALL='ftp://sourceware.org/pub/libffi/libffi-3.1.tar.gz'
|
||||
SOURCE_TARBALL='https://github.com/libffi/libffi/archive/v3.1.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar x
|
||||
|
||||
cd libffi-3.1
|
||||
cd v3.1
|
||||
./configure --prefix=$OUT_PREFIX --disable-static &&
|
||||
make
|
||||
make install
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
docopt==0.6.2
|
||||
bob-builder
|
||||
bob-builder==0.0.17
|
||||
boto==2.48.0
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
require_relative '../spec_helper'
|
||||
|
||||
describe "Python!!!!!!!!!!!" do
|
||||
describe "Default Python Deploy" do
|
||||
it "🐍" do
|
||||
Hatchet::Runner.new('python-getting-started', stack: DEFAULT_STACK).deploy do |app|
|
||||
expect(app.output).to match(/Installing pip/)
|
||||
expect(app.run('python -V')).to match(/3.6.10/)
|
||||
|
||||
|
||||
expect(app.output).to_not match("Clearing cached dependencies")
|
||||
|
||||
# Redeploy
|
||||
run!(%Q{echo "flask" >> requirements.txt})
|
||||
run!(%Q{git add . ; git commit --allow-empty -m next})
|
||||
app.push!
|
||||
|
||||
# Check for the cache tohave cleared
|
||||
expect(app.output).to match("Clearing cached dependencies")
|
||||
|
||||
run!(%Q{git commit --allow-empty -m next})
|
||||
app.push!
|
||||
|
||||
# The cache should not clear with no changes
|
||||
expect(app.output).to_not match("Clearing cached dependencies")
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
+7
-1
@@ -20,4 +20,10 @@ if ENV['TRAVIS']
|
||||
exit 0 if ENV['TRAVIS_PULL_REQUEST'] != 'false' && ENV['TRAVIS_BRANCH'] == 'master'
|
||||
end
|
||||
|
||||
DEFAULT_STACK = 'heroku-16'
|
||||
DEFAULT_STACK = 'heroku-18'
|
||||
|
||||
def run!(cmd)
|
||||
out = `#{cmd}`
|
||||
raise "Error running command #{cmd} with output: #{out}" unless $?.success?
|
||||
return out
|
||||
end
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
python-3.8.0
|
||||
python-3.8.2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
requests
|
||||
+1
@@ -0,0 +1 @@
|
||||
python-3.8.0
|
||||
@@ -157,6 +157,18 @@ testPython3_7_fail() {
|
||||
assertCapturedError
|
||||
}
|
||||
|
||||
testPython3_7_warn() {
|
||||
compile "python3_8_warn"
|
||||
if [[ $STACK = "cedar-14" ]]; then
|
||||
assertCapturedError
|
||||
else
|
||||
assertCaptured "python-3.8.0"
|
||||
assertCaptured "security update!"
|
||||
assertCaptured "Installing SQLite3"
|
||||
assertCapturedSuccess
|
||||
fi
|
||||
}
|
||||
|
||||
testPython3_8() {
|
||||
updateVersion "python3_8" $LATEST_38
|
||||
compile "python3_8"
|
||||
|
||||
Reference in New Issue
Block a user