uploaded to PyPI alongside source distributions • This saves users from building themselves • Wheels are architecture-specific – e.g. win32, win64, macosx, linux32, linux64 • A recent addition allowed “manylinux” wheels to be uploaded • Raspberry Pi is not the “manylinux” architecture, it’s ARM
Pi 2 is ARMv7 – Pi 1 / Zero are ARMv6 • But... – Wheels built on Pi 2/3 are tagged “armv7l” – Wheels built on Pi 1 / Zero are tagged “armv6l” • And… – They are actually ARMv6 wheels, and they’re all the same • So… – A wheel built on a Pi 3 will work on a Pi 2, as is – A wheel built on a Pi 3 will work on a Pi 1 / Zero (if renamed to “armv6l”)
it yourself! • PyPI doesn’t support uploading ARM wheels :( • “pip install numpy” takes: – ~20 mins on Pi 3 (1.2GHz quad-core) – ~2.5 hours on Pi 1 (700MHz single-core)
my own repository – “pip wheel numpy” works on a Pi – You can distribute the wheel and it’s a super fast install • Can I host my own package repository? – Apparently, yes! – At minimum, an Apache directory listing will do the trick
complete the build run • 76% build success rate • Repository (was) live at piwheels.bennuttall.com • “pip install numpy i http://piwheels.bennuttall.com” works and takes 6 seconds :) • Proof of concept: it works, it’s probably useful
• Keep up with new releases automatically • Host a package repository as before • Create a test suite • Provide installation instructions & developer documentation so people can contribute
But now I’m building every version of every package • 750k package versions to build • At the previous rate, this will take 70 days on one Pi… – Maybe I could use … more than one Pi?
web server or database – Connected to the database on first Pi – rsync files to first Pi • Provisioned a third Pi • Installed “terminator” • Provisioned Pis 4 and 5 • This is easy. I’ll be done in no time!
Queuing system with zeromq • Re-deployed the code • Original Pi is now “master” running database and web server only • Other Pis are now “builders” using master’s database and rsync- ing files to master
per day (10%) • Now also logging which Pi built each package • Pis seem to be holding up • Dropped rsync in favour of sshfs • It’s going well! I’ll be done in no time!
versions built: 570, 648 / 752, 817 (76%) • Total cumulative time spent building: 156 days, 18 hours (including duplicates) – In real time this was 26 days: • 16 days with 1 Pi building • 10 days with up to 19 Pis building • 250GB disk space used by wheels
all new releases on a small number of buider Pis • Added SSL to web domain • Provide ARMv6 wheels for Pi 1 / Zero • Build mechanism for triggering builds for multiple Python versions (3.4, 3.5, 3.6, 2.7) • Added the piwheels server to pip config in Raspbian – Users get wheels for free without needing to know about it
use piwheels – But… we haven’t rebuilt packages for Stretch yet (Python 3.5) – Pure Python packages are available, but big C ones like numpy aren’t (yet) • Raspbian Jessie: – Manually configure pip to use piwheels – All packages are built for Jessie (Python 3.4)