Test a Python package using tox#
This workflow makes it easy to map tox environments to GitHub Actions
jobs. To use this template, your repository will need to have a
tox.ini file.
jobs:
test:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
posargs: '-n 4'
envs: |
- linux: pep8
pytest: false
- macos: py310
- windows: py39-docs
libraries:
choco:
- graphviz
coverage: 'codecov'
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
Inputs#
A specification of tox environments must be passed to the envs
input. There are a number of other inputs. All of these inputs (except
submodules and working-directory) can also be specified under each tox environment to
overwrite the global value.
In the following example test1 will pass --arg-local to pytest,
while test2 will pass --arg-global to pytest,
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
posargs: '--arg-global'
envs: |
- linux: test1
posargs: '--arg-local'
- linux: test2
envs#
Array of tox environments to test. Required input.
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
envs: |
- <os>: <toxenv>
- <os>: <toxenv>
where <os> is the either linux, macos or windows, and
<toxenv> is the name of the tox environment to run.
Note: envs is a string and must be specified as a literal
block scalar using the |. (Without the |, it must also be valid
YAML.)
Example:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
envs: |
- linux: pep8
- linux: py39
- macos: py38-docs
name: build_docs
- windows: py310-conda
The name of the GitHub Actions job can be changed with the name
option as shown above. By default, name will be the name of the tox
environment.
If the Python version includes a t suffix, such as py313t, then
a free-threaded Python interpreter will be used.
libraries#
Additional packages to install using apt (only on Linux), brew and brew cask (only on macOS), and choco (only on Windows).
Global definition:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
libraries: |
apt:
- package1
- package2
brew:
- package3
brew-cask:
- package4
choco:
- package5
Note: libraries is a string and must be specified as a
literal block scalar using the |. (Without the |, it must also
be valid YAML.)
envs definition:
with:
envs: |
- linux: py39
libraries:
apt:
- package1
posargs#
Positional arguments for the {posargs} replacement in an underlying
test command within tox. Default is none.
toxdeps#
Additional tox dependencies. This string is included at the end of the
pip install command when installing tox. Default is none. For example,
to leverage the uv package manager you can specify
toxdeps: tox-uv to use the tox-uv plugin.
toxargs#
Positional arguments for tox. Default is none.
pytest#
Whether pytest is run by the tox environment. This determines if
additional pytest positional arguments should be passed to tox. These
arguments are to assist with saving test coverage reports. Default is
true.
pytest-results-summary#
Whether test results from pytest are shown in the
$GITHUB_STEP_SUMMARY.
Default is false.
This option has no effect if pytest is false.
coverage#
A space separated list of coverage providers to upload to, either
codecov or github. Default is to not upload coverage
reports.
See also, CODECOV_TOKEN secret.
This option has no effect if pytest is false.
conda#
Whether to test within a conda environment using tox-conda. Options
are 'auto' (default), 'true' and 'false'.
If 'auto', conda will be used if the tox environment names contains
“conda”. For example, 'auto' would enable conda for tox environments
named py39-conda, conda-test or even py38-secondary.
setenv#
A map of environment variables to be available when testing. Default is none.
Global definition:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
setenv: |
VAR1: test
VAR2: |
first line
seconds line
VAR3: testing
Note: setenv is a string and must be specified as a
literal block scalar using the |. (Without the |, it must also
be valid YAML.)
envs definition:
with:
envs: |
- linux: py39
setenv: |
VAR1: test
VAR2: |
first line
seconds line
VAR3: testing
display#
Whether to setup a headless display. This uses the
pyvista/setup-headless-display-action@v1 GitHub Action. Default is
false.
cache-path#
A list of files, directories, and wildcard patterns to cache and
restore. Passed to
actions/cache path input.
Optional.
In this example, during the core_test job the sample_data is
retrieved as usual and cached at the end of the job, however, during the
detailed_tests jobs the sample_data is restored from the cache:
jobs:
core_test:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
cache-path: sample_data/
cache-key: sample-${{ github.run_id }}
envs: |
- linux: py39
detailed_tests:
needs: [core_test]
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
cache-path: sample_data/
cache-key: sample-${{ github.run_id }}
envs: |
- macos: py39
- windows: py39
In this example, the particular set of sample_data and
processed_data needed for the job are restored from the cache if the
manifest file has not been modified. As the repository is not checked
out when calling the workflow, we need to find the hash of the files in
a separate job:
jobs:
setup:
runs-on: ubuntu-latest
outputs:
data-hash: ${{ steps.data-hash.outputs.hash }}
compressed-data-hash: ${{ steps.compressed-data-hash.outputs.hash }}
steps:
- uses: actions/checkout@v3
- id: data-hash
run: echo "hash=${{ hashFiles('**/data_urls.json') }}" >> $GITHUB_OUTPUT
- id: compressed-data-hash
run: echo "hash=${{ hashFiles('**/compressed_data_urls.json') }}" >> $GITHUB_OUTPUT
tests:
needs: [setup]
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
cache-path: |
sample_data/
processed_data/
envs: |
- linux: py39
cache-key: full-sample-${{ needs.setup.outputs.data-hash }}
- linux: py39-compressed
cache-key: compressed-sample-${{ needs.setup.outputs.compressed-data-hash }}
cache-key#
An explicit key for restoring and saving the cache. Passed to
actions/cache key input.
Optional.
cache-restore-keys#
An ordered list of keys to use for restoring the cache if no cache hit
occurred for key. Passed to
actions/cache
restore-keys input. Optional.
artifact-path#
A list of files, directories, and wildcard patterns to upload as
artifacts. Passed to actions/upload-artifact
path input. Optional.
It can be defined globally:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
artifact-path: path/output/bin/
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
artifact-path: |
path/output/bin/
path/output/test-results
!path/**/*.tmp
envs definition:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
envs: |
- windows: py39
artifact-path: |
path/output/bin/
path/output/test-results
!path/**/*.tmp
runs-on#
Choose an alternative image for the runner to use for each OS. By
default, linux is ubuntu-latest, macos is macos-latest
and windows is windows-latest. None, some or all OS images can
be specified, and the global value can be overridden in each
environment.
It can be defined globally:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
runs-on: |
linux: ubuntu-18.04
macos: macos-10.15
windows: windows-2022
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
runs-on: |
macos: macos-10.15
Note: runs-on is a string and must be specified as a
literal block scalar using the |. (Without the |, it must also
be valid YAML.)
envs definition:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
envs: |
- windows: py39
runs-on: windows-2022
default_python#
The version of Python to use if the tox environment name does not start
with py(2|3)[0-9]+ or python-version is not set for the tox
environment. Default is 3.x.
For example, a tox environment py39-docs will run on Python 3.9,
while a tox environment build_docs will refer to the value of
default_python. The default_python can also be defined within
envs, however, a Python version specified in the tox environment
name takes priority.
To force a particular Python version for a tox environment, the
python-version can be included in the definition of the specific
environment. The value of the python-version input will override
both the Python version in the tox environment name and any
default_python inputs. See
actions/setup-python
for a full list of supported values for python-version. In this
example, the development version of Python 3.11 and the PyPy
implementation of Python 3.9 will be tested:
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
envs: |
- linux: py311
python-version: '3.11-dev'
- linux: pypy39
python-version: 'pypy-3.9'
fail-fast#
Whether to cancel all in-progress jobs if any job fails. Default is
false.
timeout-minutes#
The maximum number of minutes to let a job run before GitHub
automatically cancels it. Default is 360.
submodules#
Whether to checkout submodules. Default is true.
working-directory#
The working directory for running tox, relative to the repository root.
Default is . (the repository root).
This is useful when your package is located in a subdirectory of the repository, such as in monorepos where multiple packages exist in the same repository, or when using a non-standard project layout.
uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1
with:
working-directory: packages/my-package
envs: |
- linux: py312
Secrets#
CODECOV_TOKEN#
If your repository is private, in order to upload to Codecov you need to
set the CODECOV_TOKEN environment variable or pass it as a secret to
the workflow.