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の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で設定した環境のテストが実行されています。