コンテンツにスキップ
use-cases / ci-cache-without-s3 / hero
FILES · キャッシュ · コスト最適化

S3 の請求項目にならない CI キャッシュ

ほとんどの CI パイプラインはキャッシュトラフィックでお金を燃やします。アーティファクトを S3 にプッシュし、次のジョブで取り戻し、ストレージに支払い、エグレスに支払い、ランナーがリージョンを移動するときにまた支払います。Hoody ではキャッシュは、ビルドコンテナを実行するのと同じベアメタル上のフォルダーです。curl で tarball をプッシュ。curl で取得。バイトはサーバーから出ていきません。

Files API を読む
use-cases / ci-cache-without-s3 / mechanism

3 つの curl と 1 つの cron

CI キャッシュ全体は 3 つのコマンドと 1 つのクリーンアップジョブです。tarball を書くために PUT。読むために GET。プルーンに find -atime。4 つ目はありません。IAM ポリシーも、バケットライフサイクルも、署名付き URL の儀式もありません。

WRITE

圧縮して PUT

インストール後、ランナーは node_modules を tar | zstd でストリームし、/files/cache に対する 1 回の PUT に流し込みます。Hoody はボディを 1 つのバイナリ blob としてディスクに書き込みます。マルチパートも、パートアップローダーも、SDK もありません。

# yarn install の後、アーティファクトをプッシュtar c node_modules | zstd -T0 | curl -T - https://files.containers.hoody.com/cache/$KEY.tar.zst
READ

GET して untar

次のジョブの最初のステップは 1 回の curl です。ボディは NVMe からラインレートで出てきます。キャッシュがランナーと同じ物理サーバーに住んでいるからです。エグレスホップも、クロス AZ プルも、CloudFront エッジもありません。

# 次のジョブ: 1 行で取得して untarcurl -fsS https://files.containers.hoody.com/cache/$KEY.tar.zst | tar x -I zstd
PRUNE

find -atime · 夜間

Hoody Cron が夜に 1 回起動します。find /files/cache -atime +30 -delete が、1 か月読まれていないものを捨てます。保持ポリシーも、Glacier 階層も、保守する lifecycle JSON もありません。

# 夜間 cron — 30 日読まれていないものはなくなるfind /files/cache -atime +30 -delete

PUT が書き、GET が読み、find がプルーンします。Hoody Files API はキャッシュサーバーであり、クリーンアップエンジンであり、監査ログでもあります。すべて同じ /files/[path] URL の裏側で。

use-cases / ci-cache-without-s3 / powers

フォルダーとしてのキャッシュの 3 つの力

ストレージが希少だった頃は、キャッシュを別のベンダーに送り出すのは理にかなっていました。ベアメタルコンテナでは、ベンダーが 1 つ増えるだけです。

経済性

GB 月もエグレスもリクエストもない

S3 は 3 つのメーターで課金します。ストレージ、エグレス、リクエストごと。Hoody Files はコンテナに含まれます。すでに支払っているディスクが、キャッシュが乗るディスクです。バイトは課金境界を越えません。

レイテンシ

クロスリージョンではなく NVMe

読み取りはビルドを実行するのと同じ物理サーバーから来ます。解決する S3 エンドポイントも、リージョンへの TLS ハンドシェイクも、プレフィックスのスループットレート制限もありません。1.4 GB の Rust ターゲットは数秒で展開されます。

オーナーシップ

ベンダー関係は 2 つではなく 1 つ

ランナーとキャッシュは同じインスタンスに住み、同じ請求書で課金され、同じ SSH セッションでデバッグされます。コンテナをオフにすると、キャッシュはディスクイメージです。起動した瞬間に再びオンラインです。

use-cases / ci-cache-without-s3 / invoice

請求書から消えるもの

典型的な中規模の CI フットプリントは、1 か月あたり約 1.4 TB のキャッシュトラフィックを移動させます。AWS で構築する明細と、Hoody で構築する明細はこちらです。

BEFORE · S3 請求書今月、AWS で
  • ストレージ · GB 月$1.0947.2 GB × $0.023
  • エグレス · GB 出力$127.801.42 TB × $0.090
  • PUT リクエスト$2.0641.2 万 × $5/M
  • GET リクエスト$4.561140 万 × $0.40/M
  • CloudFront / NAT−$57.71クロス AZ プル
