blob: 73a5de2462d092c7f7d379f59bf650fb5ab79058 [file] [log] [blame] [view]
# Python VirtualEnv
[TOC]
Lots of infrastructure, building, and testing code is built using Python. Chrome
Operations supports the deployment, management, and augmentation of basic Python
installation on infrastructure systems.
Chrome Operations currently supports **Python 3.8** on Windows, Linux, and Mac
OSX.
## Python Packages and VirtualEnv
Chrome Operations provides a bundled Python distribution. This Python
distribution is hermetic, ignoring system packages and software. The set of
packages available by default to a bundled Python version is fixed and deployed
within that bundle.
Using Python bundles enables Chrome Operations and its clients to reliably
create Python package sets, canary new Python distributions, and deploy bug- and
security fixes independently from underlying Operating System updates. This
results in reliability and long-term reproducibility of Python code and
programs.
With a hermetic Python bundle, traditional methods of deploying Python packages
(e.g., `pip`) are not available. Python hermetic bundle environments are
read-only, as they must be to satisfy hermeticity. Users oftentimes need to
augment the default Python package set, typically with public packages from
`pip` or [PyPi](https://pypi.python.org/pypi). For this reason, Chrome
Operations has built a tool called [vpython](vpython.md) which allows Python
programs to explicitly request their dependencies.
[vpython](vpython.md) is designed to make the specification, instantiation, and
execution of VirtualEnv simple and reliable. Code that requires additional
Python packages will use `vpython` to start with a read-only hermetic python
bundle and augment it with specific packages in a disposable VirtualEnv,
producing a final Python environment that is fully specified and completely
under their control.
## FAQ
### Why not System Python?
POSIX systems typically include their own version of system Python and a set of
associated packages composed of:
* Packages that are part of the Python distribution.
* Additional system packages installed via the system package manager (e.g.,
`apt-get`, `dpkg`).
* Additional packages pulled in during installation of Python-based tooling.
* Packages installed via Puppet.
* Packages installed by users manually via `pip`.
Because these sets of packages widely vary with the version and lifecycle of a
given system, they are not suitable for hard dependencies for infrastructure,
build, or test code.
Further, upgrading system Python involves upgrading all of the system software
and packages that depend on that Python. This makes system Python upgrades
necessarily heavy operations instead of the quick low-risk agility enabled by
using non-system bundles.
## Python on Chrome Operations Systems
Python versioning and dependencies have traditionally been managed differently
on different platforms. This is both a consequence of the fundamental
differences between those platforms and the native offerings of those platforms:
* Windows Python through `depot_tools` bootstrap.
* Linux and Mac Python is whatever the native operating system provides.
For security- and bug-related reasons, systems and users require a higher
standard of Python package management than that natively provided by the myriad
systems that Chrome Operations supports. Chrome Operations is solving this by
using hermetic deployable Python bundles built on top of CIPD, using
[3pp packages](/3pp/README.md).
Python bundles are installed on and used in various parts of the system:
* A system-level bundle is deployed for system foundation software.
* On Windows, this is installed at: `C:\infra-python3\bin\python3.exe`
* On Mac and Linux, this is installed at: `/opt/infra-python3/bin/python3`
* A Python bundle is used per-build to run the Recipe Engine and its associated
software, including building and testing code.
* On LUCI, this is installed in the `luci-config` Swarming Task Template.