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 版本,相对来说就可以避免手动设置缓存时带来的问题。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值