Commit Graph

2001 Commits

Author SHA1 Message Date
Ed Morley 7279ddded8 Always check/adjust the installed versions of setuptools/wheel (#1007)
Previously the pip/setuptools/wheel install step was skipped so long
as Python hadn't just been clean installed (ie so long as not a new app,
emptied cache, Python upgrade, stack change) and pip was the expected
version.

This meant that setuptool/wheel could be the wrong version (or even just
not installed at all), and this would not be corrected.

Now, we now use pip itself to determine whether the installed packages
are up to date, since parsing pip's output is fragile (eg #1003) and
would be tedious given there would be three packages to check.

Unfortunately `get-pip.py` uses `--force-reinstall` which means
performing this step every time is not the no-op it would otherwise be,
but this will be resolved by switching away from `get-pip.py` in the
next commit.

Fixes #1000.
Fixes #1003.
Closes #999.
2020-07-29 19:11:35 +01:00
Ed Morley 0027f23065 Remove redundant site-packages cleanup steps (#1007)
Since `get-pip.py` / pip will automatically detect and remove old
pip/setuptools versions if needed, so removing them manually is both not
necessary and slows down the build in the case where the pip version
changed, but setuptools remained the same.
2020-07-29 19:11:35 +01:00
Ed Morley 2097eab028 Install an explicit version of wheel rather than latest (#1007)
Before:
- if `wheel` was not already installed, then `get-pip.py` would
  automatically install the latest version on PyPI, which is `0.34.2`
  (or `0.33.6` for Python 3.4).
- if `wheel` was already installed, then it was left unchanged
  regardless of the version installed.

Now:
- if `wheel` is not already installed, then the same versions will be
  installed as before, except these versions are pinned and will now not
  change unexpectedly after future `wheel` releases.
- if `wheel` is already installed, then it's upgraded/downgraded to the
  target version as needed.

Partly addresses #1000, though this change only helps builds where the
pip/setuptools/wheel install flow is triggered (currently only new apps
or ones where Python was purged or pip was not the correct version).

Since the wheel version is now known, it's output to the build log to
ease debugging and for parity with pip/setuptools.

The rest of #1000 will be fixed in later commits.
2020-07-29 19:11:35 +01:00
Ed Morley 46581612fc Install pip and setuptools in the same pip invocation (#1007)
`get-pip.py` installs setuptools itself (if it's not already installed):
https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py
https://github.com/pypa/get-pip/blob/eff16c878c7fd6b688b9b4c4267695cf1a0bf01b/templates/default.py#L152-L153

This means that previously the latest version of setuptools (currently
`49.2.0`) was being installed from PyPI, and then immediately after the
target version (currently `39.0.1`) installed over it.

This added time to the build unnecessarily.

The version of setuptools installed by `get-pip.py` can be overridden
by passing in a version as a normal requirements specifier.

Fixes #1001.
2020-07-29 19:11:35 +01:00
Ed Morley 31e8f48db8 Install setuptools from PyPI rather than a vendored copy (#1007)
Since:
* we'll be updating setuptools soon, and newer setuptools has dropped
  support for Python versions this buildpack needs to support. As such
  if we continued to vendor setuptools, we would need to vendor at
  least three different versions.
* we want to try and update setuptools more frequently than we have
  in the past, which will mean more repo bloat from binary churn.
* we're still pinning to a specific version, meaning vendoring doesn't
  have determinism benefits.
* setuptools is only fetched from PyPI for new installs (or where
  versions have changed), so this doesn't increase build time, load on
  PyPI, or reliance on PyPI in the common case.
* setuptools is already being inadvertently installed from PyPI prior to
  being installed from the vendored copy (see #1001), so we're in effect
  already using/depending on PyPI here.
* switching to storing setuptools on S3 wouldn't help reliability as
  much as it would appear at first glance, since the later `pip install`
  of customer dependencies will fail if PyPI is down anyway.
2020-07-29 19:11:35 +01:00
Ed Morley 47a8b4b3b9 Output the installed version of setuptools in the build log (#1007)
Since:
* "explicit is better than implicit"
* we'll soon be upgrading setuptools, and debugging breakage caused by
  upgrades will be easier if versions are visible in the build log
2020-07-29 19:11:35 +01:00
Ed Morley 4080587538 Move Pip version handling to bin/steps/python (#1007)
And use the `$PYTHON_VERSION` calculated in `bin/steps/python` instead
of re-implementing the Python version handling.
2020-07-29 19:11:35 +01:00
Ed Morley 157ce25694 Output the installed version of pip in the build log (#1007)
Since:
* "explicit is better than implicit"
* we'll soon be upgrading pip, and debugging breakage caused by upgrades
  will be easier if versions are visible in the build log

Closes #939.
2020-07-29 19:11:35 +01:00
Ed Morley e7c7dfdb26 Reduce the number of env vars exposed to subprocess (#1011)
The following env vars are no longer exposed to subprocesses run by the
buildpack (such as the `bin/pre_compile` and `bin/post_compile` hooks):

* `BPLOG_PREFIX`
* `CACHED_PYTHON_STACK`
* `DEFAULT_PYTHON_STACK`
* `DEFAULT_PYTHON_VERSION`
* `LATEST_27`
* `LATEST_34`
* `LATEST_35`
* `LATEST_36`
* `LATEST_37`
* `LATEST_38`
* `PIP_UPDATE`
* `PY27`
* `PY34`
* `PY35`
* `PY36`
* `PY37`
* `PYPY_27`
* `PYPY_36`
* `RECOMMENDED_PYTHON_VERSION`
* `WARNINGS_LOG`

There were previously no tests at all for the pre/post-compile hooks,
so I've added some now.

Fixes #1010.
2020-07-28 18:12:08 +01:00
Ed Morley aa8a0f43bb Travis: Reduce end to end testing time (#1022)
This change (along with #1021, which skips an unnecessary docker build)
reduces the wall clock time from ~22 minutes to ~6 minutes. Even with
the additional overhead from increased parallelism, the combined job
duration (~50 minutes) has not increased due to the other time savings.

Changes:

- for the unit tests, each stack is now tested in its own job and so
  tested in parallel
- the use of Travis stages has been removed, since by design it blocks
  later tasks on earlier stages having completed - reducing parallelism
  unnecessarily for this use case
- all jobs except for the Hatchet job now use Travis' `minimal` image,
  and no longer install redundant Ruby + bundler
- the `sudo: {required,false}` references have been removed, since
  Travis no longer supports its non-sudo container infrastructure so
  ignores that option

Fixes #1018.

[skip changelog]
2020-07-28 16:18:45 +01:00
Ed Morley 93a5b4021d Tests: Support running only a subset of the test suites (#1021)
Previously `make test` ran all unit test suites against all stacks, which
would take up to an hour locally. This could be sped up by using one of
the stack-specific targets (such as `make test-heroku-18`), however
there was still no way to only run one of the test suites.

Now `make test` can be controlled more precisely using optional `STACK`
and `TEST_CMD` arguments, eg:

`make test STACK=heroku-16 TEST_CMD=test/versions`

Travis has now been made to use this feature, which unblocks future
Travis speedups (such as splitting the jobs up further in #1018) and
means on Travis the correct Docker image is now used (see #958).

The `tests.sh` script has been removed since it's unused after #839 and
redundant given the make targets.

Fixes #958.
Fixes #1020.
2020-07-28 15:08:20 +01:00
Ed Morley f21e538fde Tests: Delete redundant detect(), compile() and release() (#1017)
Since they are all shadowed by functions with the same name later in
the file.

Fixes #1013.

[skip changelog]
2020-07-24 18:19:01 +01:00
Ed Morley a97da6382f Tests: Run detect/compile/release in a clean environment (#1016)
To prevent external environment variables from leaking into the tests,
which otherwise causes problems trying to write tests for #1011.

Several tests which were relying on this leak had to be fixed, so that
the env vars they were using are set using `ENV_DIR`, as happens in
production.

Fixes #1014.
Fixes #1015.
2020-07-24 18:10:11 +01:00
Ed Morley d9b1c73f63 Improve the Check Changelog GitHub action (#1009)
It now:
* uses the PR body rather than title for controlling whether to skip the
  check, to reduce PR title noise
* supports `[skip changelog]` in addition to `[changelog skip]`, since I
  could never remember which way around the words should go
* uses the GitHub `if` syntax with the `github` event context, which
  simplifies the implementation, means the action doesn't run steps like
  git checkout when it's going to be skipped anyway, and gives the
  status check the grey icon when skipped instead of the green check
* renames the inner job from `build` to `check`

The file has also been style-formatted using Prettier.

See:
https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif
https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions
https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#pull_request

Example failing (since no skip syntax used):
https://github.com/heroku/heroku-buildpack-python/pull/1009/checks?check_run_id=906015118

Example skipped (since skip syntax used):
https://github.com/heroku/heroku-buildpack-python/pull/1009/checks?check_run_id=906022522
2020-07-24 10:34:27 +01:00
Ed Morley 7209bb4483 Remove get-pip.py reference from NOTICE (#1008)
Since `get-pip.py` is no longer distributed with the buildpack.

Leftover from #840.
2020-07-24 10:10:50 +01:00
Ed Morley 156b07ce2b Release v173 (#998) v173 2020-07-21 11:31:01 +01:00
Rust Saiargaliev e288ed5a9e Add support for CPython 3.8.5 (#996)
https://www.python.org/downloads/release/python-385/

Release contains a couple of security bugfixes.
Changelog: https://docs.python.org/release/3.8.5/whatsnew/changelog.html#changelog
2020-07-21 11:01:31 +01:00
Ed Morley 181e3395f9 Release v172 (#995) v172 2020-07-17 12:03:37 +01:00
Denis Cornehl 013ba6b1d9 Add support for Python 3.8.4 (#993) 2020-07-17 10:19:21 +01:00
Ed Morley bce5bf4869 Release v171 (#991) v171 2020-07-07 19:20:13 +01:00
Denis Cornehl 0fdb62faa9 Add support for Python 3.6.11 and 3.7.8 (#988) 2020-07-07 18:39:44 +01:00
dependabot[bot] 42507a3f9a Bump rake from 12.3.1 to 12.3.3 (#981)
Bumps [rake](https://github.com/ruby/rake) from 12.3.1 to 12.3.3.
- [Release notes](https://github.com/ruby/rake/releases)
- [Changelog](https://github.com/ruby/rake/blob/master/History.rdoc)
- [Commits](https://github.com/ruby/rake/compare/v12.3.1...v12.3.3)
2020-05-27 14:14:43 +01:00
dependabot[bot] f89ee6750e Bump activesupport from 6.0.2.2 to 6.0.3.1 (#980)
Bumps [activesupport](https://github.com/rails/rails) from 6.0.2.2 to 6.0.3.1.
- [Release notes](https://github.com/rails/rails/releases)
- [Changelog](https://github.com/rails/rails/blob/v6.0.3.1/activesupport/CHANGELOG.md)
- [Commits](https://github.com/rails/rails/compare/v6.0.2.2...v6.0.3.1)
2020-05-27 13:42:59 +01:00
Ed Morley 122722f89e v170 (#978) v170 2020-05-19 15:33:30 +01:00
Ed Morley 8cb379f83b Add support for latest CPython and PyPy versions (#977)
Adds support for:
* CPython 2.7.18, 3.5.9, 3.7.7 and 3.8.3
* PyPy 2.7 and 3.6, version 7.3.1

The binaries will need generating and uploading before CI will pass.

Note: Whilst the build script for CPython 3.8.3 did already exist in the
repository, it appears to have been accidentally created in #920, which
predated the existence of that version of Python - so the binaries do
not exist on S3.

The Heroku-18 Docker image tag has also been unpinned, since the new
libssl version is now available at runtime in all environments, so we
don't need to force building against the older version of the headers.

Fixes W-7582174.
2020-05-19 14:16:59 +01:00
Richard Schneeman d3a60b21fe [changelog skip] Fix PR edit check (#974)
Previously when a PR title was edited, the "check for changelog" script would not fire. This means if someone edited it to add a "[changelog skip]" that the check would still show to be failing. This PR adds additional triggers for the check so that when the PR is edited, the check will re-run.
2020-05-12 09:57:33 -05:00
Richard Schneeman 7e80ea8fbe Update heroku hatchet so master can be specified (#970)
- https://github.com/heroku/hatchet/pull/80
- https://github.com/heroku/heroku-buildpack-python/pull/969#issuecomment-620057594
2020-04-27 15:55:16 -05:00
Joe Kutner c78ffd5ac4 Prevent Hatchet on forked PRs [changelog skip] (#966)
* Update travis conditional for hatchet to check for HEROKU_API_ env vars
[changelog skip]

* remove check to skip hatchet in travis in favor of better travis config
2020-04-27 09:15:38 -05:00
Richard Schneeman a06b536109 Add Hatchet Regression Tests (#969)
I went through all the tests in the Ruby buildpack and cataloged what I think can be generalized between languages to prevent regressions. This PR add tests for these cases:

* Test CI deploys run tests and use the cache [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/f488bd53c7ff0b78e17c2405166cbd4a3af75ee2/spec/hatchet/ci_spec.rb#L36)]
* Test cache for regular deploys is used on repeated deploys (This was already tested on the Python buildpack, I moved it) [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/e34c583c139911d059f5627bb25125707288f053/spec/hatchet/stack_spec.rb#L21-L25)]
    * Test modifying a requirement clears the cache appropriately (This was already tested on the Python buildpack, I moved it)
* Test deploying the getting started guide works [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/424a7245e2da86845a20d58a9482bcf2a00c3a8f/spec/hatchet/getting_started_spec.rb#L5)]
* Test that all paths set by the buildpack are absolute instead of relative [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/249d3c1a4e97068f8fd016f10fa0839709d95658/spec/hatchet/rails5_spec.rb#L68])
* Test upgrading stack invalidates the cache [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/f488bd53c7ff0b78e17c2405166cbd4a3af75ee2/spec/hatchet/stack_spec.rb#L3)]
* Test that builds fail when a bad version is specified [[reference test](https://github.com/heroku/heroku-buildpack-ruby/blob/249d3c1a4e97068f8fd016f10fa0839709d95658/spec/hatchet/ruby_spec.rb#L5)]


In addition to that I've also got a CNB test with `pack-build` with the getting started app, but since python isn't `cnb` capable yet I didn't add one.
2020-04-27 08:26:42 -05:00
Ed Morley dd646998d3 Fix changelog after rebase (#967)
The merge of #910 added three lines to the changelog rather than just one:
https://github.com/heroku/heroku-buildpack-python/commit/932cd257c98e9f56e878134f84a09d7d972bc46e

The original commit before rebase, was:
https://github.com/heroku/heroku-buildpack-python/pull/910/commits/d57d26b2e0348199228312950e55b42bc9de8147

I've also clarified the wording of it and the other unreleased change,
to reduce the chance for confusion as to what's changed, when customers
debug issues.
2020-04-24 10:32:38 +01:00
Ed Morley 484bd44a1e Remove unused libffi build script (#965)
The compile-time cryptography step that used to use the libffi archives
on S3 was removed in 2018:
https://github.com/heroku/heroku-buildpack-python/commit/c373e80c1285260e5adcbc855f54bbeb6999005c

...since the `cryptography` Python package now ships wheels.

The script is also incorrect, since similar to #964 it only skips builds
for Heroku-16, whereas all stacks since Cedar-14 include libffi-dev in
the build image, so don't need it built/uploaded for later vendoring.

Refs W-7485877.
2020-04-24 09:26:03 +01:00
Thomas Mollard 932cd257c9 fix runtime.txt generation when using pipenv (#910)
Co-authored-by: Casey <caseylfaist@gmail.com>
Co-authored-by: Joe Kutner <jpkutner@gmail.com>
2020-04-23 21:30:04 -05:00
Ed Morley 989351467f Prevent building libmemcached on stacks that don't vendor it (#964)
The `libmemcached` package is available in the base stack image for all
stacks newer than `cedar-14`, so at buildpack compile time the vendor
step is skipped for those stacks:
https://github.com/heroku/heroku-buildpack-python/blob/106f2997fa124852a2a35ee8bfa604ad20c47988/bin/steps/pylibmc#L12-L15

As such, it is not necessary to run the libmemcached bob-builder formula
on newer stacks. The conditional has been updated so it correctly handles
heroku-18 and also the upcoming heroku-20.

An exit code of 1 has been used, otherwise `bob upload` will build and
then upload a zero byte archive to S3, which will go unused.

(This is in comparison to bob formulas that are nested, where an exit
code of 0 is actually desirable, since it allows skipping steps.)

Refs W-7485877.

Co-authored-by: Joe Kutner <jpkutner@gmail.com>
2020-04-23 21:23:38 -05:00
Ed Morley d68a7c594c Remove unused Pipfile and Pipfile.lock (#960)
These aren't referenced anywhere in the repository, and contain older
versions of the dependencies than are declared in `requirements.txt`
(which itself is used).

Co-authored-by: Joe Kutner <jpkutner@gmail.com>
2020-04-23 20:40:35 -05:00
Joe Kutner 97f783ce96 Update travis config [changelog skip] (#963)
* Update travis config to only setup hatchet when running hatchet [changelog skip]

Fix a bug in the hatchet tests, and allow previous builds to finish before running the next test

* Add logging when skipping hatchet tests

Only skip hatchet tests on a forked PR

* Build on Travis only for master branch

* Upgrade from trusty to bionic on Travis
2020-04-23 19:55:05 -05:00
Joe Kutner 106f2997fa Add support for Python 3.8 latest version (#955)
* Add support for Python 3.8 latest version

If the pip lock file only specifies `3.8` and no bug fix version, it should use Python LATEST_38.

* Update CHANGELOG.md

* Update changelog

Co-authored-by: Johannes Hoppe <info@johanneshoppe.com>
Co-authored-by: Casey <caseylfaist@gmail.com>
2020-04-23 08:11:53 -05:00
Joe Kutner 373a656272 Update changelog for version 169 (#957) 2020-04-22 16:32:08 -05:00
Joe Kutner 0abc749aff Add a Hatchet test for python 3.8.2 (#956)
* Add a Hatchet test for python 3.8.2

* update changelog

* Update test to match build output

* Fix formatting and a syntax error in tests

* Fix syntax error in hatchet spec
2020-04-22 10:38:16 -05:00
Joe Kutner 60614232da Set Codeowners to languages (#953)
* Set languages as codeowners

* Update changelog
v169
2020-04-21 17:39:56 -05:00
Joe Kutner edb7004a28 Update hatchet tests to support latest version of Python (#952)
* Update hatchet tests to support latest version of Python

* Empty commit to trigger CI
2020-04-21 16:42:56 -05:00
Casey ea350a6694 Bugfix: Caching on subsequent redeploys (#948)
* Don't clear the cache on first app deploy

* Add output for debugging cache behavior

* Debug output of changes, clean up whitespace

* Update hatchet to use latest getting started guide

* Clean up caching output logs

This output was confusing and unhelptul to most users

* Changelog

* Test if we need these lines

* dang fi

* Remove unnecessary code

* Remove confusing output of change

* Update log output

* Update test to match new expected log output

* Update changelog
2020-04-21 15:41:57 -05:00
Casey 027d49eb58 Merge pull request #946 from heroku/releaseprep/168
Release prep: changelog update
v168
2020-04-06 15:22:48 -04:00
Casey 49597f22ca Merge branch 'master' into releaseprep/168 2020-04-06 15:03:32 -04:00
Casey Faist 4bb8f59f2c Prep release changelog update 2020-04-06 13:58:51 -04:00
Casey d4b6b0190d Merge pull request #930 from heroku/kgrinberg/master
Fix old Django version detection
2020-04-06 13:47:51 -04:00
Casey 2c2cbc4653 Merge branch 'master' into kgrinberg/master 2020-04-06 13:23:29 -04:00
Casey d0629cd6ef Merge pull request #895 from heroku/geos-deprecation
Geos deprecation
2020-04-06 13:19:31 -04:00
Casey 398a0fb202 Merge branch 'master' into kgrinberg/master 2020-04-02 15:48:21 -04:00
Casey 5bf80a2270 Merge branch 'master' into geos-deprecation 2020-04-02 15:47:01 -04:00
Casey 61609930c1 Merge pull request #945 from heroku/changelog/bump
More recent changelog update
2020-04-02 15:45:56 -04:00