[GitHub Actions]テスト用Workflowが環境依存で失敗する状況にセルフホストを使わずにPipfileで対処してみた[Pipenv]

テストケースは依存していないものの、Pipfile上では依存しているライブラリが標準ランナーにあり、且つセルフホストを使うにも維持コストが割にあわない対策として、CI用Pipfileを用意してみました。
2020.07.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

GitHub Actions上でテスト用Workflowを動かしたものの、依存するライブラリが標準ランナーに入っていない為に失敗するケースがありました。セルフホストにて動作させることも考えましたが、テストコードが失敗の要因となるライブラリに依存していない場合は最適解とは言い難いかもしれません。

pipenv利用の前提にて、今回の該当ライブラリpycurlをdev-packagesに含めていないという条件下にて、テスト用Workflowを動かした方法を備忘録としてまとめてみました。

pycurlの依存関係

pycurlをActionsの標準ランナーでインストールしようとすると、以下のエラーが発生して失敗します。

FileNotFoundError: [Errno 2] No such file or directory: 'curl-config': 'curl-config'

これは標準ランナーにlibssl-devが入っていないことによって発生する状況です。インストールされているライブラリについては以下のリポジトリを参照してください。

テスト用のPipfileを用意する

Pipfile内で除外することを検討しましたが、設定されている時点でインストール対象です。dev-packagesに含まれているのであれば--devオプションを外す事で凌げますが本末転倒になります。

pipenvは環境変数にてファイル名を指定することで、利用する設定ファイル名を変更することができます。今回はこれを利用してみました。

export PIPENV_PIPFILE=TestPipfile

テストに用いるライブラリだけ追加します。ただ、この状態でpipenv syncを実行すると次のエラーになります。

ERROR: Pipfile.lock not found! You need to run $ pipenv lock before you can continue.

このエラーメッセージをみると、利用する筈のPipfile.lockがなくてエラーになっていると読み取れそうですが、実際にはPIPENV_PIPFILEで指定したファイル名でのlockファイル(TestPipfile.lock)が存在しないことによるものです。

そこで、すでにlockが存在している場合でも再度lockします。

% pipenv lock
Locking [dev-packages] dependencies…
✔ Success!
Locking [packages] dependencies…
✔ Success!
Updated Pipfile.lock (ed271d)!

Pipfile.lockがアップデートされているような表記になりますが、正確にはTestPipfile.lockが生成されています。忘れずにコミットしておきましょう。

あとがき

pycurlに依存しているコードが実は既になくなっている、あるいは別のライブラリに置き換えても問題がなければ、同等の機能を持っていて且つ標準ランナーで動作するライブラリへの差し替えという手段をとるつもりでした。

今回のやり方は、CIの動作環境毎にPipfileが増えるという、管理する上では悩ましい状態になります。対策としてセルフホスト利用もありますが、ホストのメンテナンスという課題がでてきます。優先すべきことに合わせて、無理無駄のない選択肢を取るようにしましょう。

参考リンク