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

Python 3.10 もついに beta1 がリリースされ、いよいよ正式版のリリースの足音も徐々に聞こえてきました。
[PEP-619](https://www.python.org/dev/peps/pep-0619/) では以下のようにリリーススケジュールが設定されています。

* 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](https://github.com/actions/setup-python) を使っている方が多いと思いますが、なんとこの actions/setup-python はβ版のインストールに対応しているのです[^1]。

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

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](https://github.com/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/action@v2.1.1
        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]。ぜひチャレンジしてみてください。

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