GitHub Actionsでtoxのマトリックスビルドを実行する

Djangoフレームワークに依存しているライブラリを作っていると、複数のPythonバージョンとDjangoバージョンの組合せでテストを実行したくなります。

ローカルでvenvを使って複数の環境でテストするのはtoxを使ってできます。

GitHub上でホストしているOSSでは、このtoxによるマトリックスビルドをしばらく前までは、TravisCIで簡単にできていたのですが、TravisCIは無料版が終了してしまったので、GitHub Actionsに移行することにしました。

Using a build matrix for your jobs - GitHub Docs

GitHub Actionsにもマトリックスの機能自体はあるのですが、DjangoバージョンによってサポートしているPythonバージョンが異なるため、組合せが単純ではなく、どのように設定するとスマートかなーと悩んでました。

django-ftpserver のenvlist。Django2.2~4.0までに対応したPythonのバージョンのマトリックスでテストをしています。

[tox]
envlist =
  py36-dj22,
  py36-dj30,
  py36-dj31,
  py36-dj32,
  py37-dj22,
  py37-dj30,
  py37-dj31,
  py37-dj32,
  py38-dj22,
  py38-dj30,
  py38-dj31,
  py38-dj32,
  py38-dj40,
  py39-dj22,
  py39-dj30,
  py39-dj31,
  py39-dj32,
  py39-dj40,
  py310-dj32,
  py310-dj40,
  coverage,
  flake8

これをGitHub Actionsのワークフローに綺麗に展開するのはどうするといいか、と悩んでいたところ、tox-gh-actionsというtoxのプラグインパッケージを見つけて、便利そうだったので使わせてもらうことにしました。

tox-gh-actions

tox-gh-actions · PyPI

このパッケージを利用することで、toxのenvlistをある程度まとめた形でワークフローのジョブに展開してくれます。

tox.iniに追記したtox-gh-actionsの設定:

[gh-actions]
python =
    3.6: py36
    3.7: py37
    3.8: py38
    3.9: py39
    3.10: py310, coverage, flake8

GitHub Actionsのワークフロー定義 .github/workflows/tests.yml :

name: Tests

on:
  - push
  - pull_request

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

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

実行結果

Pythonバージョンごとにtox.iniのgh-actionsで設定した環境のテストが実行されています。

f:id:nullpobug:20220227143312p:plain