Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go のビルドキャッシュと GOCACHEPROG

Avatar for Yuki Hirasawa Yuki Hirasawa
September 16, 2025
360

Go のビルドキャッシュと GOCACHEPROG

Avatar for Yuki Hirasawa

Yuki Hirasawa

September 16, 2025
Tweet

Transcript

  1. © LayerX Inc. 2 2024 年 4 ⽉ ~ 株式会社

    LayerX バクラク事業部 共通管理開発チーム Software Engineer 平澤 雄基 (hira) ⾃⼰紹介 Go 歴は 4 年くらい 普段は、⻑野県からリモートで働いています Github: @hirasawayuki
  2. © LayerX Inc. 4 go env CACHE で出⼒されるディレクトリに保存されている - 00

    ~ ff まで 256 個のディレクトリがある - 各ディレクトリにはアクションエントリファイル(メタデータ)とキャッシュデータが 保存されている - アクションエントリファイル => -a がついたファイル - キャッシュデータ => -d がついたファイル Go のビルドキャッシュについて Go のビルドキャッシュについて
  3. © LayerX Inc. 5 ActionID をもとにキャッシュが存在するか チェックする ActionID - メタデータの識別⼦(-a

    より前の部分) - SHA256 でハッシュ化された⽂字列 - Go のバージョンや環境変数、オプションなどもハッシュの計算 に含まれる https://github.com/golang/go/blob/080882a928c96f997a1cb67cef40d2cc6 126ffcd/src/cmd/go/internal/work/exec.go#L255-L433 ビルドキャッシュの仕組み Go のビルドキャッシュについて ActionID 計算 メタデータが 存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes
  4. © LayerX Inc. 6 ビルドキャッシュの仕組み Go のビルドキャッシュについて ActionID 計算 メタデータが

    存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes メタデータがなかった場合 - ビルド結果をもとにハッシュ値(OutputID)を計算 - キャッシュは OutputID + -d という名前で保存 - メタデータを作成(OutputID を保存する) - ↓メタデータの中⾝ v1 <ActionID> <OutputID> <size> <timestamp>
  5. © LayerX Inc. 7 ビルドキャッシュの仕組み Go のビルドキャッシュについて ActionID 計算 メタデータが

    存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes メタデータあった場合 - ActionID をもとにメタデータを取得 - メタデータ内部にある OutputID を取得 - 取得した OutputID をもとにキャッシュを利⽤
  6. © LayerX Inc. 8 ビルドキャッシュの仕組み Go のビルドキャッシュについて ActionID 計算 メタデータが

    存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes メタデータありのケース - ActionID をもとにメタデータを取得 - メタデータ内部にある OutputID を取得 - 取得した OutputID をもとにキャッシュを利⽤ Go のキャッシュの実装は src/cmd/go/internal/cache 配下にあるの で、興味のある⽅はぜひ確認してみてください! https://github.com/golang/go/tree/master/src/cmd/go/internal/cache
  7. © LayerX Inc. 9 ‧Go1.24 で追加 ‧GOCACHEPROG 環境変数に実⾏コマンドを渡すことで go コマンドの⼦プロセ

    スとして起動 ‧キャッシュの処理を起動した⼦プロセスに委譲 GOCACHEPROG とは GOCACHEPROG の仕組み
  8. © LayerX Inc. 10 ‧標準⼊出⼒を利⽤した独⾃の JSON プロトコル で通信する - 3

    つのコマンドを使ってやり取りする - get: キャッシュ情報を返す - put: キャッシュデータを保存する - close: 終了を知らせる - リクエストやレスポンスは cacheprog.go に定義 GOCACHEPROG とは GOCACHEPROG の仕組み ActionID 計算 メタデータが 存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes
  9. © LayerX Inc. 11 ‧標準⼊出⼒を利⽤した独⾃の JSON プロトコル で通信する - 3

    つのコマンドを使ってやり取りする - get: キャッシュ情報を返す - put: キャッシュデータを保存する - close: 終了を知らせる - リクエストやレスポンスは cacheprog.go に定義 GOCACHEPROG とは GOCACHEPROG の仕組み ActionID 計算 メタデータが 存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes
  10. © LayerX Inc. 12 ‧標準⼊出⼒を利⽤した独⾃の JSON プロトコル で通信する - 3

    つのコマンドを使ってやり取りする - get: キャッシュ情報を返す - put: キャッシュデータを保存する - close: 終了を知らせる - リクエストやレスポンスは cacheprog.go に定義 GOCACHEPROG とは GOCACHEPROG の仕組み ActionID 計算 メタデータが 存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes
  11. © LayerX Inc. 13 ‧標準⼊出⼒を利⽤した独⾃の JSON プロトコル で通信する - 3

    つのコマンドを使ってやり取りする - get: キャッシュ情報を返す - put: キャッシュデータを保存する - close: 終了を知らせる - リクエストやレスポンスは cacheprog.go に定義 GOCACHEPROG とは GOCACHEPROG の仕組み ActionID 計算 メタデータが 存在する? OutputID 取得 ビルド処理 キャッシュ利⽤ OutputID 計算 キャッシュ保存 メタデータ保存 No Yes
  12. © LayerX Inc. 16 GOCACHEPROG の仕組み GOCACHEPROG の仕組み ‧get コマンド

    - リクエストで受け取った ActionID をもと にメタデータを取得する - レスポンスで OutputID とキャッシュの パスを返す
  13. © LayerX Inc. 17 GOCACHEPROG の仕組み GOCACHEPROG の仕組み ‧put コマンド

    - リクエストで受け取った ActionID OutputID Body をもとにメタデータ、 キャッシュを保存する - Body は Base64 の⽂字列で送信される
  14. © LayerX Inc. 18 GOCACHEPROG の仕組み GOCACHEPROG の仕組み ‧close コマンド

    - ビルド処理の終了 - レスポンスを返すことで go コマンドは終 了する
  15. © LayerX Inc. 19 GOCACHEPROG の仕組み GOCACHEPROG の仕組み 標準⼊出⼒を利⽤したシンプルなプロトコル -

    KnownCommands と get /put/close の3 つのコマンドを実装すれば OK - それ以外の実装は⾃由にカスタマイズ可 能 - (Go に依存しない設計なので、他の⾔語 で実装することも可能)
  16. © LayerX Inc. 20 リモートキャッシュ実装時の注意点 リモートキャッシュ実装時の注意点 ‧リモートキャッシュのダウンロード‧アップ ロードはまとめる & 圧縮する

    - GET は数千、⼤きいプロジェクトであれば 数万 のリクエストになる - キャッシュサイズは 1GB を超えることも - ネットワークの遅延がボトルネックに
  17. © LayerX Inc. 21 リモートキャッシュ実装時の注意点 リモートキャッシュ利⽤時の注意点 ‧GOCACHEPROG を実装すれば CI の実⾏時間

    が短縮されるわけではない - actions/cache + 標準キャッシュと仕組みはほぼ ⼀緒 - 圧縮アルゴリズムの選定、ネットワーク遅延の 最⼩化が重要