GitHub Actions のキャッシュ容量の上限は 400MB(なので wkhtmltopdf-binary を入れていると厳しい)

注意事項

  • 2020/01/06 時点での話です
  • 単一実行時のキャッシュの話です

状況

GitHub Actions で bundle install した gem のキャッシュが保存できるようになったので喜んで使っていたのですが、とある日にログを見たところ、以下のような表示が出ていました。キャッシュ容量の上限の 400MB を超えている、との警告です。

 [warning]Cache size of ~526 MB (551997667 B) is over the 400MB limit, not saving cache.

gyazo.com

何がそんなに容量を喰っているのか

gem の総容量が 400MB を超えるなんて普通ではどう考えてもありえません。何がそんなに容量を喰っているのかを以下のように調べました。

$ sudo du -sh vendor/bundle/ruby/2.6.0/gems/*
(一部省略しています)
 2.3M   vendor/bundle/ruby/2.6.0/gems/capybara-3.29.0
 6.8M   vendor/bundle/ruby/2.6.0/gems/ffi-1.11.3
 1.0M   vendor/bundle/ruby/2.6.0/gems/json-2.3.0
 3.8M   vendor/bundle/ruby/2.6.0/gems/mail-2.7.1
 2.4M   vendor/bundle/ruby/2.6.0/gems/mimemagic-0.3.3
 5.5M   vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.7
 239M   vendor/bundle/ruby/2.6.0/gems/wkhtmltopdf-binary-0.12.5

wkhtmltopdf-binary が 239MB も喰っていた

なんと wkhtmltopdf-binary が 239MB も喰っていました。0.12.5 が 239MB であり、0.12.4 が 125MB です。この 2つ が入っているだけで 364MB を喰います。

wkhtmltopdf-binary が具体的にどのような構成になっているかは次のとおりです。リポジトリを直接見ても分かります

$ cd vendor/bundle/ruby/2.7.0/gems/wkhtmltopdf-binary-0.12.5/bin
$ ls -la
.rwxr-xr-x 1.4k foobar  2 1 23:46 wkhtmltopdf
.rw-r--r--    0 foobar  2 1 23:46 wkhtmltopdf-binary.rb
.rwxr-xr-x  14M foobar  2 1 23:46 wkhtmltopdf_centos_6_amd64.gz
.rwxr-xr-x  14M foobar  2 1 23:46 wkhtmltopdf_centos_6_i386.gz
.rwxr-xr-x  14M foobar  2 1 23:46 wkhtmltopdf_centos_7_amd64.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_centos_7_i386.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_debian_8_amd64.gz
.rwxr-xr-x  16M foobar  2 1 23:46 wkhtmltopdf_debian_8_i386.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_debian_9_amd64.gz
.rwxr-xr-x  16M foobar  2 1 23:46 wkhtmltopdf_debian_9_i386.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_macos_carbon.gz
.rwxr-xr-x  16M foobar  2 1 23:46 wkhtmltopdf_macos_cocoa.gz
.rwxr-xr-x  14M foobar  2 1 23:46 wkhtmltopdf_ubuntu_14.04_amd64.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_ubuntu_14.04_i386.gz
.rwxr-xr-x  15M foobar  2 1 23:46 wkhtmltopdf_ubuntu_16.04_amd64.gz
.rwxr-xr-x  16M foobar  2 1 23:46 wkhtmltopdf_ubuntu_16.04_i386.gz
.rwxr-xr-x  16M foobar  2 1 23:46 wkhtmltopdf_ubuntu_18.04_amd64.gz
.rwxr-xr-x  17M foobar  2 1 23:46 wkhtmltopdf_ubuntu_18.04_i386.gz

なんと、各種プラットフォームおよびバージョンを網羅したバイナリが入っていました。

wkhtmltopdf-binary gem を使わないようにする

さすがにここまでだとつらいので、wkhtmltopdf-binary gem を使わない方向で行きたいです。そのためにはもちろん、各々の環境に対して適切な wkhtmltopdf のバイナリをインストールすればよいことになります。

あるいは、wkhtmltopdf-binary を使うこと前提でなんとかする

とはいえ、wkhtmltopdf-binaryGemfile に書いてあとはそれを bundle install するだけで良いという環境は魅惑的です。「GitHub Actions のキャッシュ容量上限に引っかかるから」という理由だけで wkhtmltopdf-binary を使わなというのも考えものです。なので、wkhtmltopdf-binary を使いつつ GitHub Actions のキャッシュ容量上限に引っかからないようにすることを考えてみます。

方法の一つとしては、GitHub Actions 上では wkhtmltopdf-binary のキャッシュを保存しないようにするという方法があります。キャッシュ保存前に $ rm -rf vendor/bundle/ruby/2.7.0/gems/wkhtmltopdf-binary-0.12.5 などと該当ディレクトリを削除します。

別の方法としては、GitHub Actions 上では wkhtmltopdf-binary をインストールしない、という方法があります。しかしながらこの方法は、Gemfile.lock の整合性の維持が難しいと思いますので*1、現実的ではないと思います。

他にも方法はあるかもしれません。

*1:不可能ではないと思いますが

Powered by はてなブログ