GitHub Actions で開発中の Python を使ってテストを実行する


Python 3.10 もついに beta1 がリリースされ、いよいよ正式版のリリースの足音も徐々に聞こえてきました。
PEP-619 では以下のようにリリーススケジュールが設定されています。

  • 3.10.0 beta 2: Tuesday, 2021-05-25
  • 3.10.0 beta 3: Thursday, 2021-06-17
  • 3.10.0 beta 4: Saturday, 2021-07-10
  • 3.10.0 candidate 1: Monday, 2021-08-02
  • 3.10.0 candidate 2: Monday, 2021-09-06 (if necessary)
  • 3.10.0 final: Monday, 2021-10-04

beta1 が出たことにより、フィーチャーフリーズにより追加となる機能も確定したので、Python の開発としては 3.10 を安定させていくというフェーズに入っていくはずです。ここに対して僕らができることといえば、3.10 を使って CI を回していき、問題点をレポートしていくことですよね。

ということで、今回は GitHub Actions で開発中の (正式リリース前の) Python を使ったテスト方法についてご紹介します。

最新のβ版パッケージをインストールする

と前口上を述べたのですが、最新のβ版パッケージをインストールするのは非常にかんたんです。
GitHub Actions で Python をインストールする際に actions/setup-python を使っている方が多いと思いますが、なんとこの actions/setup-python はβ版のインストールに対応しているのです1

3.10 系の開発版をインストールする場合は python-version に '3.10-dev' と指定します。すると、自動的に最新の開発バージョンが選択され、インストールされます。

steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
  with:
    python-version: '3.10-dev'
- run: python my_script.py

流石に開発版オンリーでテストするひとはいないでしょうから、matrix build の指定に '3.10-dev' を加えると良いでしょう。

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10-dev']
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - run: python my_script.py

これだけで、秋にリリースされる 3.10 系でのテストができるので、お得な感じですね。

真の最新版を追いかける

しかし、もっとディープに Python の最新版を追いかけたいという方も世には多くいるはずです。そんなあなたは deadsnakes/action を使いましょう。

deadsnakes プロジェクトは新旧さまざまな Python の Ubuntu パッケージをビルドして提供しているプロジェクトです。開発環境の構築で使ったことがある方もいらっしゃると思います。

この deadsnakes プロジェクトは nightly build の Python パッケージも提供しており、さらに GitHub Actions 用のアクションも提供しているので、これを組み込むだけでかんたんに nightly build でテストができるようになります。

deadsnakes/action は、次のように actions/setup-python と組み合わせて使うことが推奨されています。

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9-dev, 3.10-dev]
    name: main
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        if: "!endsWith(matrix.python-version, '-dev')"
        with:
          python-version: ${{ matrix.python-version }}
      - uses: deadsnakes/[email protected]
        if: endsWith(matrix.python-version, '-dev')
        with:
          python-version: ${{ matrix.python-version }}
      - run: python --version --version && which python

-dev が末尾についている場合は deadsnakes/action が、それ以外の場合は actions/setup-python が利用されるように if 文で分岐します。

nightly build 版はベータ版がリリースされる前から(それこそアルファ版が出る前から)提供され続けているので、いまから 3.11 向けの CI を動かしてみると面白いかもしれませんね。すでに 3.11-dev として提供が開始されています。

まとめ

今回は開発版の Python をインストールする方法を 2種類を紹介しました。

  • actions/setup-python:
    • リリースされた開発版パッケージ (α版、β版) をインストールする
  • deadsnakes/action:
    • nightly build をインストールする

このふたつのうち、好みに合わせてお好きな方を使い分けると良さそうです。
開発中のバージョンで CI をしながら、Python 本体や関連ツールの不具合を見つけてバグ報告するというのも、OSS への貢献のひとつです 2。ぜひチャレンジしてみてください。


  1. README などには記載がないのですが、 Python 3.10 alphas? · Issue #150 · actions/setup-python というイシューのコメントで紹介されています。 

  2. たとえば 3.10.0b1 リリース直前には pytest が動かなくなる問題を見つけたりしました。すでに他の方にバグ報告されていたので、結果的に眺めていただけだったのですが、誰がかみつけてくれるだろう、と取りこぼすよりハッピーになれる気がします。