GitHub ActionsでRustのincremental buildを使えるようにした
はじめに
自分がGitHubで公開しているRustプロジェクトのCIにかかる時間を短縮したかったので、rustcが生成するオブジェクトをキャッシュしてincremental buildが使えるようにした。当初は約3分かかっていたのが、incremental buildができるようにしてからは約50秒で終わるようになった。
参考文献
上記記事を参考にワークフローの設定を変更した。
.github/workflows/rust.yml
の編集
まずは@actions/cache
が必要になる。このアクションはパターンに該当するパスのファイルを一つにまとめて圧縮してからどこかのデータストアに保存するようである。
@actions/cache
のexampleにあるYAMLをそのままコピーしただけだが、下のように追記した。
ここで、key
という値を設定しているが、これはキャッシュの取得・保存を行う際に必要になる。一連のオブジェクトファイルを特定するためにロックファイルCargo.lock
のハッシュ値をキーの一部に含める。したがって、Cargo.lock
がリポジトリに存在しなければならない。
git-restore-mtime
の設定
上記の参考文献ではgit-restore-mtime
というスクリプトでファイルのmodified timeを生成することでincremental buildができるようにしていた。現在、このスクリプトはGitHub Actionsのアクションとして提供されている。
これを使うのは簡単で、@actions/cache
の前にuses
を宣言すれば良い。
さいごに
これでincremental buildが使えるようになるが、初回ビルドではキャッシュが存在しないのでワークフローの実行に時間がかかる。2回目以降はキャッシュをダウンロードして展開するため実行時間が短縮される。
なお、@actions/cache
のREADMEによればデータストアの容量は一つのリポジトリに対して5GBである。Rustでは小さなプログラムでも100MBほどのオブジェクトを生成し、大きなプログラムになると1GBを超えることもある。他にもキャッシュを使う場合は溢れるかもしれない。
また、一週間利用されていないキャッシュは削除されるようである。