一、前言

  • 当执行 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@v1id: bundler-cachewith:path: vendor/bundle # 2key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} # 3restore-keys: |${{ runner.os }}-gems-  # 4# 5- name: Bundle setup run: bundle config path vendor/bundle- name: Bundle installif: steps.bundler-cache.outputs.cache-hit != 'true' # 6run: 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: buildon: [push, pull_request]jobs:run-test:runs-on: macOS-lateststrategy: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@v1with:ruby-version: 2.7bundler-cache: true    - name: Run testsenv: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缓存相关推荐

  1. ruby: 在Ubuntu上安装Ruby, ruby gems

    基本下载 安装: http://www.ruby-lang.org/en/downloads/ ./configure make make test sudo make install 但是在ubun ...

  2. macOS 13.0 Cocoapods安装 (you don‘t have write permissions for the /Library/Ruby/Gems/2.6.0 directory)

    ❓You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory 安装Cocoapods出现文件夹权限问题 尝试 ...

  3. GitHub之深入解析如何创建、维护和管理自己的项目

    一.创建新的版本库 创建一个版本库来分享我们的项目,通过点击面板右侧的"New repository"按钮,或者顶部工具条用户名旁边的 + 按钮来开始我们的旅程,这是 " ...

  4. GitHub之深入解析脚本·自定义与修改GitHub来更好地为特定的工作流程工作

    一.服务与钩子 GitHub 仓库管理中的钩子与服务区块是 GitHub 与外部系统交互最简单的方式. ① 服务 首先来看一下服务,钩子与服务整合都可以在仓库的设置区块中找到,就在我们之前添加协作者与 ...

  5. GitHub之深入解析如何对项目做出贡献

    一.派生项目 如果想要参与某个项目,但是并没有推送权限,这时可以对这个项目进行"派生(Fork)".当"派生"一个项目时,GitHub 会在我们的空间中创建一个 ...

  6. Github PageHelper 原理解析

    任何服务对数据库的日常操作,都离不开增删改查.如果一次查询的纪录很多,那我们必须采用分页的方式.对于一个Springboot项目,访问和查询MySQL数据库,持久化框架可以使用MyBatis,分页工具 ...

  7. dns服务器v6解析 windows_04:缓存DNS、Split分离解析、电子邮件通信、Web服务器项目实战...

    一. 环境的准备 关闭两台虚拟机的SELinux [root@svr7 ~]# setenforce 0 #修改当前运行模式[root@svr7 ~]# getenforce #查看当前运行模式Per ...

  8. DNS解析和DNS缓存, 如何清理DNS解析缓存

    一.DNS解析 DNS解析也即是我们说的域名解析,为了方便记忆,网站都是注册了一个域名,通过域名来访问网站.访问网站内容,实际是通过访问IP地址实现的,所以在域名和IP之前存在一种对应关系,而域名解析 ...

  9. GitHub爬取/解析工具PyDriller

    简介 PyDriller是一个python软件,它可以帮助开发人员轻松提取git的仓库信息,比如commit详细信息,开发人员信息, 修改文件的信息,修改代码的信息以及源码. 官方文档的信息是最详细的 ...

最新文章

  1. 后盾网php多少钱_复合排水网价格多少钱
  2. 转载:Ajax及 GET、POST 区别
  3. 清华大学-刘知远:自然语言理解难在哪儿?
  4. java安全接口调用_步骤3:调用Java接口
  5. java web service_怎样新建一个Java的Web Service
  6. @Autowired与@Resource的区别
  7. android 横向滑动日期_移动端横向滑动如何设计?
  8. python实现数字形式转换
  9. Gitlab创建第一个项目
  10. 【unity】与Android Activity交互并调用JAVA代码传递参数
  11. tg3269c网卡驱动linux,TP-Link3269C网卡驱动官方版
  12. 零基础转行自学前端,怎么学习更系统?
  13. oracle字符串处理substr、dbms_lob.substr、case when
  14. 22.4. IP Address
  15. visa虚拟卡生成器_虚拟银行卡汇总
  16. 汇川AM系列Modbus通信设置
  17. Oracle SQL
  18. chm文件打不开,已取消到该网页的导航
  19. (20210116已解决)Windows下的CTF加载程序是什么?
  20. 简单的MD5加密解密

热门文章

  1. dockerfile 的使用
  2. Nginx的几个常用配置和技巧
  3. canvas实现半圆环形进度条
  4. editActionsForRowAtIndexPath(iOS8) tableview编辑(删除、插入、移动)
  5. Apache 配置域名入口路径
  6. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
  7. 能在微软的网站找到IeWebcontrols的安装文件吗
  8. php 队列取并集,PHP实现对数组简单求交集,差集,并集功能示例
  9. opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度
  10. python opencv 录制视频_OpenCV Python 录制视频