Compare commits

...

78 Commits

Author SHA1 Message Date
Casey ff42f318a0 Merge pull request #848 from heroku/cleanup-output
download get-pip silently
2019-09-12 16:17:11 -07:00
Casey 09b5fe4881 Merge branch 'master' into cleanup-output 2019-09-12 15:36:12 -07:00
Casey 7a431ee717 Merge pull request #847 from heroku/codeinteger-6-readme
Update README.md
2019-09-12 15:12:30 -07:00
Casey Faist a80f2be020 download get-pip silently 2019-09-12 14:31:09 -07:00
Casey 15289a94f1 Merge branch 'master' into codeinteger-6-readme 2019-09-12 14:28:16 -07:00
Casey a013e54769 Merge pull request #846 from heroku/patch-1
Patch 1 from PiDelport
2019-09-12 14:28:06 -07:00
codeinteger6 bf8f9419ec Update README.md 2019-09-12 13:39:50 -07:00
Casey 3346bbc324 Merge branch 'master' into patch-1 2019-09-12 13:31:09 -07:00
Casey ebfe4946df Merge pull request #844 from heroku/post-release-changelog
New Release: Changelog update
2019-09-12 11:25:52 -07:00
Casey Faist 0bfd1bd51f Merge branch 'patch-1' of https://github.com/PiDelport/heroku-buildpack-python into patch-1 2019-09-12 11:18:01 -07:00
Pi Delport b1b3ab1c92 (Typo: requriements -> requirements) 2019-09-12 11:13:03 -07:00
Casey dfb8185a63 Merge branch 'master' into patch-1 2019-09-12 11:13:03 -07:00
Casey Faist 1c5e876e3d post release changelog update 2019-09-12 10:06:59 -07:00
Casey 149c046f5f Merge pull request #843 from heroku/hatchet/test-updates
Hatchet/test updates
2019-09-12 09:32:29 -07:00
Casey Faist fc4cbf272a steal Ruby's Master heading for pre-release changelog documentation 2019-09-12 08:54:16 -07:00
Casey Faist 61ead23f7f bump hatchet default python 2019-09-12 08:44:10 -07:00
Casey Faist f3738a0e70 update changelog 2019-09-12 08:43:35 -07:00
Casey 1e92f31436 Merge pull request #841 from heroku/v-156
Release the snakes! (Python 3.7.4 and 3.6.9)
2019-09-11 19:07:54 -07:00
Casey Faist c969fa0d36 update default pythons 2019-09-11 17:39:38 -07:00
Casey Faist 1851bbf285 update changelog 2019-09-11 17:39:38 -07:00
Casey a41fd78f72 Merge pull request #840 from heroku/remove-get-pip
Move get-pip utility to s3
2019-09-11 17:33:45 -07:00
Casey Faist 56322381f0 Revert "update get-pip to look for sha"
This reverts commit a2f3ff7a35.
2019-09-11 16:59:20 -07:00
Casey Faist dc878449ee Revert "update default_pythons to include sha version"
This reverts commit 204a6215b2.
2019-09-11 16:59:11 -07:00
Casey Faist 204a6215b2 update default_pythons to include sha version 2019-09-11 16:37:26 -07:00
Casey Faist a2f3ff7a35 update get-pip to look for sha 2019-09-11 16:36:48 -07:00
Casey Faist c3328f57dd correct cedar-14 ref in Makefile 2019-09-11 14:04:35 -07:00
Casey Faist 5df70ce26c remove get-pip from repo 2019-09-11 13:37:18 -07:00
Casey Faist 44fe0fe3fd move get-pip to s3 2019-09-11 13:37:18 -07:00
Casey b8d1035231 Merge pull request #799 from heroku/build-cleanup
Build cleanup
2019-09-11 13:34:56 -07:00
Casey Faist 006ea77641 address issues found in review 2019-09-11 11:57:31 -07:00
Casey Faist a239fde78c clarify naming for travis docker tags and correct typo 2019-09-10 18:50:50 -07:00
Casey Faist 783c2e2329 ensure and add comments to base python formulas 2019-09-10 18:35:54 -07:00
Casey Faist 06694bba18 simplify pr for review, pull out staged binaries tooling 2019-09-10 18:29:04 -07:00
Casey Faist 158a3e28a8 update travis to match dockerfile locations 2019-09-10 18:26:14 -07:00
Casey Faist 9031333ef4 change travis to bionic 2019-09-10 18:20:25 -07:00
Casey Faist b6e2739fb5 add Cedar 14 environment back for tests and binaries 2019-09-10 18:20:25 -07:00
Casey Faist a8da6e4ed5 add cedar-14 back in after clarification on support policy
Heroku will continue to build binaries as long as stacks receive updates,
even after EOL
2019-09-10 18:20:25 -07:00
Casey Faist 707ed848bb fix typo in compile 2019-09-10 18:20:25 -07:00
Casey Faist 385296c270 Add support for testing binaries in staging/ on S3
This will allow for faster and more transparent deploys for Python and
other built dependencies.
2019-09-10 18:20:25 -07:00
Casey Faist 12279e69d5 Clean up comments from python3 2019-09-10 18:20:25 -07:00
Casey Faist b5fa65d96c update Makefile to match new directory structure 2019-09-10 18:20:25 -07:00
Casey Faist a724dfc62e Add new formula for python3 and latest 3.6 and 3.7 patches 2019-09-10 18:20:25 -07:00
Casey Faist aecdeddc32 clean up rebase 2019-09-10 18:20:25 -07:00
Casey Faist f3af6aa4a2 add python3 formula 2019-09-10 18:20:25 -07:00
Casey Faist 6bc4d42774 first try for python-3.6.9 2019-09-10 18:20:25 -07:00
Casey Faist e1d0fcae0e remove Cedar from binary docs 2019-09-10 18:20:25 -07:00
David Zuelke 8f1b24f64e expose $STACK env to each image so it can be used in formulae 2019-09-10 18:20:25 -07:00
David Zuelke 97e3366409 move Dockerfiles to central location, add all stacks, update README 2019-09-10 18:20:25 -07:00
David Zuelke 4f8bb77b13 expose $STACK env to each image so it can be used in formulae 2019-09-10 18:20:25 -07:00
David Zuelke a771b7bf94 move Dockerfiles to central location, add all stacks, update README 2019-09-10 18:20:25 -07:00
David Zuelke b52fac4d32 reuse logic in runtimes/pypy3 formulae 2019-09-10 18:20:25 -07:00
David Zuelke e28c1012b7 reuse logic in runtimes/pypy formulae 2019-09-10 18:20:25 -07:00
Casey 05b7ceb82c Merge pull request #839 from heroku/test-breakout
Test breakout
2019-09-10 18:19:12 -07:00
Casey Faist a379779d43 add missing --tag option 2019-09-10 17:52:54 -07:00
Casey Faist de1696bb02 split out build and run script steps 2019-09-10 17:33:44 -07:00
Casey Faist 77b012dd6f add tags to docker scripts to pass images to test run cases 2019-09-10 17:22:53 -07:00
Casey Faist 3d65278d61 add multiple script steps to trigger matrix across docker files 2019-09-10 17:13:41 -07:00
Casey Faist 59544ee799 use keyword dockerfile to trigger matrix 2019-09-10 17:05:07 -07:00
Casey Faist 34a631021c update test runs to matrix 2019-09-10 16:36:13 -07:00
Casey Faist 6a4ab8646a add ci nodes to test run 2019-09-10 16:04:11 -07:00
Casey Faist 7d8ea3d266 add stack value back in 2019-09-10 15:32:59 -07:00
Casey Faist 0161b80a2b correct hatchet setup 2019-09-10 15:15:29 -07:00
Casey Faist 7eac72199e parallel test runs per stack 2019-09-10 15:09:43 -07:00
Casey Faist df779aaa9a reorganize tests to stage per stack 2019-09-10 14:56:08 -07:00
Casey Faist bbdbebbc87 shell command only needed when using make, remove 2019-09-10 13:50:09 -07:00
Casey Faist 32cf8a8681 fix dockerfile location typo 2019-09-10 13:44:22 -07:00
Casey Faist 1479ab375e ensure tabs are spaces 2019-09-10 13:33:55 -07:00
Casey Faist 8366d66f54 add pre-commit-hook for travis file 2019-09-10 12:16:11 -07:00
Casey Faist b156f237a2 breakout jobs 2019-09-10 12:08:31 -07:00
Casey Faist 0ffbf60882 split out tests to avoid timeouts 2019-09-10 11:53:33 -07:00
Casey c458743a2a Merge pull request #836 from heroku/pin-docker18
pin package versions for python-pip to bionic-security
2019-08-28 17:15:16 -07:00
Casey Faist 0ff53eb59b pin package versions for python-pip to bionic-security
so that we do not get an update of libssl to 1.1.1, since the stack is still on 1.1.0
2019-08-28 15:15:17 -07:00
Casey 96ffc147d4 Merge pull request #831 from heroku/remove-cedar-tests
Remove cedar tests
2019-08-21 16:20:22 -07:00
Casey Faist 4063e9d22e remove cedar 14 make test command, as cedar is deprecated 2019-08-21 15:45:18 -07:00
Casey Faist 751413168b remove cedar 14 travis tests 2019-08-21 15:44:46 -07:00
Casey 527ea604c8 Merge pull request #829 from josegonzalez/heroku-18-build
feat: add docs and make target for heroku-18 bob builds
2019-08-21 15:41:30 -07:00
Jose Diaz-Gonzalez 302c2f0432 feat: add docs and make target for heroku-18 bob builds 2019-08-15 17:36:40 -04:00
Pi Delport 3880b1affa (Typo: requriements -> requirements) 2019-06-06 21:53:26 +02:00
36 changed files with 637 additions and 22843 deletions
+3
View File
@@ -7,3 +7,6 @@ repos/*
#Venv #Venv
buildpack/* buildpack/*
builds/dockerenv.staging*
builds/dockerenv.production
+5 -3
View File
@@ -1,5 +1,7 @@
repos: repos:
- repo: git://github.com/detailyang/pre-commit-shell - repo: https://github.com/pre-commit/pre-commit-hooks
rev: 1.0.4 rev: v2.3.0
hooks: hooks:
- id: shell-lint - id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
+22 -18
View File
@@ -1,35 +1,39 @@
language: ruby language: ruby
dist: trusty dist: trusty
sudo: required sudo: required
rvm: 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 hatchet ci:setup - bundle exec hatchet ci:setup
script:
- docker build --pull --tag travis-build-cedar-14 --file $(pwd)/builds/cedar-14.Dockerfile .
- 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" 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" travis-build-heroku-18 bash $TESTFOLDER
jobs: jobs:
include: include:
- stage: Bash linting (shellcheck) - stage: Bash linting (shellcheck)
sudo: false sudo: false
script: make check script: make check
- stage: Stack Unit Tests
services: docker
env: STACK=heroku-18
script: "./tests.sh"
- stage: Stack Unit Tests
services: docker
env: STACK=heroku-16
script: "./tests.sh"
- stage: Stack Unit Tests
services: docker
env: STACK=cedar-14
script: "./tests.sh"
- stage: Hatchet Integration - stage: Hatchet Integration
if: branch = master
name: Run Hatchet
script: "bundle exec rspec" script: "bundle exec rspec"
env: env:
matrix:
- TESTFOLDER=test/run-deps
- TESTFOLDER=test/run-versions
- TESTFOLDER=test/run-features
global: global:
- 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 - HATCHET_DEPLOY_STRATEGY=git
- secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E= - secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E=
- secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As= - secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As=
+16
View File
@@ -1,5 +1,21 @@
# Python Buildpack Changelog # Python Buildpack Changelog
# Master
--------------------------------------------------------------------------------
# 156 (2019-09-12)
- Python 3.6.9 and 3.7.4 now available.
- Move get-pip utility to S3
- Build utility and documentation updates
- Bump Hatchet tests to point at new default python version.
# 155 (2019-08-22)
add docs and make target for heroku-18 bob builds
# 154 (2019-07-17) # 154 (2019-07-17)
Fix python 3.5.7 formula actually building 3.7.2 Fix python 3.5.7 formula actually building 3.7.2
+18 -5
View File
@@ -1,7 +1,7 @@
# These targets are not files # These targets are not files
.PHONY: tests .PHONY: tests
test: test-heroku-18 test-heroku-16 test: test-heroku-18 test-heroku-16 test-cedar-14
check: check:
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings bin/default_pythons @shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings bin/default_pythons
@@ -10,23 +10,23 @@ check:
test-cedar-14: test-cedar-14:
@echo "Running tests in docker (cedar-14)..." @echo "Running tests in docker (cedar-14)..."
@docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=cedar-14" heroku/cedar:14 bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run;' @docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=cedar-14" heroku/cedar:14 bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run-deps; test/run-features; test/run-versions;'
@echo "" @echo ""
test-heroku-16: test-heroku-16:
@echo "Running tests in docker (heroku-16)..." @echo "Running tests in docker (heroku-16)..."
@docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=heroku-16" heroku/heroku:16-build bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run;' @docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=heroku-16" heroku/heroku:16-build bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run-deps; test/run-features; test/run-versions;'
@echo "" @echo ""
test-heroku-18: test-heroku-18:
@echo "Running tests in docker (heroku-18)..." @echo "Running tests in docker (heroku-18)..."
@docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=heroku-18" heroku/heroku:18-build bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run;' @docker run -v $(shell pwd):/buildpack:ro --rm -it -e "STACK=heroku-18" heroku/heroku:18-build bash -c 'cp -r /buildpack /buildpack_test; cd /buildpack_test/; test/run-deps; test/run-features; test/run-versions;'
@echo "" @echo ""
buildenv-heroku-16: buildenv-heroku-16:
@echo "Creating build environment (heroku-16)..." @echo "Creating build environment (heroku-16)..."
@echo @echo
@docker build --pull -t python-buildenv-heroku-16 . @docker build --pull -f $(shell pwd)/builds/heroku-16.Dockerfile -t python-buildenv-heroku-16 .
@echo @echo
@echo "Usage..." @echo "Usage..."
@echo @echo
@@ -36,6 +36,19 @@ buildenv-heroku-16:
@echo @echo
@docker run -it --rm python-buildenv-heroku-16 @docker run -it --rm python-buildenv-heroku-16
buildenv-heroku-18:
@echo "Creating build environment (heroku-18)..."
@echo
@docker build --pull -f $(shell pwd)/builds/heroku-18.Dockerfile -t python-buildenv-heroku-18 .
@echo
@echo "Usage..."
@echo
@echo " $$ export AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar # Optional unless deploying"
@echo " $$ bob build runtimes/python-2.7.13"
@echo " $$ bob deploy runtimes/python-2.7.13"
@echo
@docker run -it --rm python-buildenv-heroku-18
tools: tools:
git clone https://github.com/kennethreitz/pip-pop.git git clone https://github.com/kennethreitz/pip-pop.git
mv pip-pop/bin/* vendor/pip-pop/ mv pip-pop/bin/* vendor/pip-pop/
+5 -5
View File
@@ -26,7 +26,7 @@ remote: Compressing source files... done.
remote: Building source: remote: Building source:
remote: remote:
remote: -----> Python app detected remote: -----> Python app detected
remote: -----> Installing python-3.7.1 remote: -----> Installing python-3.7.4
remote: -----> Installing pip remote: -----> Installing pip
remote: -----> Installing SQLite3 remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip remote: -----> Installing requirements with pip
@@ -44,7 +44,7 @@ A `requirements.txt` must be present at the root of your application's repositor
To specify your python version, you also need a `runtime.txt` file - unless you are using the default Python runtime version. To specify your python version, you also need a `runtime.txt` file - unless you are using the default Python runtime version.
Current default Python Runtime: Python 3.6.7 Current default Python Runtime: Python 3.6.9
Alternatively, you can provide a `setup.py` file, or a `Pipfile`. Using `Pipenv` will generate `runtime.txt` based on `python-version` at build time. Alternatively, you can provide a `setup.py` file, or a `Pipfile`. Using `Pipenv` will generate `runtime.txt` based on `python-version` at build time.
@@ -61,9 +61,9 @@ Specify a Python Runtime
Supported runtime options include: Supported runtime options include:
- `python-3.7.1` - `python-3.7.4`
- `python-3.6.7` - `python-3.6.9`
- `python-2.7.15` - `python-2.7.16`
## Tests ## Tests
+3 -3
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
DEFAULT_PYTHON_VERSION="python-3.6.8" DEFAULT_PYTHON_VERSION="python-3.6.9"
LATEST_36="python-3.6.8" LATEST_36="python-3.6.9"
LATEST_37="python-3.7.3" LATEST_37="python-3.7.4"
LATEST_35="python-3.5.7" LATEST_35="python-3.5.7"
LATEST_34="python-3.4.10" LATEST_34="python-3.4.10"
LATEST_27="python-2.7.16" LATEST_27="python-2.7.16"
+1 -1
View File
@@ -26,7 +26,7 @@ fi
if [ ! "$SKIP_PIPENV_INSTALL" ]; then if [ ! "$SKIP_PIPENV_INSTALL" ]; then
# Pipenv support (Generate requriements.txt with pipenv). # Pipenv support (Generate requirements.txt with pipenv).
if [[ -f Pipfile ]]; then if [[ -f Pipfile ]]; then
# Measure that we're using Pipenv. # Measure that we're using Pipenv.
mcount "tool.pipenv" mcount "tool.pipenv"
+10 -1
View File
@@ -97,6 +97,15 @@ if [ ! "$SKIP_INSTALL" ]; then
hash -r hash -r
fi fi
# Heroku uses the get-pip utility maintained by the Python community to vendor Pip.
# https://github.com/pypa/get-pip
GETPIP="https://lang-python.s3.amazonaws.com/etc/get-pip.py"
if ! curl -s "${GETPIP}" -o "$ROOT_DIR/get-pip.py" &> /dev/null; then
mcount "failure.python.get-pip"
echo "Failed to pull down get-pip"
exit 1
fi
# If Pip isn't up to date: # If Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
@@ -107,7 +116,7 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
rm -fr /app/.heroku/python/lib/python*/site-packages/pip-* rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-* rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" &> /dev/null /app/.heroku/python/bin/python "$ROOT_DIR/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
+42 -26
View File
@@ -1,41 +1,57 @@
# Python Buildpack Binaries # Python Buildpack Binaries
For Cedar-14 stack ## Building the Docker Images
------------------
To get started with it, create an app on Heroku inside a clone of this repository, and set your S3 config vars: **After every change to your formulae, perform the following** from the root of the Git repository (not from `builds/`) to rebuild the images for each stack:
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-python#not-heroku $ docker build --pull --tag heroku-python-build-cedar-14 --file $(pwd)/builds/cedar-14.Dockerfile .
$ heroku config:set WORKSPACE_DIR=builds $ docker build --pull --tag heroku-python-build-heroku-16 --file $(pwd)/builds/heroku-16.Dockerfile .
$ heroku config:set AWS_ACCESS_KEY_ID=<your_aws_key> $ docker build --pull --tag heroku-python-build-heroku-18 --file $(pwd)/builds/heroku-18.Dockerfile .
$ heroku config:set AWS_SECRET_ACCESS_KEY=<your_aws_secret>
$ heroku config:set S3_BUCKET=<your_s3_bucket_name>
## Using the Image
Then, shell into an instance and run a build by giving the name of the formula inside `builds`: You can e.g. `bash` into each of the images you built using their tag:
$ heroku run bash docker run --rm -ti heroku-python-build-cedar-14 bash
Running `bash` attached to terminal... up, run.6880 docker run --rm -ti heroku-python-build-heroku-16 bash
~ $ bob build runtimes/python-2.7.6 docker run --rm -ti heroku-python-build-heroku-18 bash
Fetching dependencies... found 2: You then have a shell where you can run `bob build`, `bob deploy`, and so forth. You can of course also invoke these programs directly with `docker run`:
- libraries/sqlite
Building formula runtimes/python-2.7.6: docker run --rm -ti heroku-python-build-heroku-18 bob build runtimes/python-2.7.15
=== Building Python 2.7.6
Fetching Python v2.7.6 source...
Compiling...
If this works, run `bob deploy` instead of `bob build` to have the result uploaded to S3 for you. In order to `bob deploy`, AWS credentials must be set up, as well as name and prefix of your custom S3 bucket (unless you're deploying to the Heroku production buckets that are pre-defined in each `Dockerfile`); see next section for details.
To speed things up drastically, it'll usually be a good idea to `heroku run bash --size PX` instead. ## Configuration
For Heroku-16 stack File `dockerenv.default` contains a list of required env vars; most of these have default values defined in `Dockerfile`. You can copy this file to a location outside the buildpack and modify it with the values you desire and pass its location with `--env-file`, or pass the env vars to `docker run` using `--env`.
-------------------
1. Ensure GNU Make and Docker are installed. Out of the box, each `Dockerfile` has the correct values predefined for `S3_BUCKET`, `S3_PREFIX`, and `S3_REGION`. If you're building your own packages, you'll likely want to change `S3_BUCKET` and `S3_PREFIX` to match your info. Instead of setting `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` into that file, you may also pass them to `docker run` through the environment, or explicitly using `--env`, in order to prevent accidental commits of credentials.
2. From the root of the buildpack repository, run: `make buildenv-heroku-16`
3. Follow the instructions displayed!
### Passing AWS credentials to the container
Enjoy :) If you want to deploy packages and thus need to pass `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, you can either pass them explicitly, through your environment, or through an env file.
#### Passing credentials explicitly
docker run --rm -ti -e AWS_ACCESS_KEY_ID=... -e AWS_SECRET_ACCESS_KEY=... heroku-python-build-heroku-18 bash
#### Passing credentials through the environment
The two environment variables `AWS_ACCESS_KEY_ID`and `AWS_SECRET_ACCESS_KEY` are defined in `builds/dockerenv.default`, without values. This will cause Docker to "forward" values for these variables from the current environment, so you can pass them in:
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... docker run --rm -ti --env-file=builds/dockerenv.default heroku-python-build-heroku-18 bash
or
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
docker run --rm -ti --env-file=builds/dockerenv.default heroku-python-build-heroku-18 bash
#### Passing credentials through a separate env file
This method is the easiest for users who want to build packages in their own S3 bucket, as they will have to adjust the `S3_BUCKET` and `S3_PREFIX` environment variable values anyway from their default values.
For this method, it is important to keep the credentials file in a location outside the buildpack, so that your credentials aren't accidentally committed. Copy `builds/dockerenv.default` **to a safe location outside the buildpack directory**, and insert your values for `AWS_ACCESS_KEY_ID`and `AWS_SECRET_ACCESS_KEY`.
docker run --rm -ti --env-file=../SOMEPATHOUTSIDE/s3.env heroku-python-build-heroku-18 bash
@@ -1,14 +1,15 @@
FROM heroku/heroku:18-build FROM heroku/cedar:14
WORKDIR /app WORKDIR /app
ENV WORKSPACE_DIR="/app/builds" \ ENV WORKSPACE_DIR="/app/builds" \
S3_BUCKET="lang-python" \ S3_BUCKET="lang-python" \
S3_PREFIX="heroku-18/" \ S3_PREFIX="cedar-14/" \
DEBIAN_FRONTEND=noninteractive DEBIAN_FRONTEND=noninteractive \
STACK="cedar-14"
RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/*
COPY requirements.txt /app/ COPY requirements.txt /app/
RUN pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt RUN pip install -r /app/requirements.txt
COPY . /app COPY . /app
+5
View File
@@ -0,0 +1,5 @@
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
S3_BUCKET
S3_PREFIX
S3_REGION
+2 -1
View File
@@ -4,7 +4,8 @@ WORKDIR /app
ENV WORKSPACE_DIR="/app/builds" \ ENV WORKSPACE_DIR="/app/builds" \
S3_BUCKET="lang-python" \ S3_BUCKET="lang-python" \
S3_PREFIX="heroku-16/" \ S3_PREFIX="heroku-16/" \
DEBIAN_FRONTEND=noninteractive DEBIAN_FRONTEND=noninteractive \
STACK="heroku-16"
RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/*
+15
View File
@@ -0,0 +1,15 @@
FROM heroku/heroku:18-build
WORKDIR /app
ENV WORKSPACE_DIR="/app/builds" \
S3_BUCKET="lang-python" \
S3_PREFIX="heroku-18/" \
DEBIAN_FRONTEND=noninteractive \
STACK="heroku-18"
RUN apt-get update && apt-get install --no-install-recommends -y python-pip-whl=9.0.1-2 python-pip=9.0.1-2 python-setuptools python-wheel && rm -rf /var/lib/apt/lists/*
COPY requirements.txt /app/
RUN pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt
COPY . /app
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
# fail hard
set -o pipefail
# fail harder
set -eu
OUT_PREFIX=$1
dep_formula=${0#$WORKSPACE_DIR/} # this is the original script, e.g. pypy-5.3.1
dep_name=$(basename $BASH_SOURCE) # this is us
dep_version=${dep_formula##*"/${dep_name}-"} # "subtract" our name from full version name
dep_package=${dep_name}2-v${dep_version} # it's always "pypy2-…"
dep_dirname=${dep_package}-linux64
dep_archive_name=${dep_dirname}.tar.bz2
dep_url=https://bitbucket.org/pypy/pypy/downloads/${dep_archive_name}
echo "Building PyPy…"
curl -L "${dep_url}" | tar jx -C "${OUT_PREFIX}" --strip-components 1 # extract to $OUT_PREFIX, drop the first directory level, which is the archive name
ln "$OUT_PREFIX/bin/pypy" "$OUT_PREFIX/bin/python"
+1 -10
View File
@@ -2,13 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar. source $(dirname $0)/pypy
OUT_PREFIX=$1
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+1 -10
View File
@@ -2,13 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar. source $(dirname $0)/pypy
OUT_PREFIX=$1
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy2-v5.6.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+1 -10
View File
@@ -2,13 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 and heroku-16 stacks, not cedar. source $(dirname $0)/pypy
OUT_PREFIX=$1
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy2-v5.7.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+1 -10
View File
@@ -2,13 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar. source $(dirname $0)/pypy
OUT_PREFIX=$1
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy2-v5.7.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+1 -8
View File
@@ -2,11 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
OUT_PREFIX=$1 source $(dirname $0)/pypy
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy2-v5.8.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
# fail hard
set -o pipefail
# fail harder
set -eu
OUT_PREFIX=$1
dep_formula=${0#$WORKSPACE_DIR/} # this is the original script, e.g. pypy-5.3.1
dep_name=$(basename $BASH_SOURCE) # this is us
dep_version=${dep_formula##*"/${dep_name}-"} # "subtract" our name from full version name
dep_package=${dep_name}${dep_version_prefix:-}-v${dep_version}${dep_version_suffix:-}
dep_dirname=${dep_package}-linux64
dep_archive_name=${dep_dirname}.tar.bz2
dep_url=https://bitbucket.org/pypy/pypy/downloads/${dep_archive_name}
echo "Building PyPy3…"
curl -L "${dep_url}" | tar jx -C "${OUT_PREFIX}" --strip-components 1 # extract to $OUT_PREFIX, drop the first directory level, which is the archive name
ln "$OUT_PREFIX/bin/pypy3" "$OUT_PREFIX/bin/python"
+1 -10
View File
@@ -2,13 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar. source $(dirname $0)/pypy3
OUT_PREFIX=$1
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-2.4.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy3-2.4.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
+4 -10
View File
@@ -2,13 +2,7 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar. # version pypy3-5.5.0 is really called pypy3.3-v5.5.0-alpha
dep_version_prefix=".3"
OUT_PREFIX=$1 dep_version_suffix="-alpha"
source $(dirname $0)/pypy3
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3.3-v5.5.0-alpha-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy3-v5.5.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
+1 -8
View File
@@ -2,11 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
OUT_PREFIX=$1 source $(dirname $0)/pypy3
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.7.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy3-v5.7.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
+1 -8
View File
@@ -2,11 +2,4 @@
# Build Path: /app/.heroku/python/ # Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite # Build Deps: libraries/sqlite
OUT_PREFIX=$1 source $(dirname $0)/pypy3
echo "Building PyPy…"
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.8.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy3-v5.8.0-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
source $(dirname $0)/python3
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
source $(dirname $0)/python3
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# Orient ourselves and build download link
dep_formula=${0#$WORKSPACE_DIR/} # this is the original script, e.g. pypy-5.3.1
BASE=${dep_formula##*/} # this gives us relative path
python_version=${BASE^} # this gives us only the filename with version number
version_number=$(echo "$python_version" | cut -d- -f2) # this returns just X.X.X
dep_url=https://python.org/ftp/python/${version_number}/${python_version}.tgz
# 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 3..."
echo "Pulling from source: ${dep_url}"
curl -L "${dep_url}" | tar xz -C "${OUT_PREFIX}"
mv "${OUT_PREFIX}/${python_version}" 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 '{}' +
+45
View File
@@ -0,0 +1,45 @@
#!/usr/bin/env bash
# fail hard
set -o pipefail
# fail harder
set -eu
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# Orient ourselves and build download link
dep_formula=${0#$WORKSPACE_DIR/} # this is the original script, e.g. pypy-5.3.1
BASE=${dep_formula##*/} # this gives us relative path
python_version=${BASE^} # this gives us only the filename with version number
version_number=$(echo "$python_version" | cut -d- -f2) # this returns just X.X.X
dep_url=https://python.org/ftp/python/${version_number}/${python_version}.tgz
# 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 3..."
echo "Pulling from source: ${dep_url}"
curl -L "${dep_url}" | tar xz -C "${OUT_PREFIX}"
mv "${OUT_PREFIX}/${python_version}" 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
View File
@@ -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.8/) expect(app.run('python -V')).to match(/3.6.9/)
end end
end end
end end
-318
View File
@@ -1,318 +0,0 @@
#!/usr/bin/env bash
# Default Python Versions
# shellcheck source=bin/default_pythons
source "bin/default_pythons"
testAirflow() {
export SLUGIFY_USES_TEXT_UNIDECODE="yes"
compile "airflow"
assertCaptured "apache-airflow==1.10.2"
assertCapturedSuccess
}
testPipenv() {
compile "pipenv"
assertCapturedSuccess
}
testPipenvLock() {
compile "pipenv-lock"
assertCapturedSuccess
}
testPipenvVersion() {
compile "pipenv-version"
assertCaptured $DEFAULT_PYTHON_VERSION
assertCapturedSuccess
}
testPipenvVersion2() {
compile "pipenv-version2"
assertCaptured $LATEST_27
assertCapturedSuccess
}
testPipenvFullVersion() {
compile "pipenv-full-version"
assertCaptured "3.6.3"
assertCapturedSuccess
}
testNoRequirements() {
compile "no-requirements"
assertCapturedError
}
testCollectstatic() {
compile "collectstatic"
assertCaptured "collectstatic"
}
testGEOS() {
export BUILD_WITH_GEO_LIBRARIES=1
compile "geos"
assertCaptured "geos"
assertCapturedSuccess
}
testNLTK() {
# NOTE: This is a RuntimeWarning emitted by Python 3's runpy.py script
# which is what is used when you call `python -m <module>`. This is due to
# how nltk imports things. It's not actually an error, but it would probably
# be bad to silence in Production.
export PYTHONWARNINGS="ignore::RuntimeWarning"
compile "nltk"
assertCaptured "[nltk_data] Downloading package city_database" "STD_ERR"
assertCapturedSuccess
}
testSetupPy() {
compile "setup-py"
assertCaptured "maya"
assertCapturedSuccess
}
testStandardRequirements() {
compile "requirements-standard"
assertCaptured "requests"
assertCapturedSuccess
}
testPsycopg2() {
compile "psycopg2"
assertCaptured "psycopg2"
assertCapturedSuccess
}
testCffi() {
compile "cffi"
assertCaptured "cffi"
assertCapturedSuccess
}
testPylibmc() {
compile "pylibmc"
assertCaptured "pylibmc"
assertCapturedSuccess
}
testPythonDefault() {
updateVersion "pythonDefault" $DEFAULT_PYTHON_VERSION
compile "pythonDefault"
assertCaptured $DEFAULT_PYTHON_VERSION
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2() {
updateVersion "python2" $LATEST_27
echo $LATEST_27 > "runtime.txt"
compile "python2"
assertCaptured $LATEST_27
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2_warn() {
compile "python2_warn"
assertCaptured "python-2.7.15"
assertCaptured "security update!"
assertCapturedSuccess
}
testPython2_fail() {
compile "python2_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_4() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_4" $LATEST_34
compile "python3_4"
assertCaptured $LATEST_34
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
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() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_5" $LATEST_35
compile "python3_5"
assertCaptured $LATEST_35
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
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() {
updateVersion "python3_6" $LATEST_36
compile "python3_6"
assertCaptured $LATEST_36
assertNotCaptured "security update"
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() {
updateVersion "python3_7" $LATEST_37
compile "python3_7"
if [[ $STACK = "cedar-14" ]]; then
assertCapturedError
else
assertNotCaptured "security update"
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() {
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"
assertCaptured "Uninstalling requests"
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
}
pushd $(dirname 0) >/dev/null
popd >/dev/null
source $(pwd)/test/utils
mktmpdir() {
dir=$(mktemp -t testXXXXX)
rm -rf $dir
mkdir $dir
echo $dir
}
detect() {
capture $(pwd)/bin/detect $(pwd)/test/fixtures/$1
}
compile_dir=""
default_process_types_cleanup() {
file="/tmp/default_process_types"
if [ -f "$file" ]; then
rm "$file"
fi
}
compile() {
default_process_types_cleanup
bp_dir=$(mktmpdir)
compile_dir=$(mktmpdir)
cp -a $(pwd)/* ${bp_dir}
cp -a ${bp_dir}/test/fixtures/$1/. ${compile_dir}
capture ${bp_dir}/bin/compile ${compile_dir} ${2:-$(mktmpdir)} $3
}
compileDir() {
default_process_types_cleanup
local bp_dir=$(mktmpdir)
local compile_dir=${1:-$(mktmpdir)}
local cache_dir=${2:-$(mktmpdir)}
local env_dir=$3
cp -a $(pwd)/* ${bp_dir}
capture ${bp_dir}/bin/compile ${compile_dir} ${cache_dir} ${env_dir}
}
release() {
bp_dir=$(mktmpdir)
cp -a $(pwd)/* ${bp_dir}
capture ${bp_dir}/bin/release ${bp_dir}/test/fixtures/$1
}
assertFile() {
assertEquals "$1" "$(cat ${compile_dir}/$2)"
}
source $(pwd)/test/shunit2
Executable
+59
View File
@@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Default Python Versions
# shellcheck source=bin/default_pythons
source "bin/default_pythons"
testAirflow() {
export SLUGIFY_USES_TEXT_UNIDECODE="yes"
compile "airflow"
assertCaptured "apache-airflow==1.10.2"
assertCapturedSuccess
}
testCollectstatic() {
compile "collectstatic"
assertCaptured "collectstatic"
}
testGEOS() {
export BUILD_WITH_GEO_LIBRARIES=1
compile "geos"
assertCaptured "geos"
assertCapturedSuccess
}
testNLTK() {
# NOTE: This is a RuntimeWarning emitted by Python 3's runpy.py script
# which is what is used when you call `python -m <module>`. This is due to
# how nltk imports things. It's not actually an error, but it would probably
# be bad to silence in Production.
export PYTHONWARNINGS="ignore::RuntimeWarning"
compile "nltk"
assertCaptured "[nltk_data] Downloading package city_database" "STD_ERR"
assertCapturedSuccess
}
testPsycopg2() {
compile "psycopg2"
assertCaptured "psycopg2"
assertCapturedSuccess
}
testCffi() {
compile "cffi"
assertCaptured "cffi"
assertCapturedSuccess
}
testPylibmc() {
compile "pylibmc"
assertCaptured "pylibmc"
assertCapturedSuccess
}
pushd $(dirname 0) >/dev/null
popd >/dev/null
source $(pwd)/test/utils
source $(pwd)/test/shunit2
+82
View File
@@ -0,0 +1,82 @@
#!/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"
assertCaptured "Uninstalling requests"
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"
assertCapturedSuccess
}
testStandardRequirements() {
compile "requirements-standard"
assertCaptured "requests"
assertCapturedSuccess
}
testPipenv() {
compile "pipenv"
assertCapturedSuccess
}
testPipenvLock() {
compile "pipenv-lock"
assertCapturedSuccess
}
testPipenvVersion() {
compile "pipenv-version"
assertCaptured $DEFAULT_PYTHON_VERSION
assertCapturedSuccess
}
testPipenvVersion2() {
compile "pipenv-version2"
assertCaptured $LATEST_27
assertCapturedSuccess
}
testPipenvFullVersion() {
compile "pipenv-full-version"
assertCaptured "3.6.3"
assertCapturedSuccess
}
testNoRequirements() {
compile "no-requirements"
assertCapturedError
}
pushd $(dirname 0) >/dev/null
popd >/dev/null
source $(pwd)/test/utils
source $(pwd)/test/shunit2
+145
View File
@@ -0,0 +1,145 @@
#!/usr/bin/env bash
# Default Python Versions
# shellcheck source=bin/default_pythons
source "bin/default_pythons"
testPythonDefault() {
updateVersion "pythonDefault" $DEFAULT_PYTHON_VERSION
compile "pythonDefault"
assertCaptured $DEFAULT_PYTHON_VERSION
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2() {
updateVersion "python2" $LATEST_27
echo $LATEST_27 > "runtime.txt"
compile "python2"
assertCaptured $LATEST_27
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2_warn() {
compile "python2_warn"
assertCaptured "python-2.7.15"
assertCaptured "security update!"
assertCapturedSuccess
}
testPython2_fail() {
compile "python2_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_4() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_4" $LATEST_34
compile "python3_4"
assertCaptured $LATEST_34
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
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() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_5" $LATEST_35
compile "python3_5"
assertCaptured $LATEST_35
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
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() {
updateVersion "python3_6" $LATEST_36
compile "python3_6"
assertCaptured $LATEST_36
assertNotCaptured "security update"
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() {
updateVersion "python3_7" $LATEST_37
compile "python3_7"
if [[ $STACK = "cedar-14" ]]; then
assertCapturedError
else
assertNotCaptured "security update"
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
}
pushd $(dirname 0) >/dev/null
popd >/dev/null
source $(pwd)/test/utils
source $(pwd)/test/shunit2
+52
View File
@@ -212,3 +212,55 @@ assertFileMD5()
assertEquals "${expected_md5_cmd_output}" "`${md5_cmd}`" assertEquals "${expected_md5_cmd_output}" "`${md5_cmd}`"
} }
# Test helpers
mktmpdir() {
dir=$(mktemp -t testXXXXX)
rm -rf $dir
mkdir $dir
echo $dir
}
detect() {
capture $(pwd)/bin/detect $(pwd)/test/fixtures/$1
}
compile_dir=""
default_process_types_cleanup() {
file="/tmp/default_process_types"
if [ -f "$file" ]; then
rm "$file"
fi
}
compile() {
default_process_types_cleanup
bp_dir=$(mktmpdir)
compile_dir=$(mktmpdir)
cp -a $(pwd)/* ${bp_dir}
cp -a ${bp_dir}/test/fixtures/$1/. ${compile_dir}
capture ${bp_dir}/bin/compile ${compile_dir} ${2:-$(mktmpdir)} $3
}
compileDir() {
default_process_types_cleanup
local bp_dir=$(mktmpdir)
local compile_dir=${1:-$(mktmpdir)}
local cache_dir=${2:-$(mktmpdir)}
local env_dir=$3
cp -a $(pwd)/* ${bp_dir}
capture ${bp_dir}/bin/compile ${compile_dir} ${cache_dir} ${env_dir}
}
release() {
bp_dir=$(mktmpdir)
cp -a $(pwd)/* ${bp_dir}
capture ${bp_dir}/bin/release ${bp_dir}/test/fixtures/$1
}
assertFile() {
assertEquals "$1" "$(cat ${compile_dir}/$2)"
}
-22373
View File
File diff suppressed because it is too large Load Diff