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
相关产品推荐
相关产品推荐

