2020/3/27追記
actions/cacheのドキュメントに、記事の内容をマージしてもらいました。
https://github.com/actions/cache/pull/124
前回記事のGithub Actionsで.NET CoreのCI/CDを行うから、ジョブの高速化を図るためactions/cacheを使ったらハマったのでメモ。
TL:DR
- CIの環境によっては、
~/.nuget/packages
に色々入っていることがある- 該当フォルダをそのままキャッシュすると、プロジェクトに関係ない余計なものまで含まれる
-
NUGET_PACKAGES
環境変数でNuGetキャッシュの場所を明示的に変更できる
現象
NuGetのキャッシュフォルダをキャッシュすることでdotnet restore
の時間を短縮しようと以下のようなキャッシュ処理を仕込んだ。
- uses: actions/cache@v1
with:
path: ~/.nuget/packages
key: nuget-${{ runner.os }}-${{ matrix.dotnet-version }} # ex. nuget-Linux-3.0.101
restore-keys: |
nuget-${{ runner.os }}-
するとPost actions/cache@v1
ステップ(キャッシュの保存処理)で、macos-latest
の場合のみ4分以上かかるようになってしまった。
Post job cleanup.
/usr/bin/tar -cz -f /Users/runner/runners/2.161.0/work/_temp/4b80b621-20e0-4bf0-a201-22501682c69b/cache.tgz -C /Users/runner/.nuget/packages .
[warning]Cache size of ~4347 MB (4557940930 B) is over the 400MB limit, not saving cache.
「~/.nuget/packages
がデカすぎるからキャッシュできない」と怒られる。
原因
Github Actionsのmacos-latest
ホストランナーには、標準でXamarinがインストールされている。
そのため、~/.nuget/packages
には、Xamarin関係のパッケージが起動時点で入っていることになる。
これらのパッケージまで含めてキャッシュしようとして、キャッシュサイズの上限(400MB)に引っかかっている模様。
actions/cacheのissueにも報告されている。
解決策
NuGetのパッケージをキャッシュするフォルダを明示的に指定する。
環境変数NUGET_PACKAGES
にパスを指定することで、そのパスにキャッシュしてくれるようになる。
env:
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages # これを指定
steps:
- uses: actions/cache@v1
with:
path: ${{ github.workspace }}/.nuget/packages # NUGET_PACKAGESと同じものを指定
key: nuget-${{ runner.os }}-${{ matrix.dotnet-version }}
restore-keys: |
nuget-${{ runner.os }}-
修正後の実行結果(いろいろワークフローを変えた後ですが……。)