Github actionでvenv環境をキャッシュする

これまで、PythonのプロジェクトでGithub Actionを使うとき、こんな感じで仮想環境ごとキャッシュしていました。

# 仮想環境を作成
  - name: Create venv
    run: |
      python3 -m venv .venv

  # 仮想環境をキャッシュから復元
  - name: Cache venv dependencies
    uses: actions/cache@v1
    with:
      path: .venv
      key: venv-${{ runner.os }}-${{ hashFiles('requirements.txt') }}
      restore-keys: |
        ${{ runner.os }}-venv-

破局

しかし、先日、こんな感じでエラーが出るようになってしまいました。

/home/runner/work/_temp/eeef70b5-c170-4f26-b881-a730c4e3ea5f.sh: line 1: .venv/bin/python: No such file or directory
##[error]Process completed with exit code 127.

これまで、Github ActionのPython3.8環境ではPython3.8.3が動いていたんですが、それがPython 3.8.5に更新され、3.8.3は削除されてしまったようです。キャッシュしてある仮想環境では、ふるいPython3.8.3を参照しているので、エラーになってしまいます。

復活

今後もPythonの実行環境は自動的に更新されるでしょうし、ファイルのパスなども変更される可能性もないわけではありません。

そこで、Pythonの実行ファイル名をファイルに出力し、このファイルもキャッシュのキー値として指定するようにしました。こうしておけば、Pythonのバージョンが変わったら自動的にキャッシュも再構築されます。

# Pythonのファイル名を出力
  - name: Save Python path
    run: |
      which python3 > python3_path.txt

  # 仮想環境を作成
  - name: Create venv
    run: |
      python3 -m venv .venv

  # 仮想環境をキャッシュから復元
  - name: Cache venv dependencies
    uses: actions/cache@v1
    with:
      path: .venv
      key: venv-${{ runner.os }}-${{ hashFiles('requirements.txt', 'python3_path.txt') }}
      restore-keys: |
        ${{ runner.os }}-venv-