77 Commits

Author SHA1 Message Date
Ed Morley fc6698e597 Update pip to 20.1.1 (#1030)
Updates pip from 20.0.2 to 20.1.1 for Python 2.7 and Python 3.5+:
https://pip.pypa.io/en/stable/news/#id40

The version used for Python 3.4 remains unchanged at 19.1.1, since it's
the last version of pip that supports it.

Pip has been updated to 20.1.1 rather than the recently released 20.2,
since the latter has a few regressions and even though these will be
fixed shortly in 20.2.1, we should let the changes soak for longer
before picking them up.

The `PIP_NO_PYTHON_VERSION_WARNING` environment variable has been set
(equivalent to passing `--no-python-version-warning`) to prevent the
Python 2.7 EOL warnings added in pip 20.1 from spamming the build log:
https://github.com/pypa/pip/blob/20.1.1/src/pip/_internal/cli/base_command.py#L139-L154

This was set via environment variable rather than CLI flag, since:
* otherwise we'd have to pass it to every pip invocation
* older pip (such as the 19.1.1 used by Python 3.4) doesn't support this
  option and would error out due to an unknown CLI flag being passed,
  unless we added conditional flags throughout.

The new pip wheel was uploaded to S3 using:

```
$ pip download --no-cache pip==20.1.1
Collecting pip==20.1.1
  Downloading pip-20.1.1-py2.py3-none-any.whl (1.5 MB)
  Saved ./pip-20.1.1-py2.py3-none-any.whl
Successfully downloaded pip

$ aws s3 sync . s3://lang-python/common/ --exclude "*" --include "*.whl" --acl public-read --dryrun
(dryrun) upload: ./pip-20.1.1-py2.py3-none-any.whl to s3://lang-python/common/pip-20.1.1-py2.py3-none-any.whl

$ aws s3 sync . s3://lang-python/common/ --exclude "*" --include "*.whl" --acl public-read
upload: ./pip-20.1.1-py2.py3-none-any.whl to s3://lang-python/common/pip-20.1.1-py2.py3-none-any.whl
```

Fixes #1005.
@W-7659489@
2020-08-03 19:45:41 +01:00
Ed Morley 6fa6feb75d Update setuptools (#1024)
Upgrades setuptools from 39.0.1 to:
- 44.1.1 for Python 2.7 (since it's the last supported version)
- 43.0.0 for Python 3.4 (since it's the last supported version)
- 47.1.1 for Python 3.5+ (since we can't use 47.2.0+ until #1006 fixed)

https://setuptools.readthedocs.io/en/latest/history.html#v47-1-1

Fixes #949.
Closes #973.
2020-08-03 18:36:01 +01:00
Ed Morley 00e70fffc9 Correctly handle failed pip/setuptools/wheel installs (#1007)
They are now displayed in the build output (instead of being sent to
`/dev/null`) and fail the build early instead of failing later in
`bin/steps/pip-install`.

Fixes #1002.
2020-07-29 19:11:35 +01:00
Ed Morley 60f2fac8e1 Disable pip's version check + cache when installing pip/setuptools/wheel (#1007)
Since the version check is redundant given we control/choose the version.

The pip cache is redundant since we instead cache site-packages. The pip
cache also ends up in `/app` so isn't included in the build cache anyway.
2020-07-29 19:11:35 +01:00
Ed Morley 405c7651ea Install pip using itself rather than get-pip.py (#1007)
`get-pip.py` is no longer used, since:
- It uses `--force-reinstall`, which is unnecessary here and slows down
  repeat builds (given we call pip install every time now). Trying to
  work around this by using `get-pip.py` only for the initial install,
  and real pip for subsequent updates would mean we lose protection
  against cached broken installs, plus significantly increase the
  version combinations test matrix.
- It means downloading pip twice (once embedded in `get-pip.py`, and
  again during the install, since `get-pip.py` can't install the
  embedded version directly).
- We would still have to manage several versions of `get-pip.py`, to
  support older Pythons (once we upgrade to newer pip).

We don't use `ensurepip` since:
- not all of the previously generated Python runtimes on S3 include it.
- we would still have to upgrade pip/setuptools afterwards.
- the versions of pip/setuptools bundled with ensurepip differ greatly
  depending on Python version, and we could easily start using a CLI
  flag for the first pip install before upgrade that isn't supported on
  all versions, without even knowing it (unless we test against hundreds
  of Python archives).

Instead we install pip using itself in wheel form. See:
https://github.com/pypa/pip/issues/2351#issuecomment-69994524

The new pip wheel assets on S3 were generated using:

```
$ pip download --no-cache pip==19.1.1
Collecting pip==19.1.1
  Downloading pip-19.1.1-py2.py3-none-any.whl (1.4 MB)
  Saved ./pip-19.1.1-py2.py3-none-any.whl
Successfully downloaded pip

$ pip download --no-cache pip==20.0.2
Collecting pip==20.0.2
  Downloading pip-20.0.2-py2.py3-none-any.whl (1.4 MB)
  Saved ./pip-20.0.2-py2.py3-none-any.whl
Successfully downloaded pip

$ aws s3 sync . s3://lang-python/common/ --exclude "*" --include "*.whl" --acl public-read --dryrun
(dryrun) upload: ./pip-19.1.1-py2.py3-none-any.whl to s3://lang-python/common/pip-19.1.1-py2.py3-none-any.whl
(dryrun) upload: ./pip-20.0.2-py2.py3-none-any.whl to s3://lang-python/common/pip-20.0.2-py2.py3-none-any.whl

$ aws s3 sync . s3://lang-python/common/ --exclude "*" --include "*.whl" --acl public-read
upload: ./pip-19.1.1-py2.py3-none-any.whl to s3://lang-python/common/pip-19.1.1-py2.py3-none-any.whl
upload: ./pip-20.0.2-py2.py3-none-any.whl to s3://lang-python/common/pip-20.0.2-py2.py3-none-any.whl
```
2020-07-29 19:11:35 +01:00
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
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 Faist e12ad47397 Add missing dev/null for diff output 2020-04-02 11:01:44 -04:00
Casey Faist abd9ffdbff Missed bash linting check 2020-03-26 17:46:54 -04:00
Casey Faist dee86babe1 Don't skip install if clearing cache 2020-03-24 13:43:18 -04:00
Casey Faist 6a02499140 Update caching logic so new apps don't get logs
actually add changes

Missing fi
2020-03-24 13:43:18 -04:00
Casey Faist b8fd617d9c Bash conditional operaters needed for brackets
Removing brackets also works

Wrong diff check - inverted

Remove uninstall step

Whitespace is hard
2020-03-24 13:43:18 -04:00
Casey Faist f7c422e07d test clear cache and cache requirements.txt 2020-03-24 13:43:18 -04:00
Casey Faist a98a87e1bc Remove the lines that bust the cache when we detect that sqlite has changed 2020-03-12 14:20:49 -07:00
Joe Kutner 520c240edd Download get-pip.py to tmpdir instead of root dir 2020-02-16 09:27:07 -06:00
Casey Faist ec57979bf8 comply with shellcheck, use -gt instead 2019-12-23 13:14:06 -05:00
Casey Faist 179f345f5b add beta Pypy support 2019-12-23 00:16:20 -05:00
Casey Faist f189df5415 Warn about EOL on Python 2 install 2019-12-23 00:13:54 -05:00
Casey Faist 33cd4a5fe1 remove copy-paste typo 2019-10-17 16:09:27 -07:00
Casey Faist 9a830367fe add 3.8 support 2019-10-17 14:59:26 -07:00
David Zülke 00d44d2e34 Revert "Refactor: $BUILD_DIR" 2019-10-09 15:28:31 +02:00
Casey Faist cd4601a707 add double-quotes to comply with shellcheck 2019-10-07 18:05:34 -07:00
Duane Hutchins 05e29c74bc Changed hardcoded /app into $BUILD_DIR 2019-10-07 16:41:07 -07:00
Casey Faist a80f2be020 download get-pip silently 2019-09-12 14:31:09 -07:00
Casey Faist 56322381f0 Revert "update get-pip to look for sha"
This reverts commit a2f3ff7a35.
2019-09-11 16:59:20 -07:00
Casey Faist a2f3ff7a35 update get-pip to look for sha 2019-09-11 16:36:48 -07:00
Casey Faist 44fe0fe3fd move get-pip to s3 2019-09-11 13:37:18 -07:00
Casey Faist 797652a75d new runtimes and travis test updates 2019-01-31 14:46:42 -05:00
Casey Faist 9e1df4bbb5 specify python 2.7 2018-11-11 17:24:42 -06:00
Casey Faist 0be9d48013 add missing vars for python step 2018-11-11 16:51:29 -06:00
Casey Faist 4750639a0d add python 3.4 detection 2018-11-11 16:38:12 -06:00
Casey Faist 3de5b43447 add bash pre-commit hook and correct shellcheck warnings 2018-11-11 16:36:16 -06:00
Casey Faist c3845fff9a use text variable as variable in puts-warn 2018-11-11 15:43:21 -06:00
Casey Faist f3ef152624 update tests to pass, add 3.4 2018-11-11 15:34:49 -06:00
Casey Faist 285ca2b73d reword warning, add doc link 2018-09-05 16:21:42 -04:00
Casey Faist 5e4667686a add case for older python 3 install attempts 2018-09-05 16:21:42 -04:00
Casey Faist f9621add42 Update indentation levels and messaging
Fix indentation levels

more helpful messages about supported versions
2018-09-05 16:21:42 -04:00
Terence Lee 221722fb27 setup libsqlite3-dev and sqlite3 binary to match stack's libsqlite3-0
With inspiration from @KevinBrolly, this patch uses the stack image
SQLite3 package but also still providing the dev headers and binary that
users may still be using today. The benefit is that we won't need to
rebuild all the python binaries for this to take affect. We can just
stop shipping SQLite3 from future binaries. In addition, we don't need
to worry about what version and when to update SQLite3 and maintaining
the packages ourselves.

This also includes updates to Python 2.7.15 and Python 3.6.6 so they can
rebuilt with the stack image dev headers instead of building our own
vendored SQLite3.
2018-07-26 16:49:23 -05:00
Ian Stapleton Cordasco 731876d6e8 Be clearer in our warnings about which Py3 we mean 2018-07-10 07:38:31 -05:00
Ian Stapleton Cordasco 179e6287b1 Prevent Python 3.7 from being unsupported
Python 3.7.0 is supported but not preferred given how new it is. As a
result, we don't want it to be the default, but we also don't want users
to be confused when upgrading to it.

Closes gh-728
2018-07-06 09:11:26 -05:00
kennethreitz a0275888a2 Pip frozen version (#683)
* freeze pip version, upon installation

Signed-off-by: Kenneth Reitz <me@kennethreitz.org>

* use PIP_UPDATE environment variable

Signed-off-by: Kenneth Reitz <me@kennethreitz.org>

* disable shell checking (for now)

Signed-off-by: Kenneth Reitz <me@kennethreitz.org>

* --disable-pip-version-check

Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
2018-04-17 16:50:01 -04:00
kennethreitz 23400d7862 update pip installation method, to include setuptools 2018-03-20 13:20:49 -04:00
kennethreitz 877aa79e19 cleanup pip upgrade step
Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
2018-03-19 10:56:59 -04:00