sccache vs ccache:CI 向けのコンパイラキャッシュ
ccache は C/C++ 向けの長年使われてきたローカルコンパイラキャッシュです。sccache は共有/リモートストレージを追加し、Rust を含むより多くの言語をサポートします。
どちらもコンパイラの出力をキャッシュし、変更のないソースを再コンパイルしません。ccache は成熟しており、ローカルの C/C++ キャッシュに特化しています。sccache(Mozilla 製)はリモートストレージ(S3、GCS など)を利用でき、C/C++ に加えて Rust なども対応するため、ephemeral な CI runner に適しています。
| sccache | ccache | |
|---|---|---|
| 言語 | C/C++、Rust、その他 | C/C++(およびラッパー経由) |
| キャッシュの場所 | ローカルまたはリモート(S3/GCS など) | ローカルディスク |
| ephemeral な CI への適合 | 高い(共有リモートキャッシュ) | キャッシュの永続化が必要 |
| 成熟度 | 確立済み | 非常に成熟し、広く使われている |
| Rust サポート | あり | ネイティブには非対応 |
sccache が優れる場面
ephemeral な CI runner では、ローカルキャッシュは job 間で消えてしまいます。sccache は共有リモートバックエンド(S3/GCS)を指定でき、キャッシュヒットが runner や run をまたいで維持されます。また ccache がネイティブに扱わない Rust のコンパイルもキャッシュします。Rust の CI や分散 build には sccache が自然な選択です。
ccache が優れる場面
永続的なマシン上の C/C++、あるいはローカルのキャッシュディレクトリを保持できる環境では、ccache は極めて成熟しており、シンプルで高速、豊富な設定と長い実績を持ちます。リモートストレージや Rust が不要なら、ccache に勝るものはなかなかありません。
CI では
ccache では、CI の cache アクションでキャッシュディレクトリを永続化します(キーは toolchain + ソース)。sccache では、ephemeral な runner をまたいでヒットするようリモートバックエンドを設定します。いずれにせよ、コンパイラキャッシュは再 build の時間を大幅に削減できます。
結論
Rust、分散チーム、あるいは共有リモートキャッシュを必要とする ephemeral な runner には sccache を、永続的なマシン上での成熟でシンプルなローカル C/C++ キャッシュには ccache を使いましょう。どちらも繰り返しの build を大きく高速化します。