rcmdnk's blog

ACTION! (初回限定盤B)(DVD付)

GitHubで管理しているPythonのレポジトリで pytest を使ったテストなどを一括で管理する Actionを作った話。

python-action

Python Test Action · Actions · GitHub Marketplace

GitHub ActionsのActionで主に

  • レポジトリのcheckout
  • Pythonのインストール
  • Cacheの管理
  • Poetry環境のセットアップ
  • pytestの実行
  • coverageの表示
  • pre-commitによるチェック

を行うもの。

レポジトリのcheckoutやpythonのインストールなどは もし必要でなければ引数でオフにも出来ます。

また、poetryのレポジトリでない場合には setup-cmdのコマンドを変更してそのレポジトリ様のセットアップに変更もできます。

デフォルトではpoetry installでこれを単にrequirements.txtで管理しているならpip install .と変更するとか。

簡単な使い方

基本的には

  • poetryによる設定が書かれたレポジトリ。
  • pytestのテストファイルがtestsディレクトリにある。
  • .pre-commit-config.yamlにpre-commit設定がある。

という情況が基本設定。

簡単な使い方としては、 このような情況であれば簡単に以下のようなActionsのファイルを書くことで 環境の準備から

.github/workflows/test.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---
name: python test

on:
  push

jobs:
  permissions:
    contents: write
  runs-on: 'ubuntu-latest'
  steps:
    - uses: rcmdnk/python-action@v1
      with:
        python-version: 3.10
        coverage-push-condition: 1

のような感じで書けば、 pytestを実行して 以下で書いたようなcoverageの出力も含めて ジョブ概要とかに書き出してくれます。

複数のバージョンや環境で実行する

PythonのバージョンやOSなどを変えていくつかテストしたい場合には Coverageの結果をcoverageブランチに出力するものは一つにしたいので、 mainとなる組み合わせを指定する必要があります。

README には

  • os: [ubuntu-latest, macos-latest]
  • python-version: ["3.10", "3.9"]

なmatrixで計4つの組み合わせになりますが、 最初のstepで

  • os == 'ubuntu-latest'
  • python-version == '3.10'

になる時、かつbranchがmainの時にis_mainのフラッグを1にして coverage-pushに渡しています。

これで上の組み合わせのときだけcoverageをブランチに書いてそれ以外では書かないようになります。

上のREADMEの例ではpre-commitに関してもis_mainが1のときのみ実行するようにしています。 (場合によってはpython versionやosによってそれぞれでチェックしたほうが良い場合もあるので その場合は常に1に設定してください。)

これで各matrixの組み合わせ毎にpytestやpre-commitを実行してcoverageのまとめも含めて まとめを作ってくれます。

例:

chore(deps): lock file maintenance · rcmdnk/homebrew-file@fb0e124

Sponsored Links
Sponsored Links

« pyproject-pre-commit: Pythonプロジェクト用のpre-commit集 python-template: Pythonプロジェクト用GitHubレポジトリテンプレート »

}