mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
338 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e32aaf9d00 | |||
| ec57979bf8 | |||
| 0057d19082 | |||
| 0419921227 | |||
| 7d743e7998 | |||
| 2942fc8e4a | |||
| 0e1ac6217b | |||
| 848c846a3d | |||
| 179f345f5b | |||
| 6fc11b8370 | |||
| f189df5415 | |||
| 8253ffa354 | |||
| 514c494891 | |||
| 9a9e972db0 | |||
| 1750242ccd | |||
| 50460beb95 | |||
| 69c17b343a | |||
| f31e9fa835 | |||
| 5788ff57cd | |||
| f0f3463658 | |||
| ffc7683c05 | |||
| 3a6f7f849b | |||
| 475af5a1f8 | |||
| d166ee88d7 | |||
| ba55465a2b | |||
| 93a620e6ed | |||
| a7a257e099 | |||
| 40e91a9755 | |||
| 7686370d81 | |||
| 2d6990425e | |||
| b5b640ab00 | |||
| dfe28cbe28 | |||
| 8fc94c0868 | |||
| 86fc9f156b | |||
| 2a4f0a66c3 | |||
| 87ba8b499a | |||
| f03b7ed048 | |||
| bf1b1dc3f8 | |||
| a421ea93e3 | |||
| 3c40bf8bea | |||
| f28465bec7 | |||
| fade163df8 | |||
| 13fad186ff | |||
| c12f395c9a | |||
| 43c54abf0e | |||
| 151df58e86 | |||
| 1c87fd3d6e | |||
| 50cdf10a36 | |||
| 0be5993e32 | |||
| 3f9a80ad24 | |||
| 14c15f4dd8 | |||
| 9bd5fa7c7f | |||
| 89885a4472 | |||
| 3c193bd475 | |||
| a7f62496b1 | |||
| f1b0f8c154 | |||
| f90dfbc12e | |||
| 9ca0c4eb84 | |||
| dc694d4712 | |||
| b4b94abea0 | |||
| 0c66cea063 | |||
| 48f6e20fc5 | |||
| 7ceb774c63 | |||
| f43caaadc3 | |||
| bb31a012fd | |||
| 9ab6a56cba | |||
| ab89e49235 | |||
| 5293169aa8 | |||
| 3698cb5715 | |||
| c126f6239d | |||
| e821501114 | |||
| 7f639739e3 | |||
| 4328847f1e | |||
| c79e6f02ad | |||
| 1d938c35f8 | |||
| 99a2a55f6a | |||
| 79dbd79b13 | |||
| 0b4a2d664b | |||
| 3726d3b473 | |||
| 9b72199cdf | |||
| 22e6239222 | |||
| 39e4e85747 | |||
| 05612fa1eb | |||
| fb1ca18e90 | |||
| 0207d8aff0 | |||
| 6bf3a75da2 | |||
| 011f1e7e60 | |||
| 0b804b186c | |||
| ec56074c18 | |||
| 34508bfc35 | |||
| af1ef93311 | |||
| 0fc7b6c186 | |||
| 33cd4a5fe1 | |||
| 7ff7fa4462 | |||
| 9a830367fe | |||
| 521ed3ff60 | |||
| 03c12e8081 | |||
| de18566b47 | |||
| a165486180 | |||
| d7327b8d13 | |||
| 47c6dbab32 | |||
| 939594ecf4 | |||
| 23adcc42c4 | |||
| cc2d1ad17f | |||
| 91a0be91e1 | |||
| 4a4a6a1df0 | |||
| b30838072f | |||
| 950572132c | |||
| fe5da9a0a6 | |||
| 4eed56e2e5 | |||
| 00d44d2e34 | |||
| 0c78978e90 | |||
| d0fd9ad58a | |||
| 24e0858902 | |||
| d54da94d47 | |||
| 1721fa3703 | |||
| 970b6c1e4b | |||
| 89145ef839 | |||
| ce6657d5fe | |||
| cacd163958 | |||
| cd4601a707 | |||
| 05e29c74bc | |||
| dbfdb5a356 | |||
| 8512fcb811 | |||
| 6b328504de | |||
| b4553d4bee | |||
| af860be62a | |||
| 2be890d2e8 | |||
| e936ff00c3 | |||
| 3096299184 | |||
| ffc7359b19 | |||
| 7a313c53a5 | |||
| 98df315cfa | |||
| 74bc1d4049 | |||
| df18c0485d | |||
| 629ab233bf | |||
| c4b4bfaa3c | |||
| fe6a81d513 | |||
| 7c82017a0e | |||
| 75ce3f537d | |||
| a51d5f2976 | |||
| 6a8aa1e2b0 | |||
| 35873ee517 | |||
| b2b12d0355 | |||
| 15ecb76950 | |||
| adba08788c | |||
| e3d6bc8436 | |||
| 6e4b43fa1d | |||
| 3fef7caf50 | |||
| 0c701de466 | |||
| c410fd36a6 | |||
| ff42f318a0 | |||
| 09b5fe4881 | |||
| 7a431ee717 | |||
| a80f2be020 | |||
| 15289a94f1 | |||
| a013e54769 | |||
| bf8f9419ec | |||
| 3346bbc324 | |||
| ebfe4946df | |||
| 0bfd1bd51f | |||
| b1b3ab1c92 | |||
| dfb8185a63 | |||
| 1c5e876e3d | |||
| 149c046f5f | |||
| fc4cbf272a | |||
| 61ead23f7f | |||
| f3738a0e70 | |||
| 1e92f31436 | |||
| c969fa0d36 | |||
| 1851bbf285 | |||
| a41fd78f72 | |||
| 56322381f0 | |||
| dc878449ee | |||
| 204a6215b2 | |||
| a2f3ff7a35 | |||
| c3328f57dd | |||
| 5df70ce26c | |||
| 44fe0fe3fd | |||
| b8d1035231 | |||
| 006ea77641 | |||
| a239fde78c | |||
| 783c2e2329 | |||
| 06694bba18 | |||
| 158a3e28a8 | |||
| 9031333ef4 | |||
| b6e2739fb5 | |||
| a8da6e4ed5 | |||
| 707ed848bb | |||
| 385296c270 | |||
| 12279e69d5 | |||
| b5fa65d96c | |||
| a724dfc62e | |||
| aecdeddc32 | |||
| f3af6aa4a2 | |||
| 6bc4d42774 | |||
| e1d0fcae0e | |||
| 8f1b24f64e | |||
| 97e3366409 | |||
| 4f8bb77b13 | |||
| a771b7bf94 | |||
| b52fac4d32 | |||
| e28c1012b7 | |||
| 05b7ceb82c | |||
| a379779d43 | |||
| de1696bb02 | |||
| 77b012dd6f | |||
| 3d65278d61 | |||
| 59544ee799 | |||
| 34a631021c | |||
| 6a4ab8646a | |||
| 7d8ea3d266 | |||
| 0161b80a2b | |||
| 7eac72199e | |||
| df779aaa9a | |||
| bbdbebbc87 | |||
| 32cf8a8681 | |||
| 1479ab375e | |||
| 8366d66f54 | |||
| b156f237a2 | |||
| 0ffbf60882 | |||
| c458743a2a | |||
| 0ff53eb59b | |||
| 96ffc147d4 | |||
| 4063e9d22e | |||
| 751413168b | |||
| 527ea604c8 | |||
| 302c2f0432 | |||
| 14c7e26f7a | |||
| 58e664a9e3 | |||
| e965516197 | |||
| 8775cb821c | |||
| 9dcabe24a5 | |||
| 38f9a41a54 | |||
| 3880b1affa | |||
| 53e33bdf91 | |||
| 5337dd592b | |||
| de8ae808d9 | |||
| 2a7e85be85 | |||
| 7654d13f8b | |||
| 9d3639685a | |||
| 76bb572a4d | |||
| 8db4a79392 | |||
| 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 | |||
| d3180d3245 | |||
| 4778b1cb9d | |||
| 50a3d2d13e | |||
| 8c36a3a263 | |||
| 882f54128b | |||
| 576def4cde | |||
| 1be32ff09a | |||
| 9c2bbd109f | |||
| e5d9ed259b | |||
| 285ca2b73d | |||
| 5e4667686a | |||
| f9621add42 | |||
| 567cf2c388 | |||
| c61e61c153 | |||
| 3835aca004 | |||
| 3733383ad6 | |||
| b53d211d01 | |||
| e5830fd50d | |||
| 2efe514b14 | |||
| d442562352 | |||
| ce14e1edf8 | |||
| 39d2cd6de8 | |||
| e42b725211 | |||
| d9456b6d90 | |||
| 61591594a2 | |||
| 13bca29e13 | |||
| 95779d6711 | |||
| 166b8be2c5 | |||
| 583c1ab160 | |||
| c7f5532854 | |||
| 0fe4f91395 | |||
| 221722fb27 | |||
| e82f1e4d1e |
@@ -0,0 +1,8 @@
|
||||
<!-- Hi and welcome to the Heroku Python buildpack repository!
|
||||
|
||||
If you meant to open a PR against a fork instead of upstream, please adjust the base branch:
|
||||
https://help.github.com/articles/changing-the-base-branch-of-a-pull-request/
|
||||
|
||||
Otherwise thank you in advance for your Pull Request - just remember to
|
||||
include as much information as possible to help the reviewers :-)
|
||||
-->
|
||||
@@ -0,0 +1,12 @@
|
||||
name: Check Changelog
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Check that CHANGELOG is touched
|
||||
run: |
|
||||
cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
|
||||
@@ -3,3 +3,10 @@ site
|
||||
.DS_Store
|
||||
|
||||
/.envrc
|
||||
repos/*
|
||||
|
||||
#Venv
|
||||
buildpack/*
|
||||
|
||||
builds/dockerenv.staging*
|
||||
builds/dockerenv.production
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: check-yaml
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
+36
-22
@@ -1,25 +1,39 @@
|
||||
language: bash
|
||||
language: ruby
|
||||
dist: trusty
|
||||
sudo: required
|
||||
|
||||
rvm:
|
||||
- 2.4.4
|
||||
before_script:
|
||||
- gem install bundler -v 1.16.2
|
||||
- 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" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-cedar-14 bash $TESTFOLDER
|
||||
- docker build --pull --tag travis-build-heroku-16 --file $(pwd)/builds/heroku-16.Dockerfile .
|
||||
- docker run --rm -e "STACK=heroku-16" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-heroku-16 bash $TESTFOLDER
|
||||
- docker build --pull --tag travis-build-heroku-18 --file $(pwd)/builds/heroku-18.Dockerfile .
|
||||
- docker run --rm -e "STACK=heroku-18" -e "USE_STAGING_BINARIES=$USE_STAGING_BINARIES" travis-build-heroku-18 bash $TESTFOLDER
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- stage: "Bash linting (shellcheck)"
|
||||
sudo: false
|
||||
before_install:
|
||||
- wget -c https://goo.gl/ZzKHFv -O - | tar -xvJ -C /tmp/
|
||||
- PATH="/tmp/shellcheck-latest:$PATH"
|
||||
script: make check
|
||||
|
||||
- stage: "Stack Tests"
|
||||
services: docker
|
||||
env: STACK=heroku-18
|
||||
script: ./tests.sh
|
||||
|
||||
- stage: "Stack Tests"
|
||||
services: docker
|
||||
env: STACK=heroku-16
|
||||
script: ./tests.sh
|
||||
|
||||
- stage: "Stack Tests"
|
||||
services: docker
|
||||
env: STACK=cedar-14
|
||||
script: ./tests.sh
|
||||
- stage: Bash linting (shellcheck)
|
||||
sudo: false
|
||||
script: make check
|
||||
- stage: Hatchet Integration
|
||||
if: branch = master
|
||||
name: Run Hatchet
|
||||
script: "bundle exec rspec"
|
||||
env:
|
||||
matrix:
|
||||
- TESTFOLDER=test/run-deps
|
||||
- TESTFOLDER=test/run-versions
|
||||
- TESTFOLDER=test/run-features
|
||||
global:
|
||||
- HATCHET_RETRIES=3
|
||||
- IS_RUNNING_ON_CI=true
|
||||
- HATCHET_APP_LIMIT=5
|
||||
- HATCHET_DEPLOY_STRATEGY=git
|
||||
- secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E=
|
||||
- secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As=
|
||||
|
||||
+114
-4
@@ -1,18 +1,128 @@
|
||||
# Python Buildpack Changelog
|
||||
|
||||
# 137
|
||||
# Master
|
||||
|
||||
- New pythons released:
|
||||
Python 3.8.1, 3.7.6, 3.6.10 (CPython)
|
||||
Beta Release: Pypy 2.7 and 3.6, version 7.2.0
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# 162 (2019-12-06)
|
||||
|
||||
- Bug fix: fragile sqlite3 install
|
||||
|
||||
# 161 (2019-12-2)
|
||||
|
||||
- Bug fix: Sqlite3 version bump
|
||||
|
||||
# 160 (2019-10-23)
|
||||
|
||||
- Bugfix: Pipenv no longer installs twice in CI
|
||||
|
||||
# 159 (2019-10-22)
|
||||
|
||||
- Python 2.7.17 now available on Heroku 18 and 16.
|
||||
|
||||
# 158 (2019-10-21)
|
||||
|
||||
- Python 3.7.5 and 3.8.0 now available on Heroku 18 and 16.
|
||||
- Add support for Python 3.8 branch
|
||||
- Sqlite3 Update:
|
||||
- Test Improvements
|
||||
- Add support for staging binary testing
|
||||
|
||||
# 157 (2019-09-18)
|
||||
|
||||
- Typo fixes
|
||||
|
||||
# 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)
|
||||
|
||||
Fix python 3.5.7 formula actually building 3.7.2
|
||||
|
||||
# 153 (2019-06-21)
|
||||
|
||||
Hotfix for broken heroku-16 deploys
|
||||
|
||||
# 152 (2019-04-04)
|
||||
|
||||
Python 3.7.3 now available.
|
||||
|
||||
# 151 (2019-03-21)
|
||||
|
||||
Python 3.5.7 and 3.4.10 now available on all Heroku stacks.
|
||||
|
||||
# 150 (2019-03-13)
|
||||
|
||||
Python 2.7.16 now available on all Heroku stacks.
|
||||
|
||||
# 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
|
||||
|
||||
# 139, 140, 141
|
||||
|
||||
No user-facing changes, documenting for version clarity
|
||||
|
||||
# 138 (2018-08-01)
|
||||
|
||||
Use stack image SQLite3 instead of vendoring
|
||||
|
||||
# 137 (2018-07-17)
|
||||
|
||||
Prevent 3.7.0 from appearing as unsupported in buildpack messaging.
|
||||
|
||||
# 136
|
||||
# 136 (2018-06-28)
|
||||
|
||||
Upgrade to 3.6.6 and support 3.7.0 on all runtimes.
|
||||
|
||||
# 135
|
||||
# 135 (2018-05-29)
|
||||
|
||||
Upgrade Pipenv to v2018.5.18.
|
||||
|
||||
# 134
|
||||
# 134 (2018-05-02)
|
||||
|
||||
Default to 3.6.5, bugfixes.
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "rspec"
|
||||
gem "heroku_hatchet"
|
||||
gem "rspec-retry"
|
||||
gem "rake"
|
||||
@@ -0,0 +1,71 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (5.2.1)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
tzinfo (~> 1.1)
|
||||
concurrent-ruby (1.1.3)
|
||||
diff-lcs (1.3)
|
||||
erubis (2.7.0)
|
||||
excon (0.62.0)
|
||||
heroics (0.0.25)
|
||||
erubis (~> 2.0)
|
||||
excon
|
||||
moneta
|
||||
multi_json (>= 1.9.2)
|
||||
heroku_hatchet (4.0.6)
|
||||
excon (~> 0)
|
||||
minitest-retry (~> 0.1.9)
|
||||
platform-api (~> 2)
|
||||
repl_runner (~> 0.0.3)
|
||||
rrrretry (~> 1)
|
||||
thor (~> 0)
|
||||
threaded (~> 0)
|
||||
i18n (1.1.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
minitest (5.11.3)
|
||||
minitest-retry (0.1.9)
|
||||
minitest (>= 5.0)
|
||||
moneta (1.0.0)
|
||||
multi_json (1.13.1)
|
||||
platform-api (2.2.0)
|
||||
heroics (~> 0.0.25)
|
||||
moneta (~> 1.0.0)
|
||||
rake (12.3.1)
|
||||
repl_runner (0.0.3)
|
||||
activesupport
|
||||
rrrretry (1.0.0)
|
||||
rspec (3.8.0)
|
||||
rspec-core (~> 3.8.0)
|
||||
rspec-expectations (~> 3.8.0)
|
||||
rspec-mocks (~> 3.8.0)
|
||||
rspec-core (3.8.0)
|
||||
rspec-support (~> 3.8.0)
|
||||
rspec-expectations (3.8.1)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.8.0)
|
||||
rspec-mocks (3.8.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.8.0)
|
||||
rspec-retry (0.6.1)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.8.0)
|
||||
thor (0.20.3)
|
||||
thread_safe (0.3.6)
|
||||
threaded (0.0.4)
|
||||
tzinfo (1.2.5)
|
||||
thread_safe (~> 0.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
heroku_hatchet
|
||||
rake
|
||||
rspec
|
||||
rspec-retry
|
||||
|
||||
BUNDLED WITH
|
||||
1.16.3
|
||||
@@ -1,32 +1,32 @@
|
||||
# These targets are not files
|
||||
.PHONY: tests
|
||||
|
||||
test: test-heroku-16
|
||||
test: test-heroku-18 test-heroku-16 test-cedar-14
|
||||
|
||||
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/hooks/*
|
||||
|
||||
test-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 ""
|
||||
|
||||
test-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 ""
|
||||
|
||||
test-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 ""
|
||||
|
||||
buildenv-heroku-16:
|
||||
@echo "Creating build environment (heroku-16)..."
|
||||
@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 "Usage..."
|
||||
@echo
|
||||
@@ -36,6 +36,19 @@ buildenv-heroku-16:
|
||||
@echo
|
||||
@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:
|
||||
git clone https://github.com/kennethreitz/pip-pop.git
|
||||
mv pip-pop/bin/* vendor/pip-pop/
|
||||
|
||||
@@ -4,36 +4,54 @@
|
||||
|
||||
[](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
|
||||
----------------
|
||||
```
|
||||
$ 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.4
|
||||
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
|
||||
Pipfile Pipfile.lock Procfile web.py
|
||||
A `requirements.txt` must be present at the root of your application's repository to deploy.
|
||||
|
||||
$ 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
|
||||
…
|
||||
-----> 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)
|
||||
Current default Python Runtime: Python 3.6.9
|
||||
|
||||
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
|
||||
|
||||
@@ -41,23 +59,30 @@ You can also specify the latest production release of this buildpack for upcomin
|
||||
Specify a Python Runtime
|
||||
------------------------
|
||||
|
||||
Specific versions of the Python runtime can be specified in your `Pipfile`:
|
||||
Supported runtime options include:
|
||||
|
||||
[requires]
|
||||
python_version = "2.7"
|
||||
- `python-3.7.4`
|
||||
- `python-3.6.9`
|
||||
- `python-2.7.17`
|
||||
|
||||
Or, more specifically:
|
||||
## Tests
|
||||
|
||||
[requires]
|
||||
python_full_version = "2.7.15"
|
||||
The buildpack tests use [Docker](https://www.docker.com/) to simulate
|
||||
Heroku's [stack images.](https://devcenter.heroku.com/articles/stack)
|
||||
|
||||
Or, with a `runtime.txt` file:
|
||||
To run the test suite:
|
||||
|
||||
$ cat runtime.txt
|
||||
python-2.7.15
|
||||
```
|
||||
make test
|
||||
```
|
||||
|
||||
Runtime options include:
|
||||
Or to test in a particular stack:
|
||||
|
||||
- `python-3.7.0`
|
||||
- `python-3.6.6`
|
||||
- `python-2.7.15`
|
||||
```
|
||||
make test-heroku-18
|
||||
make test-heroku-16
|
||||
```
|
||||
|
||||
The tests are run via the vendored
|
||||
[shunit2](https://github.com/kward/shunit2)
|
||||
test framework.
|
||||
|
||||
+29
-9
@@ -42,24 +42,32 @@ export BUILD_DIR CACHE_DIR ENV_DIR
|
||||
VENDOR_URL="https://lang-python.s3.amazonaws.com/$STACK"
|
||||
if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
|
||||
VENDOR_URL="$BUILDPACK_VENDOR_URL"
|
||||
elif [[ -n ${USE_STAGING_BINARIES} ]]; then
|
||||
VENDOR_URL="$USE_STAGING_BINARIES/$STACK"
|
||||
fi
|
||||
export VENDOR_URL
|
||||
|
||||
# Which versions of Python are we using?
|
||||
# These variables are used to specify which versions of Python to install by default,
|
||||
# as well as prompt the user to upgrade if they are using an un–supported version.
|
||||
# Note: When 3.7 lands, I recommend switching to LATEST_36 and LATEST_37.
|
||||
DEFAULT_PYTHON_VERSION="python-3.6.6"
|
||||
LATEST_36="python-3.6.6"
|
||||
LATEST_37="python-3.7.0"
|
||||
LATEST_2="python-2.7.15"
|
||||
# Default Python Versions
|
||||
# shellcheck source=bin/default_pythons
|
||||
source "$BIN_DIR/default_pythons"
|
||||
|
||||
# Supported Python Branches
|
||||
PY38="python-3.8"
|
||||
PY37="python-3.7"
|
||||
PY36="python-3.6"
|
||||
PY35="python-3.5"
|
||||
PY34="python-3.4"
|
||||
PY27="python-2.7"
|
||||
PYPY27="pypy2.7"
|
||||
PYPY36="pypy3.6"
|
||||
|
||||
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
|
||||
DEFAULT_PYTHON_STACK="cedar-14"
|
||||
# If pip doesn't match this version (the version we install), run the installer.
|
||||
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:
|
||||
# This section creates a temporary file in which to stick the output of `pip install`.
|
||||
@@ -160,6 +168,8 @@ cp -R "$CACHE_DIR/.heroku/python" .heroku/ &> /dev/null || true
|
||||
cp -R "$CACHE_DIR/.heroku/python-stack" .heroku/ &> /dev/null || true
|
||||
# A plain text file which contains the current python version being used (used for cache busting).
|
||||
cp -R "$CACHE_DIR/.heroku/python-version" .heroku/ &> /dev/null || true
|
||||
# A plain text file which contains the current sqlite3 version being used (used for cache busting).
|
||||
cp -R "$CACHE_DIR/.heroku/python-sqlite3-version" .heroku/ &> /dev/null || true
|
||||
# Any pre-compiled binaries, provided by the buildpack.
|
||||
cp -R "$CACHE_DIR/.heroku/vendor" .heroku/ &> /dev/null || true
|
||||
# "editable" installations of code repositories, via pip or pipenv.
|
||||
@@ -274,6 +284,16 @@ sub_env "$BIN_DIR/steps/geo-libs"
|
||||
# shellcheck source=bin/steps/gdal
|
||||
source "$BIN_DIR/steps/gdal"
|
||||
|
||||
# SQLite3 support.
|
||||
# This sets up and installs sqlite3 dev headers and the sqlite3 binary but not the
|
||||
# libsqlite3-0 library since that exists on the stack image.
|
||||
# Note: This only applies to Python 2.7.15+ and Python 3.6.6+
|
||||
(( start=$(nowms) ))
|
||||
# shellcheck source=bin/steps/sqlite3
|
||||
source "$BIN_DIR/steps/sqlite3"
|
||||
buildpack_sqlite3_install
|
||||
mtime "sqlite3.install.time" "${start}"
|
||||
|
||||
# pip install
|
||||
# -----------
|
||||
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
DEFAULT_PYTHON_VERSION="python-3.6.10"
|
||||
LATEST_38="python-3.8.1"
|
||||
LATEST_37="python-3.7.6"
|
||||
LATEST_36="python-3.6.10"
|
||||
LATEST_35="python-3.5.7"
|
||||
LATEST_34="python-3.4.10"
|
||||
LATEST_27="python-2.7.17"
|
||||
PYPY_36="pypy3.6-7.2.0"
|
||||
PYPY_27="pypy2.7-7.2.0"
|
||||
|
||||
export DEFAULT_PYTHON_VERSION \
|
||||
LATEST_38 \
|
||||
LATEST_37 \
|
||||
LATEST_36 \
|
||||
LATEST_35 \
|
||||
LATEST_34 \
|
||||
LATEST_27 \
|
||||
PYPY_36 \
|
||||
PYPY_27
|
||||
+1
-1
@@ -26,9 +26,9 @@ if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
mcount "steps.vendor.gdal"
|
||||
fi
|
||||
|
||||
GDAL=$(pwd)/vendor
|
||||
export GDAL
|
||||
fi
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ source "$BIN_DIR/utils"
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||
mcount "buildvar.BUILD_WITH_GEO_LIBRARIES"
|
||||
|
||||
if [ ! -f ".heroku/vendor/bin/proj" ]; then
|
||||
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_PROJ" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
mcount "steps.vendor.geo_libs"
|
||||
# Copy libjasper from build image to slug.
|
||||
if [[ "$STACK" == "heroku-16" ]]; then
|
||||
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
|
||||
mcount "steps.vendor.libjasper"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
+1
-1
@@ -4,6 +4,6 @@
|
||||
if [[ -f "requirements.txt" ]]; then
|
||||
if (grep -Fiq "hg+" requirements.txt) then
|
||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||
mcount "steps.mercurial"
|
||||
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
|
||||
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
|
||||
|
||||
mcount "buildvar.NLTK_PACKAGES_DEFINITION"
|
||||
mcount "steps.nltk"
|
||||
else
|
||||
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
||||
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.
|
||||
puts-step "Installing requirements with pip"
|
||||
|
||||
# Set PIP_EXTRA_INDEX_URL
|
||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||
# Set Pip env vars
|
||||
# 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")"
|
||||
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
|
||||
|
||||
set +e
|
||||
@@ -24,7 +38,9 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
mcount "failure.none-version"
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -f "$BUILD_DIR/.heroku/python/bin/pip" ]; then
|
||||
exit 1
|
||||
fi
|
||||
/app/.heroku/python/bin/pip install -r "$BUILD_DIR/requirements.txt" --exists-action=w --src=/app/.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee "$WARNINGS_LOG" | cleanup | indent
|
||||
PIP_STATUS="${PIPESTATUS[0]}"
|
||||
set -e
|
||||
|
||||
@@ -13,7 +13,7 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||
|
||||
|
||||
if ! pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt; then
|
||||
mount "failure.bad-requirements"
|
||||
mcount "failure.bad-requirements"
|
||||
fi
|
||||
|
||||
rm -fr requirements-declared.txt
|
||||
|
||||
+26
-12
@@ -20,14 +20,13 @@ if [[ -f Pipfile.lock ]]; then
|
||||
export SKIP_PIPENV_INSTALL=1
|
||||
export SKIP_PIP_INSTALL=1
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
||||
# Pipenv support (Generate requriements.txt with pipenv).
|
||||
# Pipenv support (Generate requirements.txt with pipenv).
|
||||
if [[ -f Pipfile ]]; then
|
||||
# Measure that we're using Pipenv.
|
||||
mcount "tool.pipenv"
|
||||
@@ -35,21 +34,42 @@ if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
||||
# Skip pip install, later.
|
||||
export SKIP_PIP_INSTALL=1
|
||||
|
||||
# Set PIP_EXTRA_INDEX_URL
|
||||
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||
# Set Pip env vars
|
||||
# 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")"
|
||||
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
|
||||
|
||||
export PIPENV_VERSION="2018.5.18"
|
||||
|
||||
# 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 test dependencies, for CI.
|
||||
if [ "$INSTALL_TEST" ]; then
|
||||
puts-step "Installing test dependencies…"
|
||||
/app/.heroku/python/bin/pipenv install --dev --system --deploy 2>&1 | cleanup | indent
|
||||
|
||||
# Install the dependencies.
|
||||
if [[ ! -f Pipfile.lock ]]; then
|
||||
elif [[ ! -f Pipfile.lock ]]; then
|
||||
puts-step "Installing dependencies with Pipenv $PIPENV_VERSION…"
|
||||
/app/.heroku/python/bin/pipenv install --system --skip-lock 2>&1 | indent
|
||||
|
||||
else
|
||||
pipenv-to-pip Pipfile.lock > requirements.txt
|
||||
"$BIN_DIR/steps/pip-uninstall"
|
||||
@@ -59,12 +79,6 @@ if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
||||
puts-step "Installing dependencies with Pipenv $PIPENV_VERSION…"
|
||||
/app/.heroku/python/bin/pipenv install --system --deploy 2>&1 | indent
|
||||
fi
|
||||
|
||||
# Install the test dependencies, for CI.
|
||||
if [ "$INSTALL_TEST" ]; then
|
||||
puts-step "Installing test dependencies…"
|
||||
/app/.heroku/python/bin/pipenv install --dev --system --deploy 2>&1 | cleanup | indent
|
||||
fi
|
||||
fi
|
||||
else
|
||||
export SKIP_PIP_INSTALL=1
|
||||
|
||||
@@ -19,7 +19,7 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
|
||||
if [[ "$PYTHON" == "null" ]]; then
|
||||
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
|
||||
if [ "$PYTHON" = 2.7 ]; then
|
||||
echo "$LATEST_2" > "$BUILD_DIR/runtime.txt"
|
||||
echo "$LATEST_27" > "$BUILD_DIR/runtime.txt"
|
||||
fi
|
||||
if [ "$PYTHON" = 3.6 ]; then
|
||||
echo "$LATEST_36" > "$BUILD_DIR/runtime.txt"
|
||||
@@ -33,4 +33,3 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract libmemcached into target vendor directory.
|
||||
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
mcount "steps.vendor.pylibmc"
|
||||
fi
|
||||
|
||||
LIBMEMCACHED=$(pwd)/vendor
|
||||
|
||||
+90
-18
@@ -7,29 +7,91 @@ PYTHON_VERSION=$(cat runtime.txt)
|
||||
# The location of the pre-compiled python binary.
|
||||
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"
|
||||
|
||||
if [[ $PYTHON_VERSION =~ ^python-2 ]]; then
|
||||
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)."
|
||||
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_2)."
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
else
|
||||
if [[ $PYTHON_VERSION =~ ^python-3.7 ]] && [[ "$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"
|
||||
else
|
||||
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)."
|
||||
SECURITY_UPDATE="Python has released a security update! Please consider upgrading to"
|
||||
|
||||
ONLY_SUPPORTED_2_VERSION="Only the latest version of Python 2 is supported on the platform. Please consider upgrading to"
|
||||
|
||||
PYTHON_2_EOL_UPDATE="Python 2 has reached it's community EOL. Upgrade your Python runtime to maintain a secure application as soon as possible."
|
||||
|
||||
# check if runtime exists
|
||||
if curl --output /dev/null --silent --head --fail "$VENDORED_PYTHON"; then
|
||||
if [[ "$PYTHON_VERSION" == $PY38* ]]; then
|
||||
# do things to alert the user of security release available
|
||||
if [ "$PYTHON_VERSION" != "$LATEST_38" ]; then
|
||||
puts-warn "$SECURITY_UPDATE" "$LATEST_38"
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
fi
|
||||
if [[ "$PYTHON_VERSION" == $PY37* ]]; then
|
||||
# do things to alert the user of security release available
|
||||
if [ "$PYTHON_VERSION" != "$LATEST_37" ]; then
|
||||
puts-warn "$SECURITY_UPDATE" "$LATEST_37"
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
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 [[ "$(date "+%Y")" -gt "2019" ]]; then
|
||||
puts-warn "$PYTHON_2_EOL_UPDATE"
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-2-7-eol-faq"
|
||||
fi
|
||||
if [ "$PYTHON_VERSION" != "$LATEST_27" ]; then
|
||||
puts-warn "$ONLY_SUPPORTED_2_VERSION" "$LATEST_27"
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
fi
|
||||
if [[ "$PYTHON_VERSION" == $PYPY27* ]]; then
|
||||
# security update note
|
||||
if [ "$PYTHON_VERSION" != "$PYPY_27" ]; then
|
||||
puts-warn "Could not find that Pypy version. Did you mean" "${PYPY_27}?"
|
||||
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||
fi
|
||||
fi
|
||||
if [[ "$PYTHON_VERSION" == $PYPY36* ]]; then
|
||||
# security update note
|
||||
if [ "$PYTHON_VERSION" != "$PYPY_36" ]; then
|
||||
puts-warn "Could not find that Pypy version. Did you mean" "${PYPY_36}?"
|
||||
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
|
||||
|
||||
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
||||
puts-step "Stack has changed from $CACHED_PYTHON_STACK to $STACK, clearing cache"
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor .heroku/python .heroku/python-sqlite3-version
|
||||
fi
|
||||
|
||||
# need to clear the cache for first time installing SQLite3,
|
||||
# since the version is changing and could lead to runtime errors
|
||||
# with compiled extensions.
|
||||
if [ -d .heroku/python ] && [ ! -f .heroku/python-sqlite3-version ] && python_sqlite3_check "$PYTHON_VERSION"; then
|
||||
puts-step "Need to update SQLite3, clearing cache"
|
||||
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor
|
||||
fi
|
||||
|
||||
if [ -f .heroku/python-version ]; then
|
||||
@@ -41,6 +103,7 @@ if [ -f .heroku/python-version ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ ! "$SKIP_INSTALL" ]; then
|
||||
puts-step "Installing $PYTHON_VERSION"
|
||||
|
||||
@@ -63,6 +126,16 @@ if [ ! "$SKIP_INSTALL" ]; then
|
||||
hash -r
|
||||
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 [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
|
||||
|
||||
@@ -72,9 +145,8 @@ 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/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
|
||||
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
Executable
+78
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# shellcheck source=bin/utils
|
||||
source "$BIN_DIR/utils"
|
||||
|
||||
sqlite3_install() {
|
||||
HEROKU_PYTHON_DIR="$1"
|
||||
HEADERS_ONLY="$3"
|
||||
|
||||
mkdir -p "$HEROKU_PYTHON_DIR"
|
||||
|
||||
APT_CACHE_DIR="$HEROKU_PYTHON_DIR/apt/cache"
|
||||
APT_STATE_DIR="$HEROKU_PYTHON_DIR/apt/state"
|
||||
|
||||
mkdir -p "$APT_CACHE_DIR/archives/partial"
|
||||
mkdir -p "$APT_STATE_DIR/lists/partial"
|
||||
|
||||
APT_OPTIONS="-o debug::nolocking=true"
|
||||
APT_OPTIONS="$APT_OPTIONS -o dir::cache=$APT_CACHE_DIR"
|
||||
APT_OPTIONS="$APT_OPTIONS -o dir::state=$APT_STATE_DIR"
|
||||
APT_OPTIONS="$APT_OPTIONS -o dir::etc::sourcelist=/etc/apt/sources.list"
|
||||
|
||||
apt-get $APT_OPTIONS update > /dev/null 2>&1
|
||||
if [ -z "$HEADERS_ONLY" ]; then
|
||||
apt-get $APT_OPTIONS -y -d --reinstall install libsqlite3-dev sqlite3 > /dev/null 2>&1
|
||||
else
|
||||
apt-get $APT_OPTIONS -y -d --reinstall install libsqlite3-dev
|
||||
fi
|
||||
|
||||
find "$APT_CACHE_DIR/archives/" -name "*.deb" -exec dpkg -x {} "$HEROKU_PYTHON_DIR/sqlite3/" \;
|
||||
|
||||
mkdir -p "$HEROKU_PYTHON_DIR/include"
|
||||
mkdir -p "$HEROKU_PYTHON_DIR/lib"
|
||||
|
||||
# remove old sqlite3 libraries/binaries
|
||||
find "$HEROKU_PYTHON_DIR/include/" -name "sqlite3*.h" -exec rm -f {} \;
|
||||
find "$HEROKU_PYTHON_DIR/lib/" -name "libsqlite3.*" -exec rm -f {} \;
|
||||
rm -f "$HEROKU_PYTHON_DIR/lib/pkgconfig/sqlite3.pc"
|
||||
rm -f "$HEROKU_PYTHON_DIR/bin/sqlite3"
|
||||
|
||||
# copy over sqlite3 headers & bins and setup linking against the stack image library
|
||||
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/include/"* "$HEROKU_PYTHON_DIR/include/"
|
||||
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu"/libsqlite3.*a "$HEROKU_PYTHON_DIR/lib/"
|
||||
mkdir -p "$HEROKU_PYTHON_DIR/lib/pkgconfig"
|
||||
# set the right prefix/lib directories
|
||||
sed -e 's/prefix=\/usr/prefix=\/app\/.heroku\/python/' -e 's/\/x86_64-linux-gnu//' "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu/pkgconfig/sqlite3.pc" > "$HEROKU_PYTHON_DIR/lib/pkgconfig/sqlite3.pc"
|
||||
# need to point the libsqlite3.so to the stack image library for /usr/bin/ld -lsqlite3
|
||||
SQLITE3_LIBFILE="/usr/lib/x86_64-linux-gnu/$(readlink -n "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu/libsqlite3.so")"
|
||||
ln -s "$SQLITE3_LIBFILE" "$HEROKU_PYTHON_DIR/lib/libsqlite3.so"
|
||||
if [ -z "$HEADERS_ONLY" ]; then
|
||||
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/bin"/* "$HEROKU_PYTHON_DIR/bin/"
|
||||
fi
|
||||
|
||||
# cleanup
|
||||
rm -rf "$HEROKU_PYTHON_DIR/sqlite3/"
|
||||
rm -rf "$HEROKU_PYTHON_DIR/apt/"
|
||||
}
|
||||
|
||||
buildpack_sqlite3_install() {
|
||||
HEROKU_PYTHON_DIR="$BUILD_DIR/.heroku/python"
|
||||
|
||||
SQLITE3_VERSION_FILE="$BUILD_DIR/.heroku/python-sqlite3-version"
|
||||
if [ -f "$SQLITE3_VERSION_FILE" ]; then
|
||||
INSTALLED_SQLITE3_VERSION=$(cat "$SQLITE3_VERSION_FILE")
|
||||
fi
|
||||
|
||||
puts-step "Installing SQLite3"
|
||||
|
||||
if sqlite3_install "$BUILD_DIR/.heroku/python" ; then
|
||||
echo "Sqlite3 successfully installed."
|
||||
mcount "success.python.sqlite3"
|
||||
else
|
||||
echo "Sqlite3 failed to install."
|
||||
mcount "failure.python.sqlite3"
|
||||
fi
|
||||
|
||||
mkdir -p "$CACHE_DIR/.heroku/"
|
||||
}
|
||||
@@ -58,3 +58,40 @@ measure-size() {
|
||||
echo "$(du -s .heroku/python 2>/dev/null || echo 0) | awk '{print $1}')"
|
||||
}
|
||||
|
||||
# Python version operator >
|
||||
version_gt() {
|
||||
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1";
|
||||
}
|
||||
|
||||
# Python verison operator >=
|
||||
version_gte() {
|
||||
if [ "$1" == "$2" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
version_gt "$1" "$2"
|
||||
}
|
||||
|
||||
# Check if Python 2
|
||||
python2_check() {
|
||||
VERSION="$1"
|
||||
|
||||
version_gte "$VERSION" "python-2.7.0" && version_gt "python-3.0.0" "$VERSION"
|
||||
}
|
||||
|
||||
# Check if Python 3
|
||||
python3_check() {
|
||||
VERSION="$1"
|
||||
|
||||
version_gte "$VERSION" "python-3.0.0" && version_gt "python-4.0.0" "$VERSION"
|
||||
}
|
||||
|
||||
# Check if Python version needs to install SQLite3
|
||||
python_sqlite3_check() {
|
||||
VERSION="$1"
|
||||
MIN_PYTHON_3="python-3.5.6"
|
||||
MIN_PYTHON_2="python-2.7.15"
|
||||
|
||||
( python2_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_2" ) \
|
||||
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" )
|
||||
}
|
||||
|
||||
+42
-26
@@ -1,41 +1,57 @@
|
||||
# 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
|
||||
$ heroku config:set WORKSPACE_DIR=builds
|
||||
$ heroku config:set AWS_ACCESS_KEY_ID=<your_aws_key>
|
||||
$ heroku config:set AWS_SECRET_ACCESS_KEY=<your_aws_secret>
|
||||
$ heroku config:set S3_BUCKET=<your_s3_bucket_name>
|
||||
$ docker build --pull --tag heroku-python-build-cedar-14 --file $(pwd)/builds/cedar-14.Dockerfile .
|
||||
$ docker build --pull --tag heroku-python-build-heroku-16 --file $(pwd)/builds/heroku-16.Dockerfile .
|
||||
$ docker build --pull --tag heroku-python-build-heroku-18 --file $(pwd)/builds/heroku-18.Dockerfile .
|
||||
|
||||
## 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
|
||||
Running `bash` attached to terminal... up, run.6880
|
||||
~ $ bob build runtimes/python-2.7.6
|
||||
docker run --rm -ti heroku-python-build-cedar-14 bash
|
||||
docker run --rm -ti heroku-python-build-heroku-16 bash
|
||||
docker run --rm -ti heroku-python-build-heroku-18 bash
|
||||
|
||||
Fetching dependencies... found 2:
|
||||
- libraries/sqlite
|
||||
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`:
|
||||
|
||||
Building formula runtimes/python-2.7.6:
|
||||
=== Building Python 2.7.6
|
||||
Fetching Python v2.7.6 source...
|
||||
Compiling...
|
||||
docker run --rm -ti heroku-python-build-heroku-18 bob build runtimes/python-2.7.15
|
||||
|
||||
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.
|
||||
2. From the root of the buildpack repository, run: `make buildenv-heroku-16`
|
||||
3. Follow the instructions displayed!
|
||||
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.
|
||||
|
||||
### 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
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
FROM heroku/cedar:14
|
||||
|
||||
WORKDIR /app
|
||||
ENV WORKSPACE_DIR="/app/builds" \
|
||||
S3_BUCKET="lang-python" \
|
||||
S3_PREFIX="cedar-14/" \
|
||||
DEBIAN_FRONTEND=noninteractive \
|
||||
STACK="cedar-14"
|
||||
|
||||
RUN apt-get update && apt-get install -y python-pip libsqlite3-dev realpath && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY requirements.txt /app/
|
||||
RUN pip install -r /app/requirements.txt
|
||||
|
||||
COPY . /app
|
||||
@@ -0,0 +1,5 @@
|
||||
AWS_ACCESS_KEY_ID
|
||||
AWS_SECRET_ACCESS_KEY
|
||||
S3_BUCKET
|
||||
S3_PREFIX
|
||||
S3_REGION
|
||||
@@ -3,9 +3,11 @@ FROM heroku/heroku:16-build
|
||||
WORKDIR /app
|
||||
ENV WORKSPACE_DIR="/app/builds" \
|
||||
S3_BUCKET="lang-python" \
|
||||
S3_PREFIX="heroku-16/"
|
||||
S3_PREFIX="heroku-16/" \
|
||||
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 libsqlite3-dev && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY requirements.txt /app/
|
||||
RUN pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt
|
||||
@@ -0,0 +1,15 @@
|
||||
FROM heroku/heroku:18-build.v16
|
||||
|
||||
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 libsqlite3-dev && 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
|
||||
Executable
+22
@@ -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"
|
||||
@@ -2,13 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/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
|
||||
source $(dirname $0)/pypy
|
||||
|
||||
@@ -2,13 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/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
|
||||
source $(dirname $0)/pypy
|
||||
|
||||
@@ -2,13 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 and heroku-16 stacks, not cedar.
|
||||
|
||||
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
|
||||
source $(dirname $0)/pypy
|
||||
|
||||
@@ -2,13 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/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
|
||||
source $(dirname $0)/pypy
|
||||
|
||||
@@ -2,11 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
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
|
||||
source $(dirname $0)/pypy
|
||||
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/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}-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…"
|
||||
echo "${dep_url}"
|
||||
|
||||
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"
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/pypy2.7
|
||||
Executable
+22
@@ -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"
|
||||
@@ -2,13 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/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
|
||||
source $(dirname $0)/pypy3
|
||||
|
||||
@@ -2,13 +2,7 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy…"
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/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
|
||||
# version pypy3-5.5.0 is really called pypy3.3-v5.5.0-alpha
|
||||
dep_version_prefix=".3"
|
||||
dep_version_suffix="-alpha"
|
||||
source $(dirname $0)/pypy3
|
||||
|
||||
@@ -2,11 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
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
|
||||
source $(dirname $0)/pypy3
|
||||
|
||||
@@ -2,11 +2,4 @@
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
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
|
||||
source $(dirname $0)/pypy3
|
||||
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/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…"
|
||||
echo "${dep_url}"
|
||||
|
||||
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"
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/pypy3.6
|
||||
@@ -1,15 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.10/Python-2.7.10.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.10 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
source $(dirname $0)/python2
|
||||
|
||||
@@ -1,15 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.11 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
source $(dirname $0)/python2
|
||||
|
||||
@@ -1,15 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.12 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
source $(dirname $0)/python2
|
||||
|
||||
@@ -1,19 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.13/Python-2.7.13.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.13 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 '{}' +
|
||||
source $(dirname $0)/python2
|
||||
|
||||
@@ -1,19 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.14/Python-2.7.14.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.14 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 '{}' +
|
||||
source $(dirname $0)/python2
|
||||
|
||||
@@ -1,19 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.15/Python-2.7.15.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.15 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 '{}' +
|
||||
source $(dirname $0)/python2
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python2
|
||||
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.17/Python-2.7.17.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.17 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 '{}' +
|
||||
@@ -1,15 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.9/Python-2.7.9.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.9 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
source $(dirname $0)/python2
|
||||
|
||||
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
|
||||
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
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
@@ -1,18 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.2/Python-3.5.2.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.2 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,18 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.3/Python-3.5.3.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.3 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
source $(dirname $0)/python3
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
@@ -1,18 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.0/Python-3.6.0.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.0 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,18 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.1/Python-3.6.1.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.1 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
source $(dirname $0)/python3
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.2/Python-3.6.2.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.3/Python-3.6.3.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.3 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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.4/Python-3.6.4.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.4 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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.5/Python-3.6.5.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.5 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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.6/Python-3.6.6.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.6.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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
@@ -1,21 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python…"
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.7.0/Python-3.7.0.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.7.0 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 '{}' +
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
source $(dirname $0)/python3
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
source $(dirname $0)/python3
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/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
|
||||
|
||||
echo "Building ${python_version}..."
|
||||
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 '{}' +
|
||||
|
||||
# Create links to SQLITE headers so Python can call them at runtime
|
||||
mkdir -p ${OUT_PREFIX}/include ${OUT_PREFIX}/lib/x86_64-linux-gnu
|
||||
cp /usr/include/sqlite3*.h ${OUT_PREFIX}/include
|
||||
ln -fs $(realpath /usr/lib/x86_64-linux-gnu/libsqlite3.so) ${OUT_PREFIX}/lib/x86_64-linux-gnu/libsqlite3.so
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
#!/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
|
||||
|
||||
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
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get install software-properties-common
|
||||
curl --fail --retry 3 --retry-delay 1 --connect-timeout 3 --max-time 30 https://cli-assets.heroku.com/install-ubuntu.sh | sh
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"python": [
|
||||
"heroku/python-getting-started"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
---
|
||||
- - "./repos/python/python-getting-started"
|
||||
- f56b90499ec11e1c9576da2f8c7331300e189db3
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
docopt==0.6.2
|
||||
bob-builder==0.0.13
|
||||
bob-builder
|
||||
boto==2.48.0
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
require_relative '../spec_helper'
|
||||
|
||||
describe "Python!!!!!!!!!!!" do
|
||||
it "🐍" do
|
||||
Hatchet::Runner.new('python-getting-started', stack: DEFAULT_STACK).deploy do |app|
|
||||
expect(app.output).to match(/Installing pip/)
|
||||
expect(app.run('python -V')).to match(/3.6.9/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
ENV['HATCHET_BUILDPACK_BASE'] = 'https://github.com/' + ENV['TRAVIS_REPO_SLUG'] + '.git'
|
||||
|
||||
require 'rspec/core'
|
||||
require 'rspec/retry'
|
||||
require 'hatchet'
|
||||
|
||||
require 'date'
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.full_backtrace = true
|
||||
config.verbose_retry = true # show retry status in spec process
|
||||
config.default_retry_count = 2 if ENV['IS_RUNNING_ON_CI'] # retry all tests that fail again
|
||||
config.expect_with :rspec do |c|
|
||||
c.syntax = :expect
|
||||
end
|
||||
end
|
||||
|
||||
if ENV['TRAVIS']
|
||||
# Don't execute tests against "merge" commits
|
||||
exit 0 if ENV['TRAVIS_PULL_REQUEST'] != 'false' && ENV['TRAVIS_BRANCH'] == 'master'
|
||||
end
|
||||
|
||||
DEFAULT_STACK = 'heroku-16'
|
||||
+1
@@ -0,0 +1 @@
|
||||
apache-airflow==1.10.2
|
||||
Vendored
+1
-1
@@ -6,4 +6,4 @@ verify_ssl = true
|
||||
requests = "*"
|
||||
|
||||
[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": {}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
django
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
pypy2.7-7.2.0
|
||||
+1
@@ -0,0 +1 @@
|
||||
django
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
pypy3.6-7.2.0
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user