Github之深入解析Ruby Gems缓存
Posted Forever_wj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Github之深入解析Ruby Gems缓存相关的知识,希望对你有一定的参考价值。
一、前言
- 当执行 bundle install 时,需要根据 Gemfile 或者 Gemfile.lock 下载指定的 ruby gems。当在 Github CI 进行构建时,可以把需要下载的 ruby gems 通过使用 Github action 缓存到当前的 CI 服务器,这样当进行构建时,就能更快的加载需要的 gems。
- Github 一共提供了两种 action 完成缓存操作:
-
- actions/cache:最流行的缓存 Ruby gem 方案,仅缓存;
-
- ruby/setup-ruby:可以安装指定版本的 Ruby 并且使用 bundler 缓存 Ruby gem。
二、actions/cache
- actions/cache 将 ruby gems 保存到缓存中并在下一次 CI 构建期间恢复它。如果要指定 Ruby 版本,需要在当前的仓库目录,创建一个 .ruby-version 文件,将依赖的 ruby 版本写入该文件,Kingfisher/.ruby-version:
2.7.0
- 再来看一下 Kingfisher 中的设置:
# 1
- uses: actions/cache@v1
id: bundler-cache
with:
path: vendor/bundle # 2
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} # 3
restore-keys: |
${{ runner.os }}-gems- # 4
# 5
- name: Bundle setup
run: bundle config path vendor/bundle
- name: Bundle install
if: steps.bundler-cache.outputs.cache-hit != 'true' # 6
run: bundle install --jobs 4 --retry
- 对于 actions/cache 的 v1 版本,仅支持单个路径,它必须是一个目录,不能缓存单个文件。使用 actions/cache 的 v2 版本,可以指定单个路径,也可以在单独的行上添加多个路径;
- 输入参数 path 必要,指定缓存或还原的文件路径。路径可以是绝对路径或相对于工作目录的路径,当前是 vendor/bundle;
- 输入参数 key,必要。根据当前的操作系统和 Gemfile.lock 文件哈希的表达式生成缓存 key 作为搜索缓存的键。当操作系统或者 Gemfile.lock 发生改变时,重新生成 key 值;当 key 匹配现有缓存时,被称为缓存命中,并且操作会将缓存的文件还原到 path 目录;
- restore-keys:可选。key 没有发生缓存命中时用于查找缓存的其他密钥顺序列表;
-
- 如果提供 restore-keys,actions/cache 将按顺序搜索与 restore-keys 列表匹配的任何缓存;
-
- 当精确匹配时,操作会将缓存中的文件恢复至设置 path 的目录;
-
- 如果没有精确匹配,操作将会搜索恢复键值的部分匹配。当操作找到部分匹配时,最近的缓存将恢复到设置 path 目录。
- bundle config path vendor/bundle 配置 bundle,将需要的 ruby gems 安装到 vendor/bundle 目录;
- cache-hit 是 actions/cache 的输出参数。获取缓存命中的结果。
-
- 当 key 不匹配现有缓存时,则被称为缓存错过,在 job 成功完成时将创建一个新缓存。
-
- 发生缓存错过时,操作将搜索 restore-keys 设置的替代键值。
- –jobs 4 --retry 3,并行安装 ruby gems,如果当前有网络问题,将尝试 3 次。
三、ruby/setup-ruby
- 如果使用 ruby/setup-ruby 来管理 gem 缓存和 ruby 版本就更加直观和简洁。首先,在 Github 中 fork Kingfisher 到自己的仓库。把 .github/workflows 中的 build.ymal 修改为:
name: build
on: [push, pull_request]
jobs:
run-test:
runs-on: macOS-latest
strategy:
matrix:
destination: [
'macOS',
'ios Simulator,name=iPhone 8',
'tvOS Simulator,name=Apple TV',
'watchOS Simulator,name=Apple Watch Series 5 - 40mm'
]
swift-version: [5.0]
steps:
- uses: actions/checkout@v1
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
bundler-cache: true
- name: Run tests
env:
DESTINATION: platform=${{ matrix.destination }}
SWIFT_VERSION: ${{ matrix.swift-version }}
run: bundle exec fastlane test_ci
- 接下来,将修改的代码 push 到自己的仓库中,此时已经触发 Github CI 服务器,开始执行 workflow:
- 一共有四个任务,分别对应着,配置在构建矩阵中的参数:
- 实际执行的命令信息:
- 可以看到,仅仅需要设置 bundler-cache: true,同时不再需要文件去指定 ruby 版本,相对来说就可以避免手动设置缓存时带来的问题。
以上是关于Github之深入解析Ruby Gems缓存的主要内容,如果未能解决你的问题,请参考以下文章
Android源代码解析之-->LruCache缓存类
iOS之深入解析CocoaPods的插件机制和如何加载插件整合开发工具