• Stars
    star
    246
  • Rank 164,726 (Top 4 %)
  • Language
    Python
  • License
    MIT License
  • Created about 5 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Seamless integration of tox into GitHub Actions for tox 3 and 4

tox-gh-actions

PyPI version PyPI Supported Python Versions GitHub Actions (Tests) codecov

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.

Versions and Compatibility

Currently, tox-gh-actions supports both tox 3 and 4, but users need to install the appropriate version by following the table below.

tox tox-gh-actions Supported by tox-gh-actions Branch
4.x 3.x Yes (stable) master
3.x 2.x Yes (stable) tox3

Features

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.

Usage

  1. Add configurations under [gh-actions] section along with tox's configuration.

  2. Install tox-gh-actions package in the GitHub Actions workflow before running tox command.

Examples

Basic Example

The following configuration will create 4 jobs when running the workflow on GitHub Actions.

  • On Python 3.7 job, tox runs py37 environment
  • On Python 3.8 job, tox runs py38 environment
  • On Python 3.9 job, tox runs py39 environment
  • On Python 3.10 job, tox runs py310 and mypy environments

tox-gh-actions Configuration

Add [gh-actions] section to the same file as tox's configuration.

If you're using tox.ini:

[tox]
envlist = py37, py38, py39, py310, mypy

[gh-actions]
python =
    3.7: py37
    3.8: py38
    3.9: py39
    3.10: py310, mypy

[testenv]
...

If you're using setup.cfg:

[tox:tox]
envlist = py37, py38, py39, py310, mypy

[gh-actions]
python =
    3.7: py37
    3.8: py38
    3.9: py39
    3.10: py310, mypy

[testenv]
...

If you're using pyproject.toml:

[tool.tox]
legacy_tox_ini = """
[tox]
envlist = py37, py38, py39, py310, mypy

[gh-actions]
python =
    3.7: py37
    3.8: py38
    3.9: py39
    3.10: py310, mypy

[testenv]
"""

Workflow Configuration

.github/workflows/<workflow>.yml:

name: Python package

on:
  - push
  - pull_request

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.7', '3.8', '3.9', '3.10']

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      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

Advanced Examples

Factor-Conditional Settings: Python Version

The following configuration will create 2 jobs when running the workflow on GitHub Actions.

  • On Python 3.7 job, tox runs py37-django22 and py37-django32 environments
  • On Python 3.8 job, tox runs py38-django32 environment

tox.ini:

[tox]
envlist = py37-django{22,32}, py38-django32

[gh-actions]
python =
    3.7: py37
    3.8: py38

[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.9, 3.10.0-beta.3]
...

tox.ini:

[tox]
envlist = py39, py310

[gh-actions]
python =
    3.9: py39
    3.10: py310
    # The following won't work
    # 3.10-beta.3: py310
    # 3.10-dev: py310

[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 = py37, py38, pypy3, pyston38

[gh-actions]
python =
    3.7: py37
    3.8: py38, mypy
    pypy-3.7: pypy3
    pyston-3.8: pyston38

[testenv]
...

[testenv:pyston38]
basepython = pyston38

You 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.8 and gh-actions.python has both 3 and 3.8, tox-gh-actions gets factors only from the key 3.8.

Changed in 3.0: pypy3 is not supported in the configuration anymore. Please use pypy-3 instead.

Factor-Conditional Settings: Environment Variable

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.8/ubuntu-latest job, tox runs py38-linux environment
  • On Python 3.9/ubuntu-latest job, tox runs py39-linux environment
  • 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.8', '3.9', '3.10']

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      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{38,39,310}-{linux,macos,windows}

[gh-actions]
python =
    3.8: py38
    3.9: py39
    3.10: py310

[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.

Overriding Environments to Run

Changed 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.

Versioning

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.

Understanding Behavior of tox-gh-actions

How tox-gh-actions Works

See ARCHITECTURE.md for more details.

Logging

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.

More Repositories

1

mypy-playground

The mypy playground. Try mypy with your web browser.
Python
69
star
2

kawasemi

A Python library for sending notifications to services such as Slack, HipChat, Twitter, and so on.
Python
50
star
3

wsgi_lineprof

WSGI middleware for line-by-line profiling
Python
49
star
4

lambda-dti

Interpreter of the ITGL with dynamic type inference
OCaml
21
star
5

python-gyazo

A Python wrapper for Gyazo API
Python
19
star
6

awesome-playgrounds

Curated list of playgrounds where you can test snippets online
12
star
7

portfolio

My portfolio website powered with React
TypeScript
10
star
8

mackerel-plugins

Custom plugins for Mackerel
Shell
8
star
9

gsrinfer

A type reconstruction algorithm implementation for the implicitly and gradually typed language with shift and reset
OCaml
7
star
10

cla-jwt-verifier

Simple HTTP server for verifying JWT issued by Cloudflare Access
Rust
7
star
11

python-gyazo-backup

A command-tool for creating backup of Gyazo
Python
7
star
12

dotfiles

My dotfiles
Shell
6
star
13

run-tox-gh-actions

(EXPERIMENTAL) A composite GitHub Actions run steps for running tox-gh-actions
5
star
14

sasm

Simple Assembler for SIMPLE Architecture
Python
4
star
15

hue-party

A joke script :)
Python
4
star
16

bottle-yotoslack

NO LONGER MAINTAINED: Send notifications to Slack when you received Yo!
Python
4
star
17

prom2bq

Copy data from Prometheus to BigQuery
Go
4
star
18

circleci-tex-sample

Perl
4
star
19

RTConnect

Tools for analyzing sales report files of iTunes Connect.
R
3
star
20

ochacaml

Unofficial fork of OchaCaml
3
star
21

spim-for-kuis

SPIM for Hardware and Software Laboratory Project 3 (Software) / 計算機科学実験及び演習3 (ソフトウェア)
C
3
star
22

pep-561-samples

Example packages for demonstrating usage of PEP 561
Python
3
star
23

homebrew-ymyzk

Homebrew formulae
Ruby
2
star
24

vim-copl

「プログラミング言語の基礎概念」演習システム用の syntax highlighting
Vim Script
2
star
25

meross-proxy

Wrap meross-iot with simple HTTP APIs for personal use
Python
2
star
26

lambda-rti

Interpreter of the ITGL with runtime type inference
OCaml
2
star
27

findme

Simple OS X command line tool for getting your location
Objective-C
2
star
28

co2meter_exporter

Prometheus exporter for CO2 meter
Python
2
star
29

yo.zsh

Send Yo! from Zsh
Shell
2
star
30

sensehat_exporter

Sense HAT exporter for Prometheus
Python
1
star
31

fj

Featherweight Java type checker
OCaml
1
star
32

pytconnect

Tools for analyzing sales report files of iTunes Connect.
1
star
33

firehook

Simple tool to link Google Assistant and smart home devices via Firebase
JavaScript
1
star
34

bme280_exporter

Prometheus exporter for BME280 sensor
Go
1
star
35

gsrchecker

A Type Checker for GTLC + shift/reset
OCaml
1
star
36

tex-to-gif

Convert a TeX document 📃 into an animation GIF 📺
Shell
1
star
37

gh-webhook-rd

Simple application that starts a job in Rundeck when receiving a webhook from GitHub
Go
1
star
38

pycon-jp-2016-type-hints

Python
1
star
39

homebridge-regza

JavaScript
1
star
40

tinyc

Tiny C Compiler written in Python 2
Python
1
star
41

docker-nginx

Customized Docker image for personal use (mainly for TLS termination, load balancer, reverse proxy)
Dockerfile
1
star