検索意図は「決める」ことです。bundle installrubygems 往復Git 源の複製 の二系統に分岐すると、国境越え RTT と 接続プール枯渇 でフラップしやすくなります。本稿は BUNDLE_JOBSBUNDLE_RETRYミラー連鎖vendor/cacheCI キャッシュ鍵Gemfile.lock 検収 を一枚の判断表に落とします。ホーム技術ブログ一覧購入ヘルプはログイン不要です。関連:Composer/Packagist マトリクスGradle・Maven CI キャッシュGit・npm・brew ミラー最適化

シナリオとボトルネック(二系統取得・タイムアウト・ロック一貫性)

.gem 取得と git: 源は 律速が別 です。前者は HTTP 並列とミラー、後者は clone と認証。同一出口で BUNDLE_JOBS×パイプライン並列NAT 上限 を超えるとタイムアウトが断続します。

Gemfile.lock はコミット単位の契約。Bundler 版・PLATFORMS・意図しない update が混ざると 同じ SHA でも CI だけ解決が変わります。まず系統を切り分けてから数値を当てます。

  • 判断①:遅いのは Fetching gem metadataFetching source index か。前者は rubygems/ミラー、後者は インデックス鮮度 or プロキシ を疑う。
  • 判断②:ログに Git error が多いなら git 源を優先 して GIT_TERMINAL_PROMPT=0・浅複製・トークン形式を固定する。
  • 判断③bundle install 後に lock が汚れるなら bundle lock --checkマージ必須ゲート に入れる。

並列と接続プール:BUNDLE_JOBSBUNDLE_RETRY・失敗再試行しきい値

BUNDLE_JOBS1 回の install 内 の並列。帯域と相手の接続制限 が先に効くことが多いです。BUNDLE_RETRY は揺らぎへの再試行。CI の retry: と併用するなら timeout と整合させます。

Runner 想定BUNDLE_JOBS 初期値BUNDLE_RETRYCI retry 回数(目安)指数バックオフ上限(目安)
4 vCPU・単一パイプライン3〜430〜18〜16 秒×3 回
8 vCPU・帯域余裕6〜831同上
同一出口に並列パイプライン 3+過大(例 16)3パイプライン側を 1〜2 に制限16〜32 秒まで延長可
git 源が主(大規模 monorepo)2〜431〜2clone 失敗はジョブ単位で再実行
環境変数とコマンド例(bash)
export BUNDLE_JOBS=4
export BUNDLE_RETRY=3
export GIT_TERMINAL_PROMPT=0
# 例: GitHub HTTPS(トークンは CI シークレットへ。実際の変数名に合わせて置換)
export BUNDLE_GIT__GITHUB__COM="x-access-token:${GITHUB_TOKEN}"

bundle config set --local deployment 'true'
bundle config set --local path 'vendor/bundle'
bundle lock --check
bundle install --jobs "${BUNDLE_JOBS}" --retry "${BUNDLE_RETRY}"

国境越えミラーと Git 源戦略(rubygems・社内・GitHub)

国境越えでは ミラー or 社内キャッシュ が本体になりがちです。bundle config set mirror.https://rubygems.org … で取得元を固定し、障害時の切替 を Runbook に残します。

経路設定の核向くチーム注意
本家 rubygems既定のままRunner が近接リージョン429/帯域で不安なら下の行へ
地域/企業ミラーmirror.https://rubygems.org跨境メインインデックス遅延で checksum 問題が出たら鮮度調査
GitHub HTTPSBUNDLE_GIT__GITHUB__COM または netrcprivate fork/org gemトークン期限・スコープ・IP 許可
Git SSHGIT_SSH_COMMAND・known_hostsdeploy key 運用並列 clone で ssh-agent 競合に注意
ミラー登録と Git 浅複製の例
bundle config set --global mirror.https://rubygems.org https://gems.example.com
# 浅複製で git gem の転送量を抑える(リポジトリポリシーに合わせる)
export GIT_DEPTH=1
git config --global fetch.depth 1

bundle install --jobs 4 --retry 3

Gemfile.lock のドリフトと vendor/cache・CI キャッシュ鍵

キャッシュキーは Gemfile.lock ハッシュ+Ruby 版 を必須に。vendor/bundlevendor/cache 同梱かは リポサイズと監査 のトレードオフで決めます。

方式正とするディレクトリCI キャッシュキーに含めるものメモ
vendor/bundle のみvendor/bundlehashFiles('Gemfile.lock') + Ruby + Bundlerシンプル。複数ジョブで共有する場合はファイルロック競合に注意
package 同梱vendor/cache + locklock + vendor/cache の指紋外向き不安定環境で強い
Bundler グローバルキャッシュ$BUNDLE_USER_HOME 配下lock + bundler 版ディスク掃除ポリシーが別途必要
Gemfile.lock 一貫性・検収チェックリスト(マージ前)
  • ruby -v と CI のセットアップが パッチレベルまで 揃っている。
  • Gemfile.lockPLATFORMSCI のプラットフォーム が含まれる(必要なら bundle lock --add-platform)。
  • BUNDLED WITH と CI の bundle -v が一致、または gem install bundler -v で揃えた。
  • bundle lock --check が緑。bundle install --deployment(または --frozen)で 勝手な更新が無い
  • vendor/cache を使う場合、不足 .gem が無い ことを bundle install --local --deployment で確認済み。
# 検収(ローカル/CI いずれも)
bundle lock --check
bundle install --deployment --jobs 4 --retry 3

# オフライン寄せの更新フロー例
bundle package --all
# vendor/cache をコミット後、CI では
bundle install --local --deployment --jobs 4 --retry 3

FAQ

BUNDLE_JOBS を上げても速くならない

git 源や TLS の遅延が支配的な可能性があります。4 前後へ下げ、ミラー命中と浅複製を先に直し、ログでどの URL が律速かを切り分けます。

CI だけ Gemfile.lock が変わる

プラットフォーム行と Bundler 版の差が典型です。開発機で lock を再生成してコミットする運用にし、CI で bundle update を暗黙に走らせないようにします。

git 源 gem が認証で落ちる

BUNDLE_GIT__*__COM のホストエスケープ、トークン期限、SSH の known_hosts を確認し、HTTPS と SSH を混在させない運用が安全です。

まとめrubygems と git で律速を分け、BUNDLE_JOBSBUNDLE_RETRY×パイプライン並列を出口に合わせる。lock+Ruby+Bundler でキャッシュ鍵を切り、bundle lock --check で漂移を弾く。Runner に近いリージョンのリモート Mac なら RTT と再現性を同時に改善しやすいです。ホーム購入ヘルプブログ一覧はログイン不要範囲から進められます。

Bundler × リモート Mac CI

国境越えでも bundle install を決め切るなら、ノードと変数をセットで

ヘルプセンター購入ページホームはログイン不要で閲覧できる範囲です。関連記事は技術ブログ一覧からどうぞ。