ツール

【GitHub】ActionsのセルフホストランナーでPythonのセットアップがエラーになる

先日、GitHub の Actions(アクション)を使ってみようという動きがあり、そこでサーバレスアプリを管理してみることになりました。

Actions では、CI/CD に該当する機能を GitHub Actions がホストする環境でやってくれるので、こちらが何か特別なものを用意する必要はありません。

しかし、デプロイ先がクラウド環境(GCP や AWS など)の場合は、CI/CD 環境も素直にそこを使った方が効率が良さそうです。

また費用面も考える必要があるので、GitHub Actions のビルド費用と、セルフホストランナーの運用費(例えば AWS の EC2 やその他サービスを使った費用)を比較してみて、どちらを選択するかを検討してみる必要がありますね。

今回、実際にセルフホストランナーを使ってみたのですが、Python のセットアップに失敗してしまったので調べてみました。

エラーの内容

git にプッシュした際に、Actions にはライブラリのインストールと lint をやらせているのですが、以下のエラーが出力されました。

Version 3.8 with arch x64 not found

The list of all available versions can be found here: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json

上記 URL のバージョンリスト(JSON)には 3.8.5 まで用意されていますが、3.8.5 や 3.x を指定しても結果は同じでした。

詳細は下記のサイトで確認ができます。

ちなみに、ビルドをするために設定した定義ファイルは以下のようなイメージです。
(一部抜粋)

ほぼ、公式のドキュメント通りですね。

原因を調査する

調べていくと、似たような状況をまとめている記事を発見しました。
(定番の Classmethod さん)

GitHub-hosted runner で用意されていない OS 環境というのが怪しいところです。その代替案にも言及されています。

Amazon Linuxなど、GitHub-hosted runnerで用意されていないOS環境(現在用意されているのはUbuntu、Mac、Windowsのみ)でjobを実行したい場合は、job内で任意のDockerイメージから起動したコンテナ上でCIを実施するという方法が考えられます。

上記の記事では、セルフホストランナーのディストリビューションが AmazonLinux、私が使っていたのが CentOS7.7 なので、どちらも Ubuntu ではありません。

Setup Pythonのドキュメント

公式の Setup Python のドキュメントを細かく見ていきましょう。

「Using setup-python with a self hosted runaner」の段落が該当しそうですね。

Python distributions are only available for the same environments that GitHub Actions hosted environments are available for.

If you are using an unsupported version of Ubuntu such as 19.04 or another Linux distribution such as Fedora, setup-python will not work.

Python ディストリビューションは、GitHub アクションがホストする環境が利用できるのと同じ環境でのみ利用できるとのこと。

19.04 などのサポートされていないバージョンの Ubuntu、または Fedora などの別の Linux ディストリビューションを使用している場合、setup-python は機能しないという内容に見受けられます。

また、「Using Python without setup-python」に、setup-python を使わない例もありますが、AmazonLinux も CentOS7.7 もデフォルトの Python が 2.7 とかなので、結局は何かしらセットアップが必要になります。今回は 3.8 が使いたいですしね。

どちらにしても、この方法は GitHub Actions では非推奨です。

The default version of Python in PATH vary between runners and can change unexpectedly so we recommend you always use setup-python.

Ubuntuで試してみる

ということで、Ubuntu の 19.04 より新しい、20.04 を使ってみましょうか。

20.04 は 2020 年に登場したのでまだ新しいですが、 LTS ですし、これからスタンダードになっていくでしょう。

っと思っていたら、そういう意味ではなくて、19.04 以降はまだサポートしていないということでした。

GitHub Actions Virtual Environments

ubuntu-latest or ubuntu-18.04

Ubuntu 20.04仮想環境は現在、プレビューとしてのみ提供されています。「ubuntu-latest」YAMLワークフローラベルは、引き続きUbuntu 18.04仮想環境を使用します。

よって、Ubuntu 18.04 で試してみます。OS とデフォルトの Python の情報は以下の通り。

どちらにしても、setup-python で動的に Python をセットアップするので、ここは 3.6.9 のままにしておきますか。

アップデートしたい場合は、下記で 3.8 にできると思います。

そういえば、CentOS の時は、下記の手順を試していないことに気付きました。

この設定なしでは Ubuntu でもダメだったので、今回はドキュメント通りにやってみましょう。

セルフホストランナーのサービスを再起動して、Actions でジョブを再実行したらうまくいきました。

一部抜粋しますが、/opt/hostedtoolcache に目的の Python バージョンが入ってそうです。

私の場合は、/opt/hostedtoolcache の設定をしていなかったので、もしかすると CentOS でも上手くいったのではないかと半信半疑です。

クラスメソッドさんの記事に書いてあったように、Ubuntu 以外のディストリビューションだと、上記の設定をしてもダメなのかもしれませんが。

CentOS でも再度確かめておきたいですね。