Fix install.sh failing on offline Raspberry Pi at the venv step
install.sh ran 'pip install .', which builds the project: pip downloads
setuptools into an isolated build environment. With no internet it fails at
the 'Building the virtual environment' step with
Could not find a version that satisfies the requirement setuptools>=68
(from versions: none)
even though the runtime libraries are already in the wheel directory. The
build backend is only needed to package, never to run.
- Install the runtime deps straight from the bundled wheels with --no-index,
and put src/ on the path via a .pth file, so no build step happens at all.
- Generate the console script with the venv's interpreter as an absolute
shebang. '#\!/usr/bin/env python3' resolves to the *system* python when the
venv is not activated, so the package was not importable from the unit.
- apt-get update/install and 'pip install --upgrade pip' are now best-effort:
all three need the network and none should abort the install.
- Detect a failed 'python3 -m venv' and name python3-venv as the usual cause.
- Sanity-check the install with --version before enabling the service.
- The unit falls back to 'python -m rdm_card_reader' if the console script is
ever absent (no shell in ExecStart, so the installer picks the path).
Reproduced the failure offline, then verified the fix offline as well: a venv
created on a copy of the tree self-provisions from the bundled wheels and runs
from cwd=/ with no PYTHONPATH and no venv activation.
Added tests/test_deploy.py (20 tests) covering the installer and the deploy
artifacts, including a regression test for 'pip install .' that was confirmed
to fail when the bug is reintroduced.
This commit is contained in:
@@ -30,6 +30,70 @@ All commands run from the project root. The virtualenv is already built.
|
||||
```
|
||||
|
||||
After `pip install .` the same thing is available as `rdm-card-reader …`.
|
||||
`pip install .` needs the network — see **Troubleshooting** below for the
|
||||
offline route.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting install
|
||||
|
||||
### "Could not find a version that satisfies the requirement setuptools>=68"
|
||||
|
||||
Seen when running `deploy/install.sh` on a Pi with no internet, at the
|
||||
"Building the virtual environment" step:
|
||||
|
||||
```
|
||||
ERROR: Could not find a version that satisfies the requirement setuptools>=68
|
||||
(from versions: none)
|
||||
ERROR: No matching distribution found for setuptools>=68
|
||||
```
|
||||
|
||||
**Cause:** `pip install .` builds the project. pip creates an isolated build
|
||||
environment and downloads the *build* backend (`setuptools`) into it — even
|
||||
though the *runtime* libraries are already sitting in the wheel directory. With
|
||||
no network that download cannot happen.
|
||||
|
||||
**It is not** a problem with the bundled wheels, and not a Python version
|
||||
mismatch. Two separate confusions produce a similar-looking error:
|
||||
|
||||
| Situation | Error |
|
||||
| --- | --- |
|
||||
| Build isolation, no network | `Could not find a version ... setuptools>=68` |
|
||||
| `--no-build-isolation`, and setuptools absent | `Cannot import 'setuptools.build_meta'` |
|
||||
|
||||
Note that Python 3.12+ venvs no longer include `setuptools`, so the second case
|
||||
is increasingly common.
|
||||
|
||||
**Fix:** the current `install.sh` avoids the build entirely — it installs the
|
||||
bundled runtime wheels and puts `src/` on the path with a `.pth` file. If you
|
||||
are on an older copy, update it (`git pull`) or run these by hand on the Pi:
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install --no-index \
|
||||
--find-links src/rdm_card_reader/wheels rdm6300 pyserial
|
||||
SITE=$(.venv/bin/python -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')
|
||||
echo "$PWD/src" > "$SITE/rdm_card_reader_src.pth"
|
||||
.venv/bin/python -m rdm_card_reader --demo # verify, no hardware needed
|
||||
```
|
||||
|
||||
No build step, no network, and the same result.
|
||||
|
||||
### "Could not create the virtualenv"
|
||||
|
||||
On Debian and Raspberry Pi OS, `python3 -m venv` needs the `python3-venv`
|
||||
package:
|
||||
|
||||
```bash
|
||||
sudo apt-get install python3-venv
|
||||
```
|
||||
|
||||
### apt-get failing on the first step
|
||||
|
||||
`apt-get update` and `apt-get install` need the network. The installer now
|
||||
treats both as best-effort and continues, because a device typically already
|
||||
has `python3`. If they fail and something really is missing, install it while
|
||||
online and re-run.
|
||||
|
||||
---
|
||||
|
||||
@@ -240,6 +304,27 @@ journalctl -u rdm-card-reader -f
|
||||
curl http://127.0.0.1:8765/api/card # tap a card first
|
||||
```
|
||||
|
||||
The installer needs no internet: the runtime libraries ship inside the
|
||||
source tree (`src/rdm_card_reader/wheels/`).
|
||||
|
||||
### Copying the project to the Pi
|
||||
|
||||
`install.sh` resolves its source directory from its own location, so copy the
|
||||
whole tree (including `src/` — that is where the wheels live) and run it from
|
||||
there:
|
||||
|
||||
```bash
|
||||
# from this machine
|
||||
scp -r rdm-card-reader pi@192.168.0.123:~/Desktop/
|
||||
|
||||
# on the Pi
|
||||
cd ~/Desktop/rdm-card-reader
|
||||
sudo ./deploy/install.sh --origin https://your.web.app
|
||||
```
|
||||
|
||||
If you transferred only a subset of the tree, `--dir` can point the install
|
||||
somewhere else, but `src/` must be present or the wheels will be missing.
|
||||
|
||||
---
|
||||
|
||||
## Testing the reader path without a reader
|
||||
|
||||
Reference in New Issue
Block a user