tox-gh-actions is a tox plugin which helps running tox on GitHub Actions with multiple different Python versions on multiple workers in parallel. This project is inspired by tox-travis.
- Features
- Usage
- Examples
- Versioning
- Versions and Compatibility
- Understanding Behavior of tox-gh-actions
When running tox on GitHub Actions, tox-gh-actions
- detects which environment to run based on configurations and
- provides utilities such as grouping log lines.
-
Add configurations under
[gh-actions]section along with tox's configuration.- It will be
pyproject.toml,tox.ini, orsetup.cfg. See tox's documentation for more details.
- It will be
-
Install
tox-gh-actionspackage in the GitHub Actions workflow before runningtoxcommand.
The following configuration will create 3 jobs when running the workflow on GitHub Actions.
- On Python 3.10 job, tox runs
py310environment - On Python 3.12 job, tox runs
py312environment - On Python 3.14 job, tox runs
py314andmypyenvironments
Add [gh-actions] section to the same file as tox's configuration.
If you're using tox.ini:
[tox]
envlist = py310, py312, py314, mypy
[gh-actions]
python =
3.10: py310
3.12: py312
3.14: py314, mypy
[testenv]
...If you're using setup.cfg:
[tox:tox]
envlist = py310, py312, py314, mypy
[gh-actions]
python =
3.10: py310
3.12: py312
3.14: py314, mypy
[testenv]
...If you're using pyproject.toml:
[tool.tox]
legacy_tox_ini = """
[tox]
envlist = py310, py312, py314, mypy
[gh-actions]
python =
3.10: py310
3.12: py312
3.14: py314, mypy
[testenv]
""".github/workflows/<workflow>.yml:
name: Python package
on:
- push
- pull_request
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.10', '3.12', '3.14']
steps:
- uses: actions/checkout@v5
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install tox tox-gh-actions
- name: Test with tox
run: toxThe following configuration will create 2 jobs when running the workflow on GitHub Actions.
- On Python 3.12 job, tox runs
py12-django42environment - On Python 3.13 job, tox runs
py313-django42andpy313-django52environments
tox.ini:
[tox]
envlist = py312-django42, py313-django{42,52}
[gh-actions]
python =
3.12: py312
3.13: py313
[testenv]
...When using pre-release versions of Python, please do not specify -beta or -dev in tox.ini.
.github/workflows/<workflow>.yml:
...
jobs:
build:
strategy:
matrix:
python-version: [3.14, 3.15.0-beta.3]
...tox.ini:
[tox]
envlist = py39, py310
[gh-actions]
python =
3.14: py314
3.15: py315
# The following won't work
# 3.15-beta.3: py315
# 3.15-dev: py315
[testenv]
...Added in 3.5.0: To use a free-threaded Python build, add the t suffix.
tox.ini:
[tox]
envlist = py314, py314t
[gh-actions]
python =
3.14: py314
3.14t: py314t
[testenv]
...PyPy is also supported in the python configuration key.
Support of Pyston is experimental and not tested by our CI.
tox.ini:
[tox]
envlist = py313, py314, pypy3, pyston38
[gh-actions]
python =
3.13: py313
3.14: py314, mypy
pypy-3.11: pypy3
pyston-3.8: pyston38
[testenv]
...
[testenv:pyston38]
basepython = pyston38You can also specify without minor versions in the python configuration key.
tox.ini:
[tox]
envlist = py3, pypy3
[gh-actions]
python =
3: py3, mypy
pypy-3: pypy3
[testenv]
...If there are multiple matching Python versions in the configuration, only the most precise one is used.
For example, if you are running CPython 3.14 and gh-actions.python has both 3 and 3.14,
tox-gh-actions gets factors only from the key 3.14.
Changed in 3.0: pypy3 is not supported in the configuration anymore. Please use pypy-3 instead.
You can also use environment variable to decide which environment to run. The following is an example to install different dependency based on platform. It will create 9 jobs when running the workflow on GitHub Actions.
- On Python 3.10/ubuntu-latest job, tox runs
py310-linuxenvironment - On Python 3.12/ubuntu-latest job, tox runs
py312-linuxenvironment - and so on.
.github/workflows/<workflow>.yml:
name: Python package
on:
- push
- pull_request
jobs:
build:
runs-on: ${{ matrix.platform }}
strategy:
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]
python-version: ['3.10', '3.12', '3.14']
steps:
- uses: actions/checkout@v5
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install tox tox-gh-actions
- name: Test with tox
run: tox
env:
PLATFORM: ${{ matrix.platform }}tox.ini:
[tox]
envlist = py{310,312,314}-{linux,macos,windows}
[gh-actions]
python =
3.10: py310
3.12: py312
3.14: py3114
[gh-actions:env]
PLATFORM =
ubuntu-latest: linux
macos-latest: macos
windows-latest: windows
[testenv]
deps =
<common dependency>
linux: <Linux specific deps>
macos: <macOS specific deps>
windows: <Windows specific deps>
...Changed in 3.0: Environment variables should not use lowercase letters.
Because of the limitation in tox's configuration loading API,
tox-gh-actions always convert keys in [gh-actions:env] to uppercase.
If your project uses tox's requires configuration,
you must add tox-gh-actions to the requires configuration as well. Otherwise, tox-gh-actions won't be loaded as a tox plugin.
[tox]
requires =
tox-conda
tox-gh-actionsChanged in 2.0: When a list of environments to run is specified explicitly via -e option or TOXENV environment variable (tox's help),
tox-gh-actions respects the given environments and simply runs the given environments without enforcing its configuration.
Before 2.0, tox-gh-actions was always enforcing its configuration even when a list of environments is given explicitly.
This project follows PEP 440 and uses a format of major.minor.patch (X.Y.Z). The major version (X) will be incremented when we make backward incompatible changes to a public API. The public API of this project is the configuration of tox-gh-actions. The major version can be also incremented when we require a new version of tox.
This project tries not to introduce backward incompatibles changes as much as possible so that users don't need to update their project's configuration too frequently.
tox-gh-actions 3.x may drop support of unsupported Python 3.y versions in the future without bumping its major version.
We recommend to use the latest version of tox 4.x and tox-gh-actions 3.x. To use tox-gh-actions with tox 3.x, please install tox-gh-actions 2.x. The following table shows compatibility between tox and tox-gh-actions.
| tox | tox-gh-actions | Supported by tox-gh-actions | Branch |
|---|---|---|---|
| 4.x | 3.x | Yes (stable) | master |
| 3.x | 2.x | Only security fixes (stable) | tox3 |
See ARCHITECTURE.md for more details.
tox-gh-actions writes log messages using the standard logging module.
This is handy for understanding behavior of tox-gh-actions and for debugging tox-gh-actions.
To see the log messages, please run tox -vv.