月額合計$78
5 明細 · 5 レート · 1 バケット
AFTER · HOODY FILES今月、Hoody で
  • コンテナのディスクno extra chargeコンテナプランで支払い済み
  • ジョブ間のエグレスno extra chargeループバック · サーバーに留まる
  • PUT / GET リクエストno per-request or per-GB meterリクエストごとのメーターなし
  • ベンダー関係no extra chargeランナーとキャッシュは 1 つの請求書
  • 47.2 GB 使用プランのコンテナを実行するのと同じディスクからのヘッドルーム
月額合計included in server price
1 ディスク · 1 請求書 · 新しいベンダーゼロ

ビルドを実行するサーバーにキャッシュが住むと、S3 が動かしていたメーターには読むものがありません。明細は動きません。課金するトランザクションがないからです。

use-cases / ci-cache-without-s3 / capacity

Files エンドポイントが保証するもの

Hoody Files は薄いラッパーではありません。ハッシュ、履歴、レンジリード、監査ジャーナルを備えた本物の永続化バックエンドです。CI キャッシュは実際に公開されているもののごく一部を使います。

  1. 1 つの URL · どんなアーティファクトも/files/[path]

    PUT で書き、GET で読み、HEAD で ETag と Content-Length、?hash で SHA256、?stat でメタデータ。キャッシュはログ、ビルド、共有アーティファクトを支えるのと同じエンドポイントファミリーです。

  2. タイムトラベル読み取り?at · ?revision

    すべての書き込みはファイルジャーナルを通ります。タイムスタンプまたはパスごとのリビジョン番号で昨日のキャッシュを取得できます。フレークのデバッグに別のスナップショットツールが要らなくなります。

  3. 外に出るときマウント60+ バックエンド

    もしキャッシュが本当に S3、B2、Drive フォルダーに住む必要があるなら、バックエンドとしてマウントして同じ /files/[path] URL を維持できます。ランナーコードは変わりません。キャッシュが移るだけです。

数字は公開された Hoody Files API の表面を反映しています。`GET/PUT/HEAD/PATCH /api/v1/files/[path]`、`?hash`/`?stat`/`?at`/`?revision`/`?history` クエリパラメーター、`/api/v1/journal` 配下のファイルジャーナルエンドポイント。

use-cases / ci-cache-without-s3 / punchline

CI キャッシュは別のベンダーであることをやめます。それは、すでにレンタルしているサーバー上のフォルダーです。

昨日 · 5 つのレート今日 · 1 つのディスク
古い請求書にあったものS3 バケット + エグレス + リクエスト + ライフサイクル5 明細 · 別の IAM · 別のベンダー
今ではこうPUT /files/cache/$KEY · GET /files/cache/$KEY2 つの curl — そしてキャッシュはランナー自身のディスク
Files 仕様を読む
use-cases / ci-cache-without-s3 / replaces

これが置き換えるもの

標準的な手近なキャッシュバックエンドはそれぞれ、ベンダー関係、エグレス請求、ビルドごとの料金を取ります。/files はそのどれも取りません。

  • AWS S3 バケットをキャッシュにストレージ、エグレス、リクエスト — 2 日保管する tarball に対して 3 つのメーター
  • GitHub Actions cache10 GB まで無料、その後 GB ごとの料金、調整できない 7 日エビクション
  • BuildJet cacheどうせランナーの外に住むストレージのランナーごと価格
  • Bazel リモートキャッシュサービスもう 1 つのデーモンと、面倒を見るキャッシュプロトコル
  • Turborepo Remote Cachemonorepo がすでに生成した tarball に対するビルドごと価格
  • Earthly Cloud cachecurl + tar に過ぎないものに対するマネージドリモートバックエンド
use-cases / ci-cache-without-s3 / cta

2 つ目のクラウドからキャッシュをレンタルするのをやめましょう。すでに支払っているディスクに tarball を書き、それを curl で取り戻しましょう。

Files API を読む
use-cases / ci-cache-without-s3 / related

他のユースケースを読む