You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions多Job依赖缓存失效:Fastlane缺失Gem包问题

解决GitHub Actions中Bundler缓存恢复成功但Gem缺失的问题

1. 确认Bundler缓存路径与Key的正确性

不同Ruby版本、Bundler版本会生成不同的缓存结构,必须确保缓存路径和Key的唯一性匹配:

  • 检查Bundler实际安装路径:在缓存前执行bundle config path命令,确认路径(通常为vendor/bundle),并将该路径配置到缓存的path字段中。
  • 优化缓存Key,加入足够的唯一标识,避免不同环境缓存冲突:
    - name: Cache Bundler gems
      uses: actions/cache@v3
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}-${{ steps.setup-ruby.outputs.ruby-version }}-${{ steps.setup-bundler.outputs.bundler-version }}
        restore-keys: |
          ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}-
          ${{ runner.os }}-gems-
    

2. 修复缓存恢复后的权限问题

缓存恢复可能导致Gem可执行文件权限丢失,在缓存恢复后添加权限修复步骤:

chmod -R +x vendor/bundle/ruby/*/bin/

或者在执行bundle exec前先做合法性校验,校验失败则重新安装:

bundle check || bundle install --path vendor/bundle --jobs 4 --retry 3

3. 确保Gemfile.lock的一致性

  • 必须将Gemfile.lock提交到Git仓库,每次修改Gemfile后都要本地执行bundle install更新Gemfile.lock并推送。
  • 多Job场景下,所有Job必须使用相同版本的Gemfile.lock,避免因文件哈希值变化导致缓存不匹配。

4. 固定Bundler版本

不同Bundler版本的缓存结构不兼容,需在工作流中固定Bundler版本:

- name: Setup Ruby and Bundler
  uses: ruby/setup-ruby@v1
  with:
    ruby-version: '3.2'
    bundler-version: '2.4.10'
    bundler-cache: false # 禁用内置缓存,使用自定义缓存逻辑

5. 验证缓存实际内容

若缓存日志显示成功但仍报错,可添加步骤查看缓存目录内容,确认缓存是否包含所需Gem:

ls -la vendor/bundle/ruby/*/gems/

如果目录为空或缺少指定Gem,说明缓存生成阶段存在问题,需检查缓存前是否正确执行了bundle install。

6. 多Job共享缓存的注意事项

  • 所有共享缓存的Job必须使用相同的工作目录和缓存路径。
  • 禁止在不同Job中修改Gemfile或Gemfile.lock,否则会导致缓存Key变化,后续Job无法读取正确缓存。

内容的提问来源于stack exchange,提问作者Eugene.IOS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:12:07