Closed3

GitHub ActionsでRustのincremental buildを使えるようにした

Shotaro TsujiShotaro Tsuji

はじめに

自分がGitHubで公開しているRustプロジェクトのCIにかかる時間を短縮したかったので、rustcが生成するオブジェクトをキャッシュしてincremental buildが使えるようにした。当初は約3分かかっていたのが、incremental buildができるようにしてからは約50秒で終わるようになった。

参考文献

https://zenn.dev/kt3k/articles/d557cc874961ab
上記記事を参考にワークフローの設定を変更した。

Shotaro TsujiShotaro Tsuji

.github/workflows/rust.ymlの編集

まずは@actions/cacheが必要になる。このアクションはパターンに該当するパスのファイルを一つにまとめて圧縮してからどこかのデータストアに保存するようである。
https://github.com/marketplace/actions/cache

@actions/cacheのexampleにあるYAMLをそのままコピーしただけだが、下のように追記した。
https://github.com/ShotaroTsuji/mdplayscript/compare/e11230f..e74f9e5

ここで、keyという値を設定しているが、これはキャッシュの取得・保存を行う際に必要になる。一連のオブジェクトファイルを特定するためにロックファイルCargo.lockのハッシュ値をキーの一部に含める。したがって、Cargo.lockがリポジトリに存在しなければならない。

Shotaro TsujiShotaro Tsuji

git-restore-mtimeの設定

上記の参考文献ではgit-restore-mtimeというスクリプトでファイルのmodified timeを生成することでincremental buildができるようにしていた。現在、このスクリプトはGitHub Actionsのアクションとして提供されている。
https://github.com/marketplace/actions/git-restore-mtime

これを使うのは簡単で、@actions/cacheの前にusesを宣言すれば良い。
https://github.com/ShotaroTsuji/mdplayscript/commit/8508f8fe17f1067b98f666973324d9aae068a8d4#diff-73e17259d77e5fbef83b2bdbbe4dc40a912f807472287f7f45b77e0cbf78792d

さいごに

これでincremental buildが使えるようになるが、初回ビルドではキャッシュが存在しないのでワークフローの実行に時間がかかる。2回目以降はキャッシュをダウンロードして展開するため実行時間が短縮される。

なお、@actions/cacheのREADMEによればデータストアの容量は一つのリポジトリに対して5GBである。Rustでは小さなプログラムでも100MBほどのオブジェクトを生成し、大きなプログラムになると1GBを超えることもある。他にもキャッシュを使う場合は溢れるかもしれない。

また、一週間利用されていないキャッシュは削除されるようである。

このスクラップは2021/09/15にクローズされました