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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Yuki Hirasawa Yuki Hirasawa
September 16, 2025
430

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 + 標準キャッシュと仕組みはほぼ ⼀緒 - 圧縮アルゴリズムの選定、ネットワーク遅延の 最⼩化が重要