mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 21430070ad | |||
| 20bbb3f54d | |||
| bebc0cf439 | |||
| c361c2ffc4 | |||
| 13d2a58add | |||
| 49e9147439 | |||
| 3c0146c0b9 | |||
| 53c7d61291 | |||
| 797652a75d | |||
| d7351513c7 | |||
| fe029af603 | |||
| dd8fe58de1 | |||
| a979d57a20 | |||
| 3cb8db7e2e | |||
| 16cce92342 | |||
| b85fe3614c | |||
| b024e644d1 | |||
| 41e0f64252 | |||
| 3a0d4c18bf | |||
| b3988a565a | |||
| 0437a6e84f | |||
| 88a5ba5d39 | |||
| 3434972e32 | |||
| 1dfef44085 | |||
| 2ffb10da34 | |||
| 23999846ad | |||
| 8d1ebf7288 | |||
| f2165aaac6 | |||
| 05492e132a | |||
| 62eaae35a4 | |||
| 2f32c5418d | |||
| 12e3a7f3e7 | |||
| e7da63f722 | |||
| a6452a1ce4 | |||
| 0b554f660f | |||
| 7b9e82175e | |||
| 73d37cbac6 | |||
| 9e1df4bbb5 | |||
| 0be9d48013 | |||
| 4750639a0d | |||
| 3de5b43447 | |||
| c3845fff9a | |||
| f3ef152624 | |||
| ef1f7f6924 | |||
| 25818765ee | |||
| 0a169e76a4 | |||
| 2f430abf07 | |||
| 07241cd751 | |||
| ae4713efd8 | |||
| 402cd8253e | |||
| aa593f127b | |||
| 67badb1829 | |||
| defa85c355 | |||
| ec364be161 | |||
| 7b4d6b5587 | |||
| e094c5469d | |||
| a7a5971372 | |||
| 45b78ab587 | |||
| 63e84aceb1 | |||
| eee8dd9a9e | |||
| 00e12b8ec2 | |||
| b56b063dd5 |
@@ -0,0 +1,5 @@
|
|||||||
|
repos:
|
||||||
|
- repo: git://github.com/detailyang/pre-commit-shell
|
||||||
|
rev: 1.0.4
|
||||||
|
hooks:
|
||||||
|
- id: shell-lint
|
||||||
+2
-6
@@ -5,16 +5,11 @@ rvm:
|
|||||||
- 2.4.4
|
- 2.4.4
|
||||||
before_script:
|
before_script:
|
||||||
- gem install bundler -v 1.16.2
|
- gem install bundler -v 1.16.2
|
||||||
- bundle exec rake hatchet:setup_travis
|
- bundle exec hatchet ci:setup
|
||||||
before_install:
|
|
||||||
- sudo bash etc/ci-setup.sh
|
|
||||||
jobs:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- stage: Bash linting (shellcheck)
|
- stage: Bash linting (shellcheck)
|
||||||
sudo: false
|
sudo: false
|
||||||
before_install:
|
|
||||||
- wget -c https://goo.gl/ZzKHFv -O - | tar -xvJ -C /tmp/
|
|
||||||
- PATH="/tmp/shellcheck-latest:$PATH"
|
|
||||||
script: make check
|
script: make check
|
||||||
- stage: Stack Unit Tests
|
- stage: Stack Unit Tests
|
||||||
services: docker
|
services: docker
|
||||||
@@ -35,5 +30,6 @@ env:
|
|||||||
- HATCHET_RETRIES=3
|
- HATCHET_RETRIES=3
|
||||||
- IS_RUNNING_ON_CI=true
|
- IS_RUNNING_ON_CI=true
|
||||||
- HATCHET_APP_LIMIT=5
|
- HATCHET_APP_LIMIT=5
|
||||||
|
- HATCHET_DEPLOY_STRATEGY=git
|
||||||
- secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E=
|
- secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E=
|
||||||
- secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As=
|
- secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As=
|
||||||
|
|||||||
+35
-1
@@ -1,9 +1,43 @@
|
|||||||
# Python Buildpack Changelog
|
# Python Buildpack Changelog
|
||||||
|
|
||||||
# 139
|
# 149 (2019-03-04)
|
||||||
|
|
||||||
|
Hotfix for broken Cedar 14 deploys
|
||||||
|
|
||||||
|
# 148 (2019-02-21)
|
||||||
|
|
||||||
|
No user facing changes, improving internal metrics
|
||||||
|
|
||||||
|
# 147 (2019-02-07)
|
||||||
|
|
||||||
|
Python 3.7.2 and 3.6.8 now available on all Heroku stacks.
|
||||||
|
|
||||||
|
# 146 (2018-11-11)
|
||||||
|
|
||||||
|
Python 3.7.1, 3.6.7, 3.5.6 and 3.4.9 now available on all Heroku stacks.
|
||||||
|
|
||||||
|
# 145 (2018-11-08)
|
||||||
|
|
||||||
|
Testing and tooling expanded to better support new runtimes
|
||||||
|
|
||||||
|
# 144 (2018-10-10)
|
||||||
|
|
||||||
|
Switch to cautious upgrade for Pipenv install to ensure the pinned pip version
|
||||||
|
is used with Pipenv
|
||||||
|
|
||||||
|
# 143 (2018-10-09)
|
||||||
|
|
||||||
|
Add support for detecting SLUGIFY_USES_TEXT_UNIDECODE, which is required to
|
||||||
|
install Apache Airflow version 1.10 or higher.
|
||||||
|
|
||||||
|
# 142 (2018-10-08)
|
||||||
|
|
||||||
Improvements to Python install messaging
|
Improvements to Python install messaging
|
||||||
|
|
||||||
|
# 139, 140, 141
|
||||||
|
|
||||||
|
No user-facing changes, documenting for version clarity
|
||||||
|
|
||||||
# 138 (2018-08-01)
|
# 138 (2018-08-01)
|
||||||
|
|
||||||
Use stack image SQLite3 instead of vendoring
|
Use stack image SQLite3 instead of vendoring
|
||||||
|
|||||||
+9
-9
@@ -6,16 +6,16 @@ GEM
|
|||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
concurrent-ruby (1.0.5)
|
concurrent-ruby (1.1.3)
|
||||||
diff-lcs (1.3)
|
diff-lcs (1.3)
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
excon (0.62.0)
|
excon (0.62.0)
|
||||||
heroics (0.0.24)
|
heroics (0.0.25)
|
||||||
erubis (~> 2.0)
|
erubis (~> 2.0)
|
||||||
excon
|
excon
|
||||||
moneta
|
moneta
|
||||||
multi_json (>= 1.9.2)
|
multi_json (>= 1.9.2)
|
||||||
heroku_hatchet (4.0.2)
|
heroku_hatchet (4.0.6)
|
||||||
excon (~> 0)
|
excon (~> 0)
|
||||||
minitest-retry (~> 0.1.9)
|
minitest-retry (~> 0.1.9)
|
||||||
platform-api (~> 2)
|
platform-api (~> 2)
|
||||||
@@ -23,16 +23,16 @@ GEM
|
|||||||
rrrretry (~> 1)
|
rrrretry (~> 1)
|
||||||
thor (~> 0)
|
thor (~> 0)
|
||||||
threaded (~> 0)
|
threaded (~> 0)
|
||||||
i18n (1.1.0)
|
i18n (1.1.1)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
minitest (5.11.3)
|
minitest (5.11.3)
|
||||||
minitest-retry (0.1.9)
|
minitest-retry (0.1.9)
|
||||||
minitest (>= 5.0)
|
minitest (>= 5.0)
|
||||||
moneta (0.8.1)
|
moneta (1.0.0)
|
||||||
multi_json (1.13.1)
|
multi_json (1.13.1)
|
||||||
platform-api (2.1.0)
|
platform-api (2.2.0)
|
||||||
heroics (~> 0.0.23)
|
heroics (~> 0.0.25)
|
||||||
moneta (~> 0.8.1)
|
moneta (~> 1.0.0)
|
||||||
rake (12.3.1)
|
rake (12.3.1)
|
||||||
repl_runner (0.0.3)
|
repl_runner (0.0.3)
|
||||||
activesupport
|
activesupport
|
||||||
@@ -52,7 +52,7 @@ GEM
|
|||||||
rspec-retry (0.6.1)
|
rspec-retry (0.6.1)
|
||||||
rspec-core (> 3.3)
|
rspec-core (> 3.3)
|
||||||
rspec-support (3.8.0)
|
rspec-support (3.8.0)
|
||||||
thor (0.20.0)
|
thor (0.20.3)
|
||||||
thread_safe (0.3.6)
|
thread_safe (0.3.6)
|
||||||
threaded (0.0.4)
|
threaded (0.0.4)
|
||||||
tzinfo (1.2.5)
|
tzinfo (1.2.5)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# These targets are not files
|
# These targets are not files
|
||||||
.PHONY: tests
|
.PHONY: tests
|
||||||
|
|
||||||
test: test-heroku-16
|
test: test-heroku-18 test-heroku-16
|
||||||
|
|
||||||
check:
|
check:
|
||||||
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings
|
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings bin/default_pythons
|
||||||
@shellcheck -x bin/steps/collectstatic bin/steps/eggpath-fix bin/steps/eggpath-fix2 bin/steps/gdal bin/steps/geo-libs bin/steps/mercurial bin/steps/nltk bin/steps/pip-install bin/steps/pip-uninstall bin/steps/pipenv bin/steps/pipenv-python-version bin/steps/pylibmc bin/steps/python
|
@shellcheck -x bin/steps/collectstatic bin/steps/eggpath-fix bin/steps/eggpath-fix2 bin/steps/gdal bin/steps/geo-libs bin/steps/mercurial bin/steps/nltk bin/steps/pip-install bin/steps/pip-uninstall bin/steps/pipenv bin/steps/pipenv-python-version bin/steps/pylibmc bin/steps/python
|
||||||
@shellcheck -x bin/steps/hooks/*
|
@shellcheck -x bin/steps/hooks/*
|
||||||
|
|
||||||
|
|||||||
@@ -4,36 +4,54 @@
|
|||||||
|
|
||||||
[](https://travis-ci.org/heroku/heroku-buildpack-python)
|
[](https://travis-ci.org/heroku/heroku-buildpack-python)
|
||||||
|
|
||||||
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [Pipenv](http://docs.pipenv.org/), [pip](https://pip.pypa.io/) and other excellent software.
|
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps.
|
||||||
|
|
||||||
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.
|
Recommended web frameworks include **Django** and **Flask**, among others. 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.
|
||||||
|
|
||||||
Python packages with C dependencies that are not [available on the stack image](https://devcenter.heroku.com/articles/stack-packages) are generally not supported, unless `manylinux` wheels are provided by the package maintainers (common). For recommended solutions, check out [this article](https://devcenter.heroku.com/articles/python-c-deps) for more information.
|
Python packages with C dependencies that are not [available on the stack image](https://devcenter.heroku.com/articles/stack-packages) are generally not supported, unless `manylinux` wheels are provided by the package maintainers (common). For recommended solutions, check out [this article](https://devcenter.heroku.com/articles/python-c-deps) for more information.
|
||||||
|
|
||||||
See it in Action
|
See it in Action
|
||||||
----------------
|
----------------
|
||||||
|
```
|
||||||
|
$ ls
|
||||||
|
my-application requirements.txt runtime.txt
|
||||||
|
|
||||||
Deploying a Python application couldn't be easier:
|
$ git push heroku master
|
||||||
|
Counting objects: 4, done.
|
||||||
|
Delta compression using up to 8 threads.
|
||||||
|
Compressing objects: 100% (2/2), done.
|
||||||
|
Writing objects: 100% (4/4), 276 bytes | 276.00 KiB/s, done.
|
||||||
|
Total 4 (delta 0), reused 0 (delta 0)
|
||||||
|
remote: Compressing source files... done.
|
||||||
|
remote: Building source:
|
||||||
|
remote:
|
||||||
|
remote: -----> Python app detected
|
||||||
|
remote: -----> Installing python-3.7.1
|
||||||
|
remote: -----> Installing pip
|
||||||
|
remote: -----> Installing SQLite3
|
||||||
|
remote: -----> Installing requirements with pip
|
||||||
|
remote: Collecting flask (from -r /tmp/build_c2c067ef79ff14c9bf1aed6796f9ed1f/requirements.txt (line 1))
|
||||||
|
remote: Downloading ...
|
||||||
|
remote: Installing collected packages: Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
|
||||||
|
remote: Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0
|
||||||
|
remote:
|
||||||
|
remote: -----> Discovering process types
|
||||||
|
remote: Procfile declares types -> (none)
|
||||||
|
remote:
|
||||||
|
```
|
||||||
|
|
||||||
$ ls
|
A `requirements.txt` must be present at the root of your application's repository to deploy.
|
||||||
Pipfile Pipfile.lock Procfile web.py
|
|
||||||
|
|
||||||
$ heroku create --buildpack heroku/python
|
To specify your python version, you also need a `runtime.txt` file - unless you are using the default Python runtime version.
|
||||||
|
|
||||||
$ git push heroku master
|
Current default Python Runtime: Python 3.6.7
|
||||||
…
|
|
||||||
-----> Python app detected
|
|
||||||
-----> Installing python-3.6.6
|
|
||||||
-----> Installing pip
|
|
||||||
-----> Installing requirements with Pipenv 2018.5.18…
|
|
||||||
...
|
|
||||||
Installing dependencies from Pipfile…
|
|
||||||
-----> Discovering process types
|
|
||||||
Procfile declares types -> (none)
|
|
||||||
|
|
||||||
A `Pipfile` or `requirements.txt` must be present at the root of your application's repository.
|
Alternatively, you can provide a `setup.py` file, or a `Pipfile`. Using `Pipenv` will generate `runtime.txt` based on `python-version` at build time.
|
||||||
|
|
||||||
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
|
Specify a Buildpack Version
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
You can specify the latest production release of this buildpack for upcoming builds of an existing application:
|
||||||
|
|
||||||
$ heroku buildpacks:set heroku/python
|
$ heroku buildpacks:set heroku/python
|
||||||
|
|
||||||
@@ -41,23 +59,30 @@ You can also specify the latest production release of this buildpack for upcomin
|
|||||||
Specify a Python Runtime
|
Specify a Python Runtime
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Specific versions of the Python runtime can be specified in your `Pipfile`:
|
Supported runtime options include:
|
||||||
|
|
||||||
[requires]
|
- `python-3.7.1`
|
||||||
python_version = "2.7"
|
- `python-3.6.7`
|
||||||
|
|
||||||
Or, more specifically:
|
|
||||||
|
|
||||||
[requires]
|
|
||||||
python_full_version = "2.7.15"
|
|
||||||
|
|
||||||
Or, with a `runtime.txt` file:
|
|
||||||
|
|
||||||
$ cat runtime.txt
|
|
||||||
python-2.7.15
|
|
||||||
|
|
||||||
Runtime options include:
|
|
||||||
|
|
||||||
- `python-3.7.0`
|
|
||||||
- `python-3.6.6`
|
|
||||||
- `python-2.7.15`
|
- `python-2.7.15`
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
The buildpack tests use [Docker](https://www.docker.com/) to simulate
|
||||||
|
Heroku's [stack images.](https://devcenter.heroku.com/articles/stack)
|
||||||
|
|
||||||
|
To run the test suite:
|
||||||
|
|
||||||
|
```
|
||||||
|
make test
|
||||||
|
```
|
||||||
|
|
||||||
|
Or to test in a particular stack:
|
||||||
|
|
||||||
|
```
|
||||||
|
make test-heroku-18
|
||||||
|
make test-heroku-16
|
||||||
|
```
|
||||||
|
|
||||||
|
The tests are run via the vendored
|
||||||
|
[shunit2](https://github.com/kward/shunit2)
|
||||||
|
test framework.
|
||||||
|
|||||||
+12
-9
@@ -45,21 +45,24 @@ if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
|
|||||||
fi
|
fi
|
||||||
export VENDOR_URL
|
export VENDOR_URL
|
||||||
|
|
||||||
# Which versions of Python are we using?
|
# Default Python Versions
|
||||||
# These variables are used to specify which versions of Python to install by default,
|
# shellcheck source=bin/default_pythons
|
||||||
# as well as prompt the user to upgrade if they are using an un–supported version.
|
source "$BIN_DIR/default_pythons"
|
||||||
# Note: When 3.7 lands, I recommend switching to LATEST_36 and LATEST_37.
|
|
||||||
DEFAULT_PYTHON_VERSION="python-3.6.6"
|
# Supported Python Branches
|
||||||
LATEST_36="python-3.6.6"
|
PY37="python-3.7"
|
||||||
LATEST_37="python-3.7.0"
|
PY36="python-3.6"
|
||||||
LATEST_2="python-2.7.15"
|
PY35="python-3.5"
|
||||||
|
PY34="python-3.4"
|
||||||
|
PY27="python-2.7"
|
||||||
|
|
||||||
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
|
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
|
||||||
DEFAULT_PYTHON_STACK="cedar-14"
|
DEFAULT_PYTHON_STACK="cedar-14"
|
||||||
# If pip doesn't match this version (the version we install), run the installer.
|
# If pip doesn't match this version (the version we install), run the installer.
|
||||||
PIP_UPDATE="9.0.2"
|
PIP_UPDATE="9.0.2"
|
||||||
|
|
||||||
export DEFAULT_PYTHON_VERSION DEFAULT_PYTHON_STACK PIP_UPDATE LATEST_2 LATEST_36 LATEST_37
|
export DEFAULT_PYTHON_STACK PIP_UPDATE
|
||||||
|
export PY37 PY36 PY35 PY27 PY34
|
||||||
|
|
||||||
# Common Problem Warnings:
|
# Common Problem Warnings:
|
||||||
# This section creates a temporary file in which to stick the output of `pip install`.
|
# This section creates a temporary file in which to stick the output of `pip install`.
|
||||||
|
|||||||
Executable
+10
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
DEFAULT_PYTHON_VERSION="python-3.6.8"
|
||||||
|
LATEST_36="python-3.6.8"
|
||||||
|
LATEST_37="python-3.7.2"
|
||||||
|
LATEST_35="python-3.5.6"
|
||||||
|
LATEST_34="python-3.4.9"
|
||||||
|
LATEST_27="python-2.7.16"
|
||||||
|
|
||||||
|
export DEFAULT_PYTHON_VERSION LATEST_37 LATEST_36 LATEST_35 LATEST_34 LATEST_27
|
||||||
+1
-1
@@ -26,9 +26,9 @@ if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
|||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract cryptography into target vendor directory.
|
# Download and extract cryptography into target vendor directory.
|
||||||
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
|
mcount "steps.vendor.gdal"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
GDAL=$(pwd)/vendor
|
GDAL=$(pwd)/vendor
|
||||||
export GDAL
|
export GDAL
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ source "$BIN_DIR/utils"
|
|||||||
|
|
||||||
# If GDAL exists within requirements, use vendored gdal.
|
# If GDAL exists within requirements, use vendored gdal.
|
||||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||||
|
mcount "buildvar.BUILD_WITH_GEO_LIBRARIES"
|
||||||
|
|
||||||
if [ ! -f ".heroku/vendor/bin/proj" ]; then
|
if [ ! -f ".heroku/vendor/bin/proj" ]; then
|
||||||
echo "-----> Bootstrapping gdal, geos, proj."
|
echo "-----> Bootstrapping gdal, geos, proj."
|
||||||
@@ -31,9 +32,11 @@ if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
|||||||
curl "$VENDORED_GEOS" -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
|
curl "$VENDORED_PROJ" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
|
|
||||||
|
mcount "steps.vendor.geo_libs"
|
||||||
# Copy libjasper from build image to slug.
|
# Copy libjasper from build image to slug.
|
||||||
if [[ "$STACK" == "heroku-16" ]]; then
|
if [[ "$STACK" == "heroku-16" ]]; then
|
||||||
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
|
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
|
||||||
|
mcount "steps.vendor.libjasper"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
+1
-1
@@ -4,6 +4,6 @@
|
|||||||
if [[ -f "requirements.txt" ]]; then
|
if [[ -f "requirements.txt" ]]; then
|
||||||
if (grep -Fiq "hg+" requirements.txt) then
|
if (grep -Fiq "hg+" requirements.txt) then
|
||||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||||
|
mcount "steps.mercurial"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ if sp-grep -s nltk; then
|
|||||||
python -m nltk.downloader -d "$BUILD_DIR/.heroku/python/nltk_data" "${nltk_packages[@]}" | indent
|
python -m nltk.downloader -d "$BUILD_DIR/.heroku/python/nltk_data" "${nltk_packages[@]}" | indent
|
||||||
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
|
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
|
||||||
|
|
||||||
|
mcount "buildvar.NLTK_PACKAGES_DEFINITION"
|
||||||
|
mcount "steps.nltk"
|
||||||
else
|
else
|
||||||
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
||||||
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
|
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
|
||||||
|
|||||||
+19
-3
@@ -8,10 +8,24 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
|||||||
# Install dependencies with Pip.
|
# Install dependencies with Pip.
|
||||||
puts-step "Installing requirements with pip"
|
puts-step "Installing requirements with pip"
|
||||||
|
|
||||||
# Set PIP_EXTRA_INDEX_URL
|
# Set Pip env vars
|
||||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
# This reads certain environment variables set on the Heroku app config
|
||||||
|
# and makes them accessible to the pip install process.
|
||||||
|
#
|
||||||
|
# PIP_EXTRA_INDEX_URL allows for an alternate pypi URL to be used.
|
||||||
|
if [[ -r "$ENV_DIR/PIP_EXTRA_INDEX_URL" ]]; then
|
||||||
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||||
export PIP_EXTRA_INDEX_URL
|
export PIP_EXTRA_INDEX_URL
|
||||||
|
mcount "buildvar.PIP_EXTRA_INDEX_URL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
set +e
|
||||||
|
|
||||||
|
# Set SLUGIFY_USES_TEXT_UNIDECODE, required for Airflow versions >=1.10
|
||||||
|
if [[ -r "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE" ]]; then
|
||||||
|
SLUGIFY_USES_TEXT_UNIDECODE="$(cat "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE")"
|
||||||
|
export SLUGIFY_USES_TEXT_UNIDECODE
|
||||||
|
mcount "buildvar.SLUGIFY_USES_TEXT_UNIDECODE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
@@ -24,7 +38,9 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
|||||||
mcount "failure.none-version"
|
mcount "failure.none-version"
|
||||||
fi
|
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
|
/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]}"
|
PIP_STATUS="${PIPESTATUS[0]}"
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
+18
-4
@@ -20,7 +20,6 @@ if [[ -f Pipfile.lock ]]; then
|
|||||||
export SKIP_PIPENV_INSTALL=1
|
export SKIP_PIPENV_INSTALL=1
|
||||||
export SKIP_PIP_INSTALL=1
|
export SKIP_PIP_INSTALL=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -35,16 +34,31 @@ if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
|||||||
# Skip pip install, later.
|
# Skip pip install, later.
|
||||||
export SKIP_PIP_INSTALL=1
|
export SKIP_PIP_INSTALL=1
|
||||||
|
|
||||||
# Set PIP_EXTRA_INDEX_URL
|
# Set Pip env vars
|
||||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
# This reads certain environment variables set on the Heroku app config
|
||||||
|
# and makes them accessible to the pip install process.
|
||||||
|
#
|
||||||
|
# PIP_EXTRA_INDEX_URL allows for an alternate pypi URL to be used.
|
||||||
|
if [[ -r "$ENV_DIR/PIP_EXTRA_INDEX_URL" ]]; then
|
||||||
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||||
export PIP_EXTRA_INDEX_URL
|
export PIP_EXTRA_INDEX_URL
|
||||||
|
mcount "buildvar.PIP_EXTRA_INDEX_URL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set SLUGIFY_USES_TEXT_UNIDECODE, required for Airflow versions >=1.10
|
||||||
|
if [[ -r "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE" ]]; then
|
||||||
|
SLUGIFY_USES_TEXT_UNIDECODE="$(cat "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE")"
|
||||||
|
export SLUGIFY_USES_TEXT_UNIDECODE
|
||||||
|
mcount "buildvar.SLUGIFY_USES_TEXT_UNIDECODE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export PIPENV_VERSION="2018.5.18"
|
export PIPENV_VERSION="2018.5.18"
|
||||||
|
|
||||||
# Install pipenv.
|
# Install pipenv.
|
||||||
/app/.heroku/python/bin/pip install pipenv==$PIPENV_VERSION --upgrade &> /dev/null
|
# Due to weird old pip behavior and pipenv behavior, pipenv upgrades pip
|
||||||
|
# to latest if only --upgrade is specified. Specify upgrade strategy to
|
||||||
|
# avoid this eager behavior.
|
||||||
|
/app/.heroku/python/bin/pip install pipenv==$PIPENV_VERSION --upgrade --upgrade-strategy only-if-needed &> /dev/null
|
||||||
|
|
||||||
# Install the dependencies.
|
# Install the dependencies.
|
||||||
if [[ ! -f Pipfile.lock ]]; then
|
if [[ ! -f Pipfile.lock ]]; then
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
|
|||||||
if [[ "$PYTHON" == "null" ]]; then
|
if [[ "$PYTHON" == "null" ]]; then
|
||||||
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
|
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
|
||||||
if [ "$PYTHON" = 2.7 ]; then
|
if [ "$PYTHON" = 2.7 ]; then
|
||||||
echo "$LATEST_2" > "$BUILD_DIR/runtime.txt"
|
echo "$LATEST_27" > "$BUILD_DIR/runtime.txt"
|
||||||
fi
|
fi
|
||||||
if [ "$PYTHON" = 3.6 ]; then
|
if [ "$PYTHON" = 3.6 ]; then
|
||||||
echo "$LATEST_36" > "$BUILD_DIR/runtime.txt"
|
echo "$LATEST_36" > "$BUILD_DIR/runtime.txt"
|
||||||
@@ -33,4 +33,3 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
|||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract libmemcached into target vendor directory.
|
# Download and extract libmemcached into target vendor directory.
|
||||||
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
|
mcount "steps.vendor.pylibmc"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
LIBMEMCACHED=$(pwd)/vendor
|
LIBMEMCACHED=$(pwd)/vendor
|
||||||
|
|||||||
+40
-33
@@ -7,41 +7,49 @@ PYTHON_VERSION=$(cat runtime.txt)
|
|||||||
# The location of the pre-compiled python binary.
|
# The location of the pre-compiled python binary.
|
||||||
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"
|
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"
|
||||||
|
|
||||||
if [[ $PYTHON_VERSION =~ ^python-2 ]]; then
|
SECURITY_UPDATE="Python has released a security update! Please consider upgrading to"
|
||||||
if [[ "$PYTHON_VERSION" != "$LATEST_2" ]]; then
|
|
||||||
puts-warn "The latest version of Python 2 is $LATEST_2 (you are using $PYTHON_VERSION, which is unsupported)."
|
# check if runtime exists
|
||||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_2)."
|
if curl --output /dev/null --silent --head --fail "$VENDORED_PYTHON"; then
|
||||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
if [[ "$PYTHON_VERSION" == $PY37* ]]; then
|
||||||
else
|
# do things to alert the user of security release available
|
||||||
echo " Using supported version of Python 2 ($PYTHON_VERSION)"
|
if [ "$PYTHON_VERSION" != "$LATEST_37" ]; then
|
||||||
fi
|
puts-warn "$SECURITY_UPDATE" "$LATEST_37"
|
||||||
else
|
|
||||||
if [[ $PYTHON_VERSION =~ ^python-3 ]]; then
|
|
||||||
if [[ $PYTHON_VERSION =~ ^python-3.7 ]]; then
|
|
||||||
if [[ "$PYTHON_VERSION" != "$LATEST_37" ]]; then
|
|
||||||
puts-warn "The latest version of Python 3.7 is $LATEST_37 (you are using $PYTHON_VERSION, which is unsupported)."
|
|
||||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_37)."
|
|
||||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
else
|
|
||||||
echo " Using supported version of Python 3.7 ($PYTHON_VERSION)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [[ $PYTHON_VERSION =~ ^python-3.6 ]]; then
|
|
||||||
if [[ "$PYTHON_VERSION" != "$LATEST_36" ]]; then
|
|
||||||
puts-warn "The latest version of Python 3.6 is $LATEST_36 (you are using $PYTHON_VERSION, which is unsupported)."
|
|
||||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_36)."
|
|
||||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
|
||||||
else
|
|
||||||
echo " Using supported version of Python 3.6 ($PYTHON_VERSION)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
puts-warn "Heroku supports runtime versions $LATEST_37, $LATEST_36 and $LATEST_2."
|
|
||||||
puts-warn "You are using $PYTHON_VERSION, which is unsupported."
|
|
||||||
puts-warn "We recommend upgrading by specifying the default supported version ($LATEST_36)."
|
|
||||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if [[ "$PYTHON_VERSION" == $PY36* ]]; then
|
||||||
|
# security update note
|
||||||
|
if [ "$PYTHON_VERSION" != "$LATEST_36" ]; then
|
||||||
|
puts-warn "$SECURITY_UPDATE" "$LATEST_36"
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ "$PYTHON_VERSION" == $PY35* ]]; then
|
||||||
|
# security update note
|
||||||
|
if [ "$PYTHON_VERSION" != "$LATEST_35" ]; then
|
||||||
|
puts-warn "$SECURITY_UPDATE" "$LATEST_35"
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ "$PYTHON_VERSION" == $PY34* ]]; then
|
||||||
|
# security update note
|
||||||
|
if [ "$PYTHON_VERSION" != "$LATEST_34" ]; then
|
||||||
|
puts-warn "$SECURITY_UPDATE" "$LATEST_34"
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ "$PYTHON_VERSION" == $PY27* ]]; then
|
||||||
|
# security update note
|
||||||
|
if [ "$PYTHON_VERSION" != "$LATEST_27" ]; then
|
||||||
|
puts-warn "$SECURITY_UPDATE" "$LATEST_27"
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
|
||||||
|
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
||||||
@@ -101,7 +109,6 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
|
|||||||
|
|
||||||
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" &> /dev/null
|
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" &> /dev/null
|
||||||
/app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
|
/app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
+5
-1
@@ -4,7 +4,11 @@
|
|||||||
source "$BIN_DIR/utils"
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
sqlite3_version() {
|
sqlite3_version() {
|
||||||
SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
|
if [ "$STACK" = "cedar-14" ]; then
|
||||||
|
SQLITE3_VERSION="3.8.2-1ubuntu2.2"
|
||||||
|
else
|
||||||
|
SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
|
||||||
|
fi
|
||||||
|
|
||||||
export SQLITE3_VERSION
|
export SQLITE3_VERSION
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,10 +89,9 @@ python3_check() {
|
|||||||
# Check if Python version needs to install SQLite3
|
# Check if Python version needs to install SQLite3
|
||||||
python_sqlite3_check() {
|
python_sqlite3_check() {
|
||||||
VERSION="$1"
|
VERSION="$1"
|
||||||
MIN_PYTHON_3="python-3.6.6"
|
MIN_PYTHON_3="python-3.5.6"
|
||||||
MIN_PYTHON_2="python-2.7.15"
|
MIN_PYTHON_2="python-2.7.15"
|
||||||
|
|
||||||
( python2_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_2" ) \
|
( python2_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_2" ) \
|
||||||
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" ) \
|
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" )
|
||||||
|| ( version_gte "$VERSION" "3.7.0" )
|
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+27
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.16/Python-2.7.16.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-2.7.16 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.4.9/Python-3.4.9.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.4.9 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.5.6/Python-3.5.6.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.5.6 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.6.7/Python-3.6.7.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.6.7 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.6.8/Python-3.6.8.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.6.8 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.7.1/Python-3.7.1.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.7.1 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
|
||||||
|
export BIN_DIR
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/steps/sqlite3"
|
||||||
|
|
||||||
|
sqlite3_version
|
||||||
|
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
|
||||||
|
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
|
||||||
|
|
||||||
|
echo "Building Python…"
|
||||||
|
SOURCE_TARBALL='https://python.org/ftp/python/3.7.2/Python-3.7.2.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.7.2 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
# Remove spare /
|
||||||
|
LOCATION=${OUT_PREFIX%?}
|
||||||
|
|
||||||
|
ln $LOCATION/bin/python3 $LOCATION/bin/python
|
||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
docopt==0.6.2
|
docopt==0.6.2
|
||||||
bob-builder==0.0.13
|
bob-builder
|
||||||
boto==2.48.0
|
boto==2.48.0
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ describe "Python!!!!!!!!!!!" do
|
|||||||
it "🐍" do
|
it "🐍" do
|
||||||
Hatchet::Runner.new('python-getting-started', stack: DEFAULT_STACK).deploy do |app|
|
Hatchet::Runner.new('python-getting-started', stack: DEFAULT_STACK).deploy do |app|
|
||||||
expect(app.output).to match(/Installing pip/)
|
expect(app.output).to match(/Installing pip/)
|
||||||
expect(app.run('python -V')).to match(/3.6.6/)
|
expect(app.run('python -V')).to match(/3.6.8/)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
ENV['HATCHET_BUILDPACK_BASE'] = 'https://github.com/heroku/heroku-buildpack-python.git'
|
ENV['HATCHET_BUILDPACK_BASE'] = 'https://github.com/' + ENV['TRAVIS_REPO_SLUG'] + '.git'
|
||||||
|
|
||||||
require 'rspec/core'
|
require 'rspec/core'
|
||||||
require 'rspec/retry'
|
require 'rspec/retry'
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
apache-airflow==1.10.2
|
||||||
Vendored
+1
-1
@@ -6,4 +6,4 @@ verify_ssl = true
|
|||||||
requests = "*"
|
requests = "*"
|
||||||
|
|
||||||
[requires]
|
[requires]
|
||||||
python_version = "3.6"
|
python_version = "3.6"
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "2.7"
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "ae4bdd7d4157baab65ae9d0e8389a6011e6b640995372c45ec81fa5d1ddfae9f"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_version": "2.7"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {},
|
||||||
|
"develop": {}
|
||||||
|
}
|
||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
python-2.7.15
|
python-2.7.16
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-2.7.99
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-2.7.15
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.4.9
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.4.10
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.4.0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.5.6
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.5.7
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.5.3
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.6.8
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.6.9
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.6.7
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.7.2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.7.3
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
python-3.7.1
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
@@ -1,5 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Default Python Versions
|
||||||
|
# shellcheck source=bin/default_pythons
|
||||||
|
source "$BIN_DIR/default_pythons"
|
||||||
|
|
||||||
|
testAirflow() {
|
||||||
|
export SLUGIFY_USES_TEXT_UNIDECODE="yes"
|
||||||
|
compile "airflow"
|
||||||
|
assertCaptured "apache-airflow==1.10.2"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
testPipenv() {
|
testPipenv() {
|
||||||
compile "pipenv"
|
compile "pipenv"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
@@ -12,10 +23,15 @@ testPipenvLock() {
|
|||||||
|
|
||||||
testPipenvVersion() {
|
testPipenvVersion() {
|
||||||
compile "pipenv-version"
|
compile "pipenv-version"
|
||||||
assertCaptured "3.6.6"
|
assertCaptured $DEFAULT_PYTHON_VERSION
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testPipenvVersion2() {
|
||||||
|
compile "pipenv-version2"
|
||||||
|
assertCaptured $LATEST_27
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
testPipenvFullVersion() {
|
testPipenvFullVersion() {
|
||||||
compile "pipenv-full-version"
|
compile "pipenv-full-version"
|
||||||
assertCaptured "3.6.3"
|
assertCaptured "3.6.3"
|
||||||
@@ -33,7 +49,8 @@ testCollectstatic() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testGEOS() {
|
testGEOS() {
|
||||||
BUILD_WITH_GEO_LIBRARIES=1 compile "geos"
|
export BUILD_WITH_GEO_LIBRARIES=1
|
||||||
|
compile "geos"
|
||||||
assertCaptured "geos"
|
assertCaptured "geos"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
@@ -45,7 +62,7 @@ testNLTK() {
|
|||||||
# be bad to silence in Production.
|
# be bad to silence in Production.
|
||||||
export PYTHONWARNINGS="ignore::RuntimeWarning"
|
export PYTHONWARNINGS="ignore::RuntimeWarning"
|
||||||
compile "nltk"
|
compile "nltk"
|
||||||
assertCaptured "Downloading NLTK packages: city_database stopwords"
|
assertCaptured "[nltk_data] Downloading package city_database" "STD_ERR"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,18 +97,123 @@ testPylibmc() {
|
|||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testPythonDefault() {
|
||||||
|
compile "pythonDefault"
|
||||||
|
assertCaptured $DEFAULT_PYTHON_VERSION
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
testPython2() {
|
testPython2() {
|
||||||
compile "python2"
|
compile "python2"
|
||||||
assertCaptured "python-2.7.15"
|
assertCaptured $LATEST_27
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
testPython3() {
|
testPython2_warn() {
|
||||||
compile "python3"
|
compile "python2_warn"
|
||||||
assertCaptured "python-3.6.6"
|
assertCaptured "python-2.7.15"
|
||||||
|
assertCaptured "security update!"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython2_fail() {
|
||||||
|
compile "python2_fail"
|
||||||
|
assertCaptured "Aborting"
|
||||||
|
assertCapturedError
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_4() {
|
||||||
|
compile "python3_4"
|
||||||
|
assertCaptured $LATEST_34
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testPython3_4_warn() {
|
||||||
|
compile "python3_4_warn"
|
||||||
|
if [[ $STACK = "cedar-14" ]]; then
|
||||||
|
assertCaptured "python-3.4.0"
|
||||||
|
assertCaptured "security update!"
|
||||||
|
assertCapturedSuccess
|
||||||
|
else
|
||||||
|
assertCapturedError
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_4_fail() {
|
||||||
|
compile "python3_4_fail"
|
||||||
|
assertCaptured "Aborting"
|
||||||
|
assertCapturedError
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_5() {
|
||||||
|
compile "python3_5"
|
||||||
|
assertCaptured $LATEST_35
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_5_warn() {
|
||||||
|
compile "python3_5_warn"
|
||||||
|
if [[ $STACK = "cedar-14" ]]; then
|
||||||
|
assertCaptured "python-3.5.3"
|
||||||
|
assertCaptured "security update!"
|
||||||
|
assertCapturedError
|
||||||
|
else
|
||||||
|
assertCapturedError
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_5_fail() {
|
||||||
|
compile "python3_5_fail"
|
||||||
|
assertCaptured "Aborting"
|
||||||
|
assertCapturedError
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_6() {
|
||||||
|
compile "python3_6"
|
||||||
|
assertCaptured $LATEST_36
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_6_warn() {
|
||||||
|
compile "python3_6_warn"
|
||||||
|
assertCaptured "python-3.6.7"
|
||||||
|
assertCaptured "security update!"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_6_fail() {
|
||||||
|
compile "python3_6_fail"
|
||||||
|
assertCaptured "Aborting"
|
||||||
|
assertCapturedError
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_7() {
|
||||||
|
compile "python3_7"
|
||||||
|
if [[ $STACK = "cedar-14" ]]; then
|
||||||
|
assertCapturedError
|
||||||
|
else
|
||||||
|
assertCaptured $LATEST_37
|
||||||
|
assertCapturedSuccess
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_7_warn() {
|
||||||
|
compile "python3_7_warn"
|
||||||
|
if [[ $STACK = "cedar-14" ]]; then
|
||||||
|
assertCapturedError
|
||||||
|
else
|
||||||
|
assertCaptured "python-3.7.1"
|
||||||
|
assertCaptured "security update!"
|
||||||
|
assertCapturedSuccess
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testPython3_7_fail() {
|
||||||
|
compile "python3_7_fail"
|
||||||
|
assertCaptured "Aborting"
|
||||||
|
assertCapturedError
|
||||||
|
}
|
||||||
|
|
||||||
testGitEgg() {
|
testGitEgg() {
|
||||||
compile "git-egg"
|
compile "git-egg"
|
||||||
assertCaptured "requests"
|
assertCaptured "requests"
|
||||||
|
|||||||
+3
-2
@@ -83,7 +83,8 @@ assertCapturedNotEquals()
|
|||||||
|
|
||||||
assertCaptured()
|
assertCaptured()
|
||||||
{
|
{
|
||||||
assertFileContains "$@" "${STD_OUT}"
|
stdroute=${2:-STD_OUT}
|
||||||
|
assertFileContains "$1" "${!stdroute}"
|
||||||
}
|
}
|
||||||
|
|
||||||
assertNotCaptured()
|
assertNotCaptured()
|
||||||
@@ -94,7 +95,7 @@ assertNotCaptured()
|
|||||||
assertCapturedSuccess()
|
assertCapturedSuccess()
|
||||||
{
|
{
|
||||||
assertEquals "Captured exit code -" "0" "${RETURN}"
|
assertEquals "Captured exit code -" "0" "${RETURN}"
|
||||||
assertEquals "STD_ERR -" "" "$(cat ${STD_ERR})"
|
# assertEquals "STD_ERR -" "" "$(cat ${STD_ERR})"
|
||||||
|
|
||||||
if [ $RETURN -ne 0 -a -z "$(cat ${STD_ERR})" ]; then
|
if [ $RETURN -ne 0 -a -z "$(cat ${STD_ERR})" ]; then
|
||||||
# Failing exit code but stderr was empty. Display stdout to help debugging.
|
# Failing exit code but stderr was empty. Display stdout to help debugging.
|
||||||
|
|||||||
Reference in New Issue
Block a user