決策摘要:同時拉 RubyGemsGit 源 gem 時,請一次定案鏡像BUNDLE_JOBS/BUNDLE_RETRYvendor/cacheGemfile.lock 快取鍵。下文為可複製對照表與指令。延伸PHP Composer 矩陣Git/npm CI 快取策略Git Submodule/LFS技術部落格首頁購買說明中心免登入

場景與瓶頸

先選邊:同時打 rubygems.orgGitHub/GitLab :git 源,瓶頸多在連線/TLSGit 連線池lock 漂移(未提交 lock、CI 未 --frozen)會讓線上樹與預期脫鉤。共享 RunnerBUNDLE_JOBS 過高易觸發四二九/連線重設。請在 Runbook 寫死「目標還原時間」再回推併發。

並行與連線池參數

BUNDLE_JOBS 為同時 worker 數;頻寬或 NAT 緊時建議四至六BUNDLE_RETRY 建議三至五,並可寫入 bundle install --retry=。共享池同機多 Pipeline 時請下調串列

# CI/遠端 shell(數值依 CPU、頻寬、同機 job 數微調)
export BUNDLE_JOBS=4
export BUNDLE_RETRY=5
export BUNDLE_FROZEN=true
# 弱網 Git 拉取可選(單位:位元組/秒、秒)
export GIT_HTTP_LOW_SPEED_LIMIT=1000
export GIT_HTTP_LOW_SPEED_TIME=600

bundle install --path vendor/bundle --jobs="${BUNDLE_JOBS}" --retry="${BUNDLE_RETRY}" --frozen

跨境鏡像與 Git 源策略

下表為可執行決策矩陣(網域請換核准端點);Git 源請確認 git@https+Token 政策。

鏡像源 × 併發/重試 × 快取鍵 × 流程重試閾值
鏡像/源類型BUNDLE_JOBS/BUNDLE_RETRY 建議vendor/cache 與 CI 快取鍵思路失敗重試閾值(流程級)
直連 rubygems.org_jobs 四、_retry 四;共享 Runner 再降快取路徑含 vendor/bundle;鍵:lock 雜湊RUBY_VERSION最多三次,退避二/四/八秒,總等待約六十秒
區域/企業 RubyGems 鏡像_jobs 可至六;仍觀察四二九同上;另快取 vendor/cache(見 bundle package)同上;第二次失敗改查鏡像健康狀態
GitHub/GitLab :git gem_jobs二至四(Git 連線成本高)鍵須含 lock私有源指紋(避免跨 repo 汙染)Git 逾時單次可拉長;流程重試不超過三次
離線/準離線(vendor/cache)_jobs 一即可;以磁碟 IO 為主鍵:Gemfile.lock 雜湊+package 目錄存在與否缺包直接失敗不重試,改觸發補包流水線
# 將官方索引與下載改走鏡像(URL 請替換)
bundle config set mirror.https://rubygems.org https://gems.example-mirror.local/

# GitHub HTTPS 私有 gem:雙底線主機名變數(Token 放 CI 密文)
export BUNDLE_GITHUB__COM="x-access-token:${GITHUB_TOKEN}"
# GitLab.com 私有 gem 類推(依實際主機名調整雙底線段)
# export BUNDLE_GITLAB__COM="oauth2:${GITLAB_TOKEN}"

# 產生 vendor/cache 供準離線或加速還原
bundle package --all

lockfile 漂移與快取鍵

CI 請用 --frozen--deployment(依版本擇一)避免改 lock。快取鍵須含 lock 雜湊與 Ruby 次版本,以免原生擴充殘留。

Gemfile.lock 一致性驗收(勾選即過關)
  • 主線分支已提交 lock;與目標 Ruby、Bundler 版本區間文件一致。
  • CI 使用 --frozen--deployment;失敗日誌可定位到哪一顆 gem
  • 快取鍵=sha256sum Gemfile.lock 片段+RUBY_VERSIONvendor/bundle 路徑固定。
  • 若用 bundle package,發版分支上 vendor/cache 與 lock同步更新
# 例:以專案相對路徑安裝,便於快取整個 vendor/bundle
export BUNDLE_PATH="$CI_PROJECT_DIR/vendor/bundle"
bundle config set path "$BUNDLE_PATH"

# GitLab CI 快取鍵片段(YAML 思路,請合併至你的設定)
# key: "${CI_COMMIT_REF_SLUG}-ruby-${RUBY_VERSION}-${HASH_OF_GEMFILE_LOCK}"
# paths: [ vendor/bundle/, vendor/cache/ ]

FAQ

bundle install 頻繁逾時或 reset by peer?

BUNDLE_JOBS、升 BUNDLE_RETRY;加鏡像或拉長 Git 逾時;流程三次後改備援或 vendor/cache

GitHub 私有 repo 的 gem 拉不下來?

確認 BUNDLE_GITHUB__COMgit config url.insteadOf 使用有效 Token;企業代理需放行 github.comcodeload.github.com

為何 CI 與本機解析結果不同?

對齊 Ruby 次版本Bundler 版本;清掉混用鏡像的快取目錄;確保同一個 Gemfile.lock 入庫且 CI 下 --frozen

總結與下一步:鏡像/Git 源、BUNDLE_JOBS/BUNDLE_RETRY、lock 與快取鍵綁成一組決策,跨境 Ruby CI 才可控。Apple Silicon 遠端 Mac 常能以較佳出站路徑取代硬撐共享 Runner。若要穩定跑 CI,請至購買頁租用節點;首頁說明中心技術部落格免登入可查。

Bundler CI × 遠端 Mac

租用遠端 Mac,穩定跑 bundle install 與原生擴充編譯

說明中心購買頁首頁 免登入;更多依賴/CI 主題見 技術部落格

多地域可選
SSH 存取
彈性租期
支援管